spring data jpa

Post on 12-Apr-2017

260 Views

Category:

Software

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

SPRING DATA JPAAPRESENTADO POR IVAN QUEIROZ

QUEM?

Bacharel em Sistemas de Informação

Desenvolvedor Java

CertificaçãoSCJP 5 (OCJP)

Empresa de Telecomunicações

Blogblog.ivanqueiroz.com

2

Atualmente Área Jurídica

AGENDA

Alguns ConceitosFramework, IoC e DI

Java Persistence APIEnxergando o banco através de objetos

Spring FrameworkAlta produtividade em aplicações Java

Spring DataSimplificando o acesso aos dados

01020304

3

Spring Data JPADiminuindo o trabalho repetitivo05

0607

Quando UsarVantagens e desvantagens

EncerrandoUm longo caminho pela frente

4

Alguns ConceitosFramework, IoC e DI

5

FRAMEWORK CÓDIGO BIBLIOTECA

FRAMEWORKFacilita a construção do software por deixar que o desenvolvedor se preocupe com o que realmente

importa

6

INVERSÃO DE CONTROLE

Ou Inversion of Control (IoC) é um padrão onde

as chamadas das ações da aplicação não são

determinados pelo desenvolvedor e o controle

é “invertido” para uma infraestrutura de

software.

Também chamado carinhosamente de “Princípio de Hollywood”

(don’t call us, we’ll call you).

7

INJEÇÃO DE DEPENDÊNCIAA dependência entre os módulos é controlada

por uma infraestrutura de software responsável

por “injetar” a mesma quando necessária.

