Spring Data Jpa

Ivan Queiroz
Ivan QueirozEngenheiro de Software em Indra
SPRING DATA JPAAPRESENTADO POR IVAN QUEIROZ
QUEM?
Bacharel em
Sistemas de
Informação
Desenvolvedor
Java
Certificação
SCJP 5
(OCJP)
Empresa de
Telecomunicações
Blog
blog.ivanqueiroz.com
2
Atualmente
Área Jurídica
AGENDA
Quando Usar
Vantagens e desvantagens
Encerrando
Um longo caminho pela frente
05
06
Spring Framework
Alta produtividade em aplicações
Java
Spring Data
Simplificando o acesso aos dados
Spring Data JPA
Diminuindo o trabalho repetitivo
Tópicos Avançados
Auditoria, Specifications e
QueryDSL
01
02
03
04
3
4
SPRING
FRAMEWORK
Alta 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 SPRING
No núcleo do Spring está um container que injeta (DI) e
gerencia o ciclo de vida das dependências (IoC).
CONFIGURAÇÃO FLEXÍVEL
O Spring permite que as configurações sejam por
anotações, xml, convenção ou programaticamente.
NÃO INTRUSIVO
A 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ÍVEIS
Alé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 DATA
Simplificando 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 ...
SIMPLIFICAR
O 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);
}
REPOSITORY
Interface 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 REPOSITORY
Interface 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 REPOSITORY
Extendendo 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
SIMPLES
Utilizando 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
REPOSITORY
JPA
Um 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
SPRING
DATA
JPA
Ao 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
}
REPOSITORY
public 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
METHODS
Sã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
01
USE_DECLARED_QUERY
02
CREATE_IF_NOT_FOUND
03
<repositories query-lookup-strategy="use-declared-query"/>
19
CREATE
Quebra 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,f
indByFirstnameEquals
… where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and
?2
... ... ...
20
CREATE
Acessando 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_QUERY
Utiliza apenas queries declaradas
22
USE_DECLARED_QUERY
Utiliza 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ÇADOS
Auditoria, Specifications e QueryDSL
25
Auditoria
No 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
Auditoria
Para 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
Specifications
O 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
QueryDSL
A 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 USAR
Vantagens 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
ENCERRANDO
Um longo caminho pela frente
35
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
36
DÚVIDAS?
37
OBRIGADO!
ivanqueiroz@gmail.com
@ivanqueiroz
@javabahia
1 de 37

Recomendados

Spring Data Jpa por
Spring Data JpaSpring Data Jpa
Spring Data JpaIvan Queiroz
926 visualizações38 slides
Course Hibernate 2008 por
Course Hibernate 2008Course Hibernate 2008
Course Hibernate 2008Milfont Consulting
1.2K visualizações39 slides
Introdução a JPA e Hibernate - TDC 2012 por
Introdução a JPA e Hibernate - TDC 2012Introdução a JPA e Hibernate - TDC 2012
Introdução a JPA e Hibernate - TDC 2012Frederico Maia Arantes
1.8K visualizações35 slides
Java 14 por
Java 14Java 14
Java 14Denis L Presciliano
921 visualizações53 slides
Persistência Java: Hibernate e JPA por
Persistência Java: Hibernate e JPAPersistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPACaelum
8.3K visualizações47 slides
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0 por
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Elvis Rocha
3.1K visualizações86 slides

Mais conteúdo relacionado

Mais procurados

Fundamentos de JDBC por
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBCDenis L Presciliano
655 visualizações24 slides
Persistência com JPA usando o NetBeans 7 por
Persistência com JPA usando o NetBeans 7Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7Claudio Martins
29.4K visualizações56 slides
Hibernate-consultas por
Hibernate-consultasHibernate-consultas
Hibernate-consultasNécio de Lima Veras
2.4K visualizações19 slides
J530 3 jndi por
J530 3 jndiJ530 3 jndi
J530 3 jndiDenis L Presciliano
531 visualizações25 slides
Processos iniciais do mapeamento OR por
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento ORNécio de Lima Veras
954 visualizações23 slides
Introdução a JPA (2010) por
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)Helder da Rocha
1K visualizações93 slides

Mais procurados(20)

Persistência com JPA usando o NetBeans 7 por Claudio Martins
Persistência com JPA usando o NetBeans 7Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7
Claudio Martins29.4K visualizações
Processos iniciais do mapeamento OR por Nécio de Lima Veras
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento OR
Nécio de Lima Veras954 visualizações
Introdução a JPA (2010) por Helder da Rocha
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
Helder da Rocha1K visualizações
Introdução ao JPA com Hibernate por Danilo Braga
Introdução ao JPA com HibernateIntrodução ao JPA com Hibernate
Introdução ao JPA com Hibernate
Danilo Braga839 visualizações
Desenvolvimento de apps e games para android parte 8 por Erisvaldo Junior
Desenvolvimento de apps e games para android   parte 8Desenvolvimento de apps e games para android   parte 8
Desenvolvimento de apps e games para android parte 8
Erisvaldo Junior1.8K visualizações
xDocLet - Geração de código com xdoclet por Denis L Presciliano
xDocLet - Geração de código com xdocletxDocLet - Geração de código com xdoclet
xDocLet - Geração de código com xdoclet
Denis L Presciliano479 visualizações
Desenvolvimento de Apps e Games para Android - Parte 5 por Erisvaldo Junior
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5
Erisvaldo Junior2.1K visualizações
JPA com Hibernate por Rafael Carneiro
JPA com HibernateJPA com Hibernate
JPA com Hibernate
Rafael Carneiro4.5K visualizações
Anotações do mapeamento OR por Nécio de Lima Veras
Anotações do mapeamento ORAnotações do mapeamento OR
Anotações do mapeamento OR
Nécio de Lima Veras726 visualizações
Mini curso hibernate com anotações por dieguinhomcz
Mini curso hibernate com anotaçõesMini curso hibernate com anotações
Mini curso hibernate com anotações
dieguinhomcz3.2K visualizações
Relacionamentos do mapeamento OR por Nécio de Lima Veras
Relacionamentos do mapeamento ORRelacionamentos do mapeamento OR
Relacionamentos do mapeamento OR
Nécio de Lima Veras1.6K visualizações
Desenvolvimento de Apps e Games para Android - Parte 4 por Erisvaldo Junior
Desenvolvimento de Apps e Games para Android - Parte 4Desenvolvimento de Apps e Games para Android - Parte 4
Desenvolvimento de Apps e Games para Android - Parte 4
Erisvaldo Junior2K visualizações
Fundamentos de Objetos Remotos por Denis L Presciliano
Fundamentos de Objetos RemotosFundamentos de Objetos Remotos
Fundamentos de Objetos Remotos
Denis L Presciliano770 visualizações
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE por Loiane Groner
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Loiane Groner1K visualizações
Semana 9: toString, classes, instâncias e objectos, Scanner por Manuel Menezes de Sequeira
Semana  9: toString, classes, instâncias e objectos, ScannerSemana  9: toString, classes, instâncias e objectos, Scanner
Semana 9: toString, classes, instâncias e objectos, Scanner
Manuel Menezes de Sequeira554 visualizações

Destaque

Spring + JPA + DAO Step by Step por
Spring + JPA + DAO Step by StepSpring + JPA + DAO Step by Step
Spring + JPA + DAO Step by StepGuo Albert
10.8K visualizações23 slides
Spring data jpa por
Spring data jpaSpring data jpa
Spring data jpaJeevesh Pandey
4.1K visualizações32 slides
Easy data-with-spring-data-jpa por
Easy data-with-spring-data-jpaEasy data-with-spring-data-jpa
Easy data-with-spring-data-jpaStaples
3.5K visualizações26 slides
Java User Group - O que é e como eu faço para participar? por
Java User Group - O que é e como eu faço para participar?Java User Group - O que é e como eu faço para participar?
Java User Group - O que é e como eu faço para participar?jeffersonmoreirati
271 visualizações6 slides
Jpa de a à z por que conhecer jpa por
Jpa de a à z  por que conhecer jpa Jpa de a à z  por que conhecer jpa
Jpa de a à z por que conhecer jpa Antonio Lazaro Carvalho Borges
330 visualizações32 slides
Palestra Carreira Java Bahia Meeting por
Palestra Carreira Java Bahia MeetingPalestra Carreira Java Bahia Meeting
Palestra Carreira Java Bahia MeetingAntonio Lazaro Carvalho Borges
614 visualizações25 slides

Destaque(20)

Spring + JPA + DAO Step by Step por Guo Albert
Spring + JPA + DAO Step by StepSpring + JPA + DAO Step by Step
Spring + JPA + DAO Step by Step
Guo Albert10.8K visualizações
Spring data jpa por Jeevesh Pandey
Spring data jpaSpring data jpa
Spring data jpa
Jeevesh Pandey4.1K visualizações
Easy data-with-spring-data-jpa por Staples
Easy data-with-spring-data-jpaEasy data-with-spring-data-jpa
Easy data-with-spring-data-jpa
Staples3.5K visualizações
Java User Group - O que é e como eu faço para participar? por jeffersonmoreirati
Java User Group - O que é e como eu faço para participar?Java User Group - O que é e como eu faço para participar?
Java User Group - O que é e como eu faço para participar?
jeffersonmoreirati271 visualizações
Migrations for Java (Javou #4 - JavaCE) por Rafael Ponte
Migrations for Java (Javou #4 - JavaCE)Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)
Rafael Ponte1.5K visualizações
Spring Data - Intro (Odessa Java TechTalks) por Igor Anishchenko
Spring Data - Intro (Odessa Java TechTalks)Spring Data - Intro (Odessa Java TechTalks)
Spring Data - Intro (Odessa Java TechTalks)
Igor Anishchenko2.3K visualizações
Java persistence api por Luis Goldster
Java persistence api Java persistence api
Java persistence api
Luis Goldster666 visualizações
Gradle - Build System por Jeevesh Pandey
Gradle - Build SystemGradle - Build System
Gradle - Build System
Jeevesh Pandey386 visualizações
Spring Data JPA por Cheng Ta Yeh
Spring Data JPASpring Data JPA
Spring Data JPA
Cheng Ta Yeh7.9K visualizações
JDBC - JPA - Spring Data por Arturs Drozdovs
JDBC - JPA - Spring DataJDBC - JPA - Spring Data
JDBC - JPA - Spring Data
Arturs Drozdovs2.7K visualizações
Spring.Boot up your development por Strannik_2013
Spring.Boot up your developmentSpring.Boot up your development
Spring.Boot up your development
Strannik_2013825 visualizações
Java Persistence API (JPA) - A Brief Overview por Craig Dickson
Java Persistence API (JPA) - A Brief OverviewJava Persistence API (JPA) - A Brief Overview
Java Persistence API (JPA) - A Brief Overview
Craig Dickson3.8K visualizações
Java Persistence API (JPA) Step By Step por Guo Albert
Java Persistence API (JPA) Step By StepJava Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By Step
Guo Albert29.4K visualizações
NoSQL - Por que e quando usar? por Nico Steppat
NoSQL - Por que e quando usar?NoSQL - Por que e quando usar?
NoSQL - Por que e quando usar?
Nico Steppat7.5K visualizações
Spring Data in 10 minutes por Corneil du Plessis
Spring Data in 10 minutesSpring Data in 10 minutes
Spring Data in 10 minutes
Corneil du Plessis3.1K visualizações
Gaelyk: Desenvolvimento Ágil em Groovy nas Nuvens da Google por Serge Rehem
Gaelyk: Desenvolvimento Ágil em Groovy nas Nuvens da GoogleGaelyk: Desenvolvimento Ágil em Groovy nas Nuvens da Google
Gaelyk: Desenvolvimento Ágil em Groovy nas Nuvens da Google
Serge Rehem815 visualizações

Similar a Spring Data Jpa

Spring Data Neo4j por
Spring Data Neo4jSpring Data Neo4j
Spring Data Neo4jIvan Queiroz
164 visualizações38 slides
Ecosistema spring a_plataforma_enterprise_jav por
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
1.2K visualizações37 slides
Spring framework 2.5 por
Spring framework 2.5Spring framework 2.5
Spring framework 2.5Diego Pacheco
1.3K visualizações37 slides
Odi tutorial configuração repositórios mestre e trabalho por
Odi tutorial   configuração repositórios mestre e trabalhoOdi tutorial   configuração repositórios mestre e trabalho
Odi tutorial configuração repositórios mestre e trabalhoCaio Lima
4.9K visualizações13 slides
Apostilava Java EE 5 - 2007 por
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
2.4K visualizações398 slides
Workshop Elasticsearch - Android Dev Conference 2016 por
Workshop Elasticsearch - Android Dev Conference 2016Workshop Elasticsearch - Android Dev Conference 2016
Workshop Elasticsearch - Android Dev Conference 2016Thiago Barradas
13.7K visualizações48 slides

Similar a Spring Data Jpa(20)

Spring Data Neo4j por Ivan Queiroz
Spring Data Neo4jSpring Data Neo4j
Spring Data Neo4j
Ivan Queiroz164 visualizações
Ecosistema spring a_plataforma_enterprise_jav por Julio Viegas
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
Julio Viegas1.2K visualizações
Spring framework 2.5 por Diego Pacheco
Spring framework 2.5Spring framework 2.5
Spring framework 2.5
Diego Pacheco1.3K visualizações
Odi tutorial configuração repositórios mestre e trabalho por Caio Lima
Odi tutorial   configuração repositórios mestre e trabalhoOdi tutorial   configuração repositórios mestre e trabalho
Odi tutorial configuração repositórios mestre e trabalho
Caio Lima4.9K visualizações
Apostilava Java EE 5 - 2007 por Rafael Benevides
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
Rafael Benevides2.4K visualizações
Workshop Elasticsearch - Android Dev Conference 2016 por Thiago Barradas
Workshop Elasticsearch - Android Dev Conference 2016Workshop Elasticsearch - Android Dev Conference 2016
Workshop Elasticsearch - Android Dev Conference 2016
Thiago Barradas13.7K visualizações
Apostila: Curso de java III por Verônica Veiga
Apostila: Curso de java IIIApostila: Curso de java III
Apostila: Curso de java III
Verônica Veiga483 visualizações
VRaptor - Alta produtividade no Desenvolvimento Web em Java por Daniel Faria Gomes
VRaptor - Alta produtividade no Desenvolvimento Web em JavaVRaptor - Alta produtividade no Desenvolvimento Web em Java
VRaptor - Alta produtividade no Desenvolvimento Web em Java
Daniel Faria Gomes1.3K visualizações
TDC 2014 SP - E o DeltaSpike ? por Rafael Benevides
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
Rafael Benevides1.2K visualizações
CDI Extensions e DeltaSpike por Rafael Benevides
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
Rafael Benevides1.3K visualizações
Curso Java Básico - Aula 03 por Natanael Fonseca
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03
Natanael Fonseca845 visualizações
55 New Things in Java 7 - Brazil por Stephen Chin
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil
Stephen Chin2.3K visualizações
Como conectar programas em linguagem java a bases de dados por Henrique Fernandes
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
Henrique Fernandes230 visualizações
better faster stronger dagger por tdc-globalcode
better faster stronger daggerbetter faster stronger dagger
better faster stronger dagger
tdc-globalcode412 visualizações
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015 por Rogério Moraes de Carvalho
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Rogério Moraes de Carvalho2.8K visualizações
JDBC por Ramon Lopes
JDBCJDBC
JDBC
Ramon Lopes1.4K visualizações
Spring & Struts por eduan
Spring & StrutsSpring & Struts
Spring & Struts
eduan1.8K visualizações

Spring Data Jpa

  • 1. SPRING DATA JPAAPRESENTADO POR IVAN QUEIROZ
  • 2. QUEM? Bacharel em Sistemas de Informação Desenvolvedor Java Certificação SCJP 5 (OCJP) Empresa de Telecomunicações Blog blog.ivanqueiroz.com 2 Atualmente Área Jurídica
  • 3. AGENDA Quando Usar Vantagens e desvantagens Encerrando Um longo caminho pela frente 05 06 Spring Framework Alta produtividade em aplicações Java Spring Data Simplificando o acesso aos dados Spring Data JPA Diminuindo o trabalho repetitivo Tópicos Avançados Auditoria, Specifications e QueryDSL 01 02 03 04 3
  • 5. 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 SPRING No núcleo do Spring está um container que injeta (DI) e gerencia o ciclo de vida das dependências (IoC). CONFIGURAÇÃO FLEXÍVEL O Spring permite que as configurações sejam por anotações, xml, convenção ou programaticamente. NÃO INTRUSIVO A 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ÍVEIS Além de ser compatível com o JEE o Spring possui diversos módulos para suprir as mais diversas necessidades.
  • 6. 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
  • 8. 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 ... SIMPLIFICAR O 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. 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. 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); } REPOSITORY Interface 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 REPOSITORY Interface 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. 11 PRINCIPAIS INTERFACES PAGING AND SORTING REPOSITORY Extendendo 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. 12 SPRING DATA JPAJPA Diminuindo o trabalho repetitivo
  • 13. 13 DAO SIMPLES Utilizando 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. 14 REPOSITORY JPA Um 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. 15 SPRING DATA JPA Ao 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 } REPOSITORY public interface PessoaRepository extends JpaRepository <Pessoa, Long> {}
  • 16. 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. 17 QUERY METHODS Sã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. 18 QUERY LOOKUPS É como o Spring Data realiza a busca das queries. Atualmente existem três formas. CREATE 01 USE_DECLARED_QUERY 02 CREATE_IF_NOT_FOUND 03 <repositories query-lookup-strategy="use-declared-query"/>
  • 19. 19 CREATE Quebra 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,f indByFirstnameEquals … where x.firstname = ?1 Between findByStartDateBetween … where x.startDate between ?1 and ?2 ... ... ...
  • 20. 20 CREATE Acessando 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. 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_QUERY Utiliza apenas queries declaradas
  • 22. 22 USE_DECLARED_QUERY Utiliza 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. 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);
  • 25. 25 Auditoria No 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. 26 Auditoria Para 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. 27 Specifications O 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. 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. 29 QueryDSL A 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. 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);
  • 32. 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. 33 DESVANTAGENS Nomes dos métodos dos repositórios podem se tornar grandes em longas ou complicadas consultas. SQL nativo pode ser mais eficiente.
  • 35. 35 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