Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Spring Data Jpa

615 views

Published on

Alteração da palestra de Spring Data Jpa, voltado para um público menos experiente.

Published in: Software
  • Be the first to comment

Spring Data Jpa

  1. 1. SPRING DATA JPAAPRESENTADO POR IVAN QUEIROZ
  2. 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. 3. AGENDA Alguns Conceitos Framework, IoC e DI Java Persistence API Enxergando o banco através de objetos Spring Framework Alta produtividade em aplicações Java Spring Data Simplificando o acesso aos dados 01 02 03 04 3 Spring Data JPA Diminuindo o trabalho repetitivo05 06 07 Quando Usar Vantagens e desvantagens Encerrando Um longo caminho pela frente
  4. 4. 4 Alguns Conceitos Framework, IoC e DI
  5. 5. 5 FRAMEWORK CÓDIGO BIBLIOTECA FRAMEWORK Facilita a construção do software por deixar que o desenvolvedor se preocupe com o que realmente importa
  6. 6. 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. 7. 7 INJEÇÃO DE DEPENDÊNCIA A dependência entre os módulos é controlada por uma infraestrutura de software responsável por “injetar” a mesma quando necessária. @Controller public 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. 8. 8 JAVA PERSISTENCE API Enxergando o banco através de objetos
  9. 9. 9 ORM (Object Relational Mapper) Técnica para relacionar o objeto com o dado que ele representa no banco de dados. Objetos CamadadeMapeamento ORM Banco de Dados
  10. 10. 10 JPA Especificaçã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. 11. 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(); @Entity public 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. 12. 12 SPRING FRAMEWORK Alta produtividade em aplicações
  13. 13. 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 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.
  14. 14. 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. 15. 15 SPRING DATA Simplificando o acesso a dados
  16. 16. 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 ... 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.
  17. 17. 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. 18. 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); } 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.
  19. 19. 19 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); }
  20. 20. 20 SPRING DATA JPAJPA Diminuindo o trabalho repetitivo
  21. 21. 21 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; } ...
  22. 22. 22 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(); } }
  23. 23. 23 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> {}
  24. 24. 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. 25. 25 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
  26. 26. 26 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"/>
  27. 27. 27 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 ... ... ...
  28. 28. 28 CREATE Acessando 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. 29. 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_QUERY Utiliza apenas queries declaradas
  30. 30. 30 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);
  31. 31. 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. 32. 32 QUANDO USAR Vantagens e desvantagens
  33. 33. 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. 34. 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. 35. 35 ENCERRANDO Um longo caminho pela frente
  36. 36. 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. 37. 37 DÚVIDAS?
  38. 38. 38 OBRIGADO! ivanqueiroz@gmail.com @ivanqueiroz @javabahia

×