@Controllerpublic class TarefasController { private final JdbcTarefaDao dao; @Autowired public TarefasController(JdbcTarefaDao dao) { this.dao = dao; } @RequestMapping(“adicionaTarefa”) public void adiciona(Tarefa tarefa) { dao.adiciona(tarefa); // ... }}

8

JAVA PERSISTENCE APIEnxergando o banco através de objetos

9

ORM (Object Relational Mapper)Técnica para relacionar

o objeto com o dado

que ele representa no

banco de dados.

Objetos

Cam

ada

de

Map

eam

en

to

OR

M

Banco de Dados

10

JPAEspecificação java

padrão (JSR-338) de

como os frameworks

ORM devem ser

comportar

@Classe Java Anotações

@Entity@Table

@Id

Entidade

EntityManagerFactory

EntityManager

Dialeto do Banco

Banco de Dados

Java Persistence Query Language

11

Exemplo

Tarefa tarefa = new Tarefa();tarefa.setDescricao("Estudar JPA");tarefa.setFinalizado(true);tarefa.setDataFinalizacao(Calendar.getInstance());

EntityManagerFactory factory = Persistence.createEntityManagerFactory("tarefas");EntityManager manager = factory.createEntityManager();manager.getTransaction().begin(); manager.persist(tarefa);manager.getTransaction().commit(); System.out.println("ID da tarefa: " + tarefa.getId());manager.close();

@Entitypublic class Tarefa { @Id @GeneratedValue private Long id; @Temporal(TemporalType.DATE) private Calendar dataFinalizacao;}

Query query = manager .createQuery("select t from Tarefa as t "+ "where t.finalizado = :paramFinalizado");query.setParameter("paramFinalizado", false);

List<Tarefa> lista = query.getResultList();

12

SPRING FRAMEWORKAlta produtividade em aplicações

13

O QUE É ?Framework open source em Java

criado por Rod Johnson que utiliza os

conceitos de inversão de controle e

injeção de dependência para simplificar

o desenvolvimento de aplicações

utilizando Plain Old Java Objects

(POJOs) e interfaces.

CONTAINER SPRINGNo núcleo do Spring está um container que injeta (DI) e

gerencia o ciclo de vida das dependências (IoC).

CONFIGURAÇÃO FLEXÍVELO Spring permite que as configurações sejam por

anotações, xml, convenção ou programaticamente.

NÃO INTRUSIVOA construção do Spring foi realizada para que a lógica

de domínio geralmente não tenha dependências do

framework.

VÁRIOS MÓDULOS DISPONÍVEISAlém de ser compatível com o JEE o Spring possui

diversos módulos para suprir as mais diversas

necessidades.

14

COMO OBTER INFORMAÇÕES?No endereço spring.io/projects pode-se

encontrar de forma organizada, todas as

informaçoes necessárias para configurar e

iniciar a construção de uma aplicação

utilizando os módulos do Spring

15

SPRING DATASimplificando o acesso a dados

16

SPRING DATA

SPRING DATA MONGODB

MongoRepository

MongoTemplate

SPRING DATA JPA

JpaRepository

SPRING DATA NEO4J

GraphRepository

Neo4jTemplate

SPRING DATA...

Embedded REST

JPA

JDBC

RDBMS

Mongo Java Driver

MongoDB Neo4J ...

SIMPLIFICARO projeto Spring Data tem como objetivo

simplificar as operações de acesso a

dados nas aplicações, diminuindo o

código escrito e mantendo a integração

com todo ambiente Spring já existente.

17

MODELO DE PROGRAMAÇÃO DO SPRING DATA

02REPOSITORY

Abstração principal do

modelo Spring Data,

gerencia a classe de

domínio e define as

operações de acesso

aos dados.

03QUERY METHODS

Métodos de consulta que

possuem uma convenção de

nome o qual o Spring Data

fornece uma

implementação em tempo

de execução.

01INTERFACES

A maior parte das

implementações são

realizadas pelo Spring Data,

o desenvolvedor irá se

ocupar mais com as

definições de interfaces.

04TEMPLATES

O Spring Data fornece vários

templates (modelos) para

cuidar da alocação de

recursos e tradução de

exceções.

18

PRINCIPAIS

INTERFACES

public interface CrudRepository<T,ID extends Serializable> extends Repository {

<S extends T> S save(S entity);

T findOne(ID primaryKey);

Iterable<T> findAll();

Long count();

void delete(T entity);

boolean exists(ID primaryKey);

}

REPOSITORYInterface central da abstração do Spring Data. É uma interface de marcação para o spring poder obter

os tipos que irá trabalhar e para ajudar o desenvolvedor a descobrir outras interfaces.

public interface Repository<T,ID extends Serializable> {}

CRUD REPOSITORYInterface que provê os métodos para as operações de Create Read Update e Delete (CRUD). Estende

a interface Repository e assim como a interface pai ela recebe o tipo da entidade e o tipo do campo

id da entidade.

19

PRINCIPAIS

INTERFACES

PAGING AND SORTING REPOSITORYExtendendo a CrudRepository existe a PagingAndSortingRepository que adiciona métodos para

efetuar facilmente as operações de paginação.

public interface PagingAndSortingRepository<T,ID extends Serializable> extends

CrudRepository<T, ID> {

Iterable<T> findAll(Sort sort);

Page<T> findAll(Pageable pageable);

}

20

SPRING DATA JPAJPA

Diminuindo o trabalho repetitivo

21

DAO SIMPLESUtilizando a abordagem tradicional do

DAO.

MODEL

public class Pessoa {

private String rg;

private String nome;

private int idade;

private String estado;

private String cidade;

//Get e Sets

}

DAO

public class DaoPessoa {

private Connection con;

private Statement comando;

public List<Pessoa> buscarTodos() {

List<Pessoa> resultados = new ArrayList<Pessoa>();

ResultSet rs;

try {

rs = comando.executeQuery("SELECT * FROM pessoa");

while (rs.next()) {

Pessoa temp = new Pessoa();

temp.setRg(rs.getString("rg"));

temp.setNome(rs.getString("nome"));

temp.setIdade(rs.getInt("idade"));

temp.setCidade(rs.getString("cidade"));

temp.setEstado(rs.getString("estado"));

resultados.add(temp);

}

return resultados;

}

...

22

REPOSITORYJPAUm DAO dentro do estilo de

programação do Spring (repository).

ENTITY

@Entity

public class Pessoa implements Serializable {

private static final long serialVersionUID = 1 L;

@Id private Long id;

private String nome;

@Temporal(TemporalType.DATE)

@Column(name = "dataNasc")

private Date dataNascimento;

private String email;

//Gets e Sets

}

REPOSITORY

@Repository

public class PessoaRepository {

@PersistenceContext EntityManager em;

public List <Pessoa> findAll() {

TypedQuery <Pessoa> q =

getEntityManger().createNamedQuery("SELECT p FROM

pessoa p", Pessoa.class);

return q.getResultList();

}

}

23

SPRINGDATA JPAAo criar uma interface que estende a

interface JpaRepository, o próprio

Spring Data se encarrega de

implementar os métodos.

ENTITY

@Entity

public class Pessoa implements Serializable {

private static final long serialVersionUID = 1 L;

@Id

private Long id;

private String nome;

@Temporal(TemporalType.DATE)

@Column(name = "dataNasc")

private Date dataNascimento;

private String email;

//Gets e Sets

}

REPOSITORYpublic interface PessoaRepository extends

JpaRepository <Pessoa, Long> {}

24

@NoRepositoryBean

interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID> {

T findOne(ID id);

T save(T entity);

}

interface PessoaRepository extends BaseRepository<User, Long> {

User findByEmail(Email email);

}

REPOSITORY CUSTOMIZADO

É possível personalizar os repositórios criando novos métodos

25

QUERY METHODSSão métodos de busca declarados

na interface do repositório que são

examinados e interpretados pela

infraestrutura do Spring Data para

gerar as consultas.

public interface PersonRepository extends Repository<User, Long> {

List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

}

select u from User u where u.emailAddress = ?1 and u.lastname = ?2

26

QUERY LOOKUPSÉ como o Spring Data realiza a

busca das queries. Atualmente

existem três formas.

CREATE

01USE_DECLARED_QUERY

02CREATE_IF_NOT_FOUND

03

<repositories query-lookup-strategy="use-declared-query"/>

27

CREATEQuebra os query methods pelo

prefixo e o nome das propriedades

Keyword Sample JPQL snippet

And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2

Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2

Is,Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals

… where x.firstname = ?1

Between findByStartDateBetween … where x.startDate between ?1 and ?2

... ... ...

28

CREATEAcessando propriedades

transversais

Pessoa que tem um Endereco que tem um Cep

List<Pessoa> findByEnderecoCep(Cep cep);

Definindo manualmente o ponto de transversão

List<Pessoa> findByEndereco_Cep(Cep cep);

29

XML CLASSE JAVA

<named-query name="User.findByLastname">

<query>select u from User u where u.lastname =

?1</query>

</named-query>

@Entity

@NamedQuery(name = "User.findByEmailAddress",

query = "select u from User u where u.emailAddress = ?1")

public class User {

}

REPOSITORY

public interface UserRepository extends JpaRepository<User, Long> {

List<User> findByLastname(String lastname);

User findByEmailAddress(String emailAddress);

}

USE_DECLARED_QUERYUtiliza apenas queries declaradas

30

USE_DECLARED_QUERYUtiliza apenas queries declaradas

@Query - Anotação

@Modifying

@Query("update User u set u.firstname = ?1 where u.lastname = ?2")

int setFixedFirstnameFor(String firstname, String lastname);

@Query("select u from User u where u.firstname like %?1")

List<User> findByFirstnameEndsWith(String firstname);

@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)

User findByEmailAddress(String emailAddress);

@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",countQuery = "SELECT count(*) FROM USERS

WHERE LASTNAME = ?1",nativeQuery = true)

Page<User> findByLastname(String lastname, Pageable pageable);

@Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")

User findByLastnameOrFirstname(@Param("lastname") String lastname,Param("firstname") String

firstname);

31

LIMITANDO RESULTADOS

User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable

pageable);

Slice<User> findTop3ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable);

32

QUANDO USARVantagens e desvantagens

33

VANTAGENS

Suporte a paginação, execução dinâmica

de consultas e possibilidade de utilizar

código customizado para acessar a base de

dados.

Sofisticado suporte para criação de

repositórios que diminui muito código

repetitivo.

As consultas JPQL são compiladas na

inicialização do contexto Spring, facilitando

a detecção de erros de sintaxe.

Suporte a QueryDSL e auditoria de classes

de domínio.

34

DESVANTAGENS

Nomes dos métodos dos repositórios

podem se tornar grandes em longas ou

complicadas consultas.

SQL nativo pode ser mais eficiente.

35

ENCERRANDOUm longo caminho pela frente

36

FONTES

SITES● InfoQ - https://www.infoq.com/br/articles/spring-data-intro

Artigo - Spring Data: A solução mais geral para persistência?

Acessado em 09/2016

● Spring Data JPA reference -

http://docs.spring.io/spring-data/jpa/docs/1.10.3.RELEASE/reference/html/

Acessado em 09/2016

● Spring Framework reference -

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle

/

Acessado em 09/2016

● Uma introdução prática ao JPA com Hibernate -

https://www.caelum.com.br/apostila-java-web/uma-introducao-pratica-ao-jpa-co

m-hibernate/

Acessado em 09/2016

37

DÚVIDAS?

38

OBRIGADO!ivanqueiroz@gmail.com

@ivanqueiroz@javabahia

top related