Spring Data JPA

 O Spring Data JPA é o framework que facilita a integração da aplicação com o banco de dados, mapeando as tabelas em classes e fornecendo diversas funções de operações básicas no banco (consultas, inserções, deleções, etc.).

Propriedades

 O primeiro passo para conectar uma aplicação à um banco de dados é inserindo os dados de conexão no application.properties.
 Principais dados:
  • spring.datasource.url: url de conexão (exemplo: jdbc:mysql://localhost:3306/nome_do_banco)
  • spring.datasource.username: usuário de conexão
  • spring.datasource.password: senha do usuário
  • spring.jpa.hibernate.ddl-auto: como a aplicação irá se portar em relação às divergências com o banco (campo faltante, tabela com campo a menos, etc.)
    • none: não irá verificar nem fazer nada
    • validate: irá somente verificar se a aplicação está de acordo com o banco de dados
    • update: irá atualizar o banco de dados de acordo com a aplicação
    • create-drop: irá criar a base de dados sempre que a aplicação for inicializada e deletá-la quando ela for interrompida

Anotações de uma Entidade

  • @Entity: define que aquela classe é uma entidade
  • @Table(name="x"): define que o mapeamento daquela tabela é "x", ao invés do nome da classe
  • @Id: define que o atributo que recebe a anotação é o identificador do registro na tabela
  • @GeneratedValue(strategy=GenerationType.AUTO/IDENTITY/SEQUENCE/TABLE): define a forma como o ID será gerado (para saber mais, veja essa página).
  • @Column(name="x", nullable=true/false, unique=true/false, length=10): informa que aquele atributo é uma coluna, o nome da coluna no banco de dados, se o campo pode ser nulo, etc.

JpaRepository<ClasseEntidade, TipoId>

 Para ter acesso aos diversos métodos que facilitam na comunicação com o banco de dados do Spring Data JPA, precisamos criar uma interface que estenda JpaRepository, informando a classe que representa a entidade e também o tipo do campo definido com @Id.
 Estender essa interface já estende também a anotação @Repository, que é a anotação necessária para o Spring entender que se trata da classe que irá de fato se comunicar com o banco.

Transações

 Sempre que formos fazer qualquer alteração no banco de dados (inserção, atualização, deleção, etc.), é uma boa prática anotar o método em questão com @Transactional. Isso irá fazer com que as alterações sejam commitadas ao final da execução, ou que seja feito o roll back em caso de erro, tudo automaticamente.

Derived Query

 Além dos diversos métodos que a interface JpaRepository disponibilizam (como findAll, findById, save, etc.), podemos criar queries específicas, como buscar por determinados campos ou verificar se existem registros para certos campos.
 Para isso, basta criar na interface as assinaturas com o formato correto. Por exemplo, se eu desejo buscar registros, a assinatura deve iniciar com findBy. Em seguida, devo informar os campos que serão usados na busca, separando por And ou Or:

List<User> findByNameAndEmail(String name, String email);
boolean existsByNameOrEmail(String name, String email);

Temos diversas possibilidades:
  • List<User> findTop3ByAge()
  • List<User> findByNameIsNot(String name);
  • List<User> findByNameIsNotNull();
  • List<User> findByNameStartingWith(String prefix);
  • List<User> findByNameEndingWith(String suffix);
  • List<User> findByNameContaining(String infix);
  • List<User> findByNameLike(String likePattern);
  • List<User> findByAgeLessThanEqual(Integer age);
  • List<User> findByNameOrderByName(String name);
Para uma explicação completa, veja esse artigo.

Optional

 Os métodos de busca geralmente retornam um Optional<ClasseBuscadad>. Essa é uma classe útil do Java que busca facilitar casos onde um valor nulo pode ser retornado.
 Essa classe possui métodos úteis, como:
  • isPresent(): verifica se o valor é diferente de nulo
  • isEmpty(): verifica se o valor é nulo
  • get(): retorna o valor. Se for nulo, lança uma exceção
  • orElse(outroValor): retorna o valor se presente. Senão, retorna o outro valor informado
  • orElseThrow(): retorna o valor se presente. Senão, lança a exceção NoSuchElementException

Paginação

 O Spring JPA possui a classe Pageable, que contém propriedades padrões de paginação:
  • page: número da página
  • size: número de elementos por página
  • sort: coluna que será usada na ordenação
  • direction: se por padrão a ordenação é ascendente ou descendente.
 Os métodos de busca padrões disponibilizados pelo JpaRepository aceitam receber um Pageable e retornam uma Page<ClasseBuscada>, que além de retornar os elementos encontrados, irá retornar informações sobre a busca.
 Além disso, é uma boa prática usar a anotação @PageableDefault para informar as informações padrões de paginação.
Ex:

public Page<User> listUsers(@PageableDefault(page=0, size=10, sort="name", direction=Sort.Direction.ASC) Pageable pageable) { ... }

 Os parâmetros de paginação são passadas na URL.
Ex:

http://localhost:8080/users?page=1&size=10&sort=name,DESC

Referências

Comentários

Postagens mais visitadas deste blog

Thymeleaf