spring data jpa
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?