spring data jpa

38
SPRING DATA JPA APRESENTADO POR IVAN QUEIROZ

Upload: ivan-queiroz

Post on 12-Apr-2017

260 views

Category:

Software


3 download

TRANSCRIPT

Page 1: Spring Data Jpa

SPRING DATA JPAAPRESENTADO POR IVAN QUEIROZ

Page 2: Spring Data Jpa

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

Page 3: Spring Data Jpa

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

Page 4: Spring Data Jpa

4

Alguns ConceitosFramework, IoC e DI

Page 5: Spring Data Jpa

5

FRAMEWORK CÓDIGO BIBLIOTECA

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

importa

Page 6: Spring Data Jpa

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

Page 7: Spring Data Jpa

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); // ... }}

Page 8: Spring Data Jpa

8

JAVA PERSISTENCE APIEnxergando o banco através de objetos

Page 9: Spring Data Jpa

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

Page 10: Spring Data Jpa

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

Page 11: Spring Data Jpa

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

Page 12: Spring Data Jpa

12

SPRING FRAMEWORKAlta produtividade em aplicações

Page 13: Spring Data Jpa

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.

Page 14: Spring Data Jpa

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

Page 15: Spring Data Jpa

15

SPRING DATASimplificando o acesso a dados

Page 16: Spring Data Jpa

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.

Page 17: Spring Data Jpa

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.

Page 18: Spring Data Jpa

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.

Page 19: Spring Data Jpa

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

}

Page 20: Spring Data Jpa

20

SPRING DATA JPAJPA

Diminuindo o trabalho repetitivo

Page 21: Spring Data Jpa

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;

}

...

Page 22: Spring Data Jpa

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

}

}

Page 23: Spring Data Jpa

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

Page 24: Spring Data Jpa

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

Page 25: Spring Data Jpa

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

Page 26: Spring Data Jpa

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

Page 27: Spring Data Jpa

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

... ... ...

Page 28: Spring Data Jpa

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

Page 29: Spring Data Jpa

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

Page 30: Spring Data Jpa

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

Page 31: Spring Data Jpa

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

Page 32: Spring Data Jpa

32

QUANDO USARVantagens e desvantagens

Page 33: Spring Data Jpa

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.

Page 34: Spring Data Jpa

34

DESVANTAGENS

Nomes dos métodos dos repositórios

podem se tornar grandes em longas ou

complicadas consultas.

SQL nativo pode ser mais eficiente.

Page 35: Spring Data Jpa

35

ENCERRANDOUm longo caminho pela frente

Page 36: Spring Data Jpa

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

Page 37: Spring Data Jpa

37

DÚVIDAS?

Page 38: Spring Data Jpa

38

[email protected]

@ivanqueiroz@javabahia