37
SPRING DATA JPA APRESENTADO POR IVAN QUEIROZ

Spring Data Jpa

Embed Size (px)

Citation preview

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

Quando UsarVantagens e desvantagens

EncerrandoUm longo caminho pela frente

0506

Spring FrameworkAlta produtividade em aplicações Java

Spring DataSimplificando o acesso aos dados

Spring Data JPADiminuindo o trabalho repetitivo

Tópicos AvançadosAuditoria, Specifications e QueryDSL

01020304

3

4

SPRING FRAMEWORKAlta produtividade em aplicações

5

O QUE É ?Framework open source em Java

criado por Rod Johnson que utiliza os

conceitos de inversão de controle

(Inversion of Control - IoC) e injeção de

dependência (Dependency Injection -

DI) 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.

6

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

7

SPRING DATASimplificando o acesso a dados

8

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.

9

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.

10

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.

11

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);

}

12

SPRING DATA JPAJPA

Diminuindo o trabalho repetitivo

13

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;

}

...

14

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();

}

}

15

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> {}

16

@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

17

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

18

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"/>

19

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

... ... ...

20

CREATEAcessando propriedades

transversais

Pessoa que tem um Endereco que tem um Cep

List<Pessoa> findByEnderecoCep(Cep cep);

Definindo manualmento o ponto de transversão

List<Pessoa> findByEndereco_Cep(Cep cep);

21

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

22

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);

23

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);

24

TÓPICOS AVANÇADOSAuditoria, Specifications e QueryDSL

25

AuditoriaNo Spring Data o suporte a

auditoria é bem sofisticado

permitindo o registro de

alterações das entidade e em qual

momento elas ocorreram.

Por anotações

@CreatedBy, @LastModifiedBy, @CreatedDate e

@LastModifiedDate

class Customer {

@CreatedBy

private User user;

@CreatedDate

private DateTime createdDate;

// outras propriedades

}

Pode-se aplicar as anotações somente nos dados que se

deseja capturar.

Por interface

É fornecida a interface Auditable, que expõe os setters

necessários para auditoria.

26

AuditoriaPara o JPA é disponibilizado um

listener para as entidades.

AuditingEntityListener

@Entity

@EntityListeners(AuditingEntityListener.class)

public class MyEntity {

}

Após configurar o listener pode-se utilizar as anotações

ou interfaces de auditoria.

27

SpecificationsO Spring Data JPA fornece classes para

aplicar o padrão Specification, o qual

melhora a utilização da Api Criteria do

JPA.

public final class PessoaSpecification {

public static Specification<Pessoa> byNome(String name) {

return new Specification<Pessoa>() {

@Override

public Predicate toPredicate(Root<Pessoa> root,

CriteriaQuery<?> query, CriteriaBuilder builder) {

return builder.like(root.<String>get("nome"),

String.format("%s%", name.trim()));

}

};

}

...

}

Exemplo de Classe Utilitária

@Repository

public interface PessoaRepository extends JpaRepository<Pessoa, Long>,

JpaSpecificationExecutor<Pessoa> {

}

Repository

28

Specifications

@RestController

@RequestMapping(value="/")

public class PessoaController {

@Autowired

private PessoaRepository repository;

@RequestMapping(method = RequestMethod.GET, value="/{nome}")

public List<Pessoa> listByNome(@PathVariable String nome) {

Specification<Pessoa> peloNome =

PessoaSpecification.byNome(nome);

return Lists.newArrayList(repository.findAll(peloNome));

}

...

}

Utilizando o repositório com a specification:

O Spring ainda fornece a classe Specifications para facilitar a utilização de muitos predicados.

29

QueryDSLA API fluente desse framework pode

ser utilizado para realizar consultas

nos repositórios do Spring Data

Interface QueryDslPredicateExecutor

A integração com a QueryDSL é realizada através dessa interface.

public interface QueryDslPredicateExecutor<T> {

T findOne(Predicate predicate);

Iterable<T> findAll(Predicate predicate);

long count(Predicate predicate);

boolean exists(Predicate predicate);

// … mais declarações omitidas

}

Para utilizar a integração basta apenas estender a

QueryDslPredicateExecutor na sua interface repositório.

interface PessoaRepository extends CrudRepository<Pessoa, Long>,

QueryDslPredicateExecutor<Pessoa> {}

30

QueryDSL

Após habilitar o suporte, os métodos do repositório já podem receber as consultas do tipo QueryDSL.

Predicate predicate =

pessoa.primeiroNome.equalsIgnoreCase("Thomas")

.and(user.ultimoNome.startsWithIgnoreCase("Anderson"));

userRepository.findAll(predicate);

31

QUANDO USARVantagens e desvantagens

32

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.

33

DESVANTAGENS

Nomes dos métodos dos repositórios

podem se tornar grandes em longas ou

complicadas consultas.

SQL nativo pode ser mais eficiente.

34

ENCERRANDOUm longo caminho pela frente

36

DÚVIDAS?

37

[email protected]

@ivanqueiroz@javabahia