IGTI Blog

Conhecendo Spring Data JPA

A missão do Spring Data é fornecer um modelo consistente e intuitivo de programação para acesso de dados considerando os aspectos específicos de cada sistema de armazenamento de dados.

É um projeto da SpringSource com proposta de unificar e facilitar o acesso a diferentes tecnologias de armazenamento de dados, como bancos de dados relacionais e não relacionais.

Esse framework torna fácil o uso das tecnologias de acesso aos dados em base de dados relacionais e não relacionais, além do suporte ao acesso de dados baseados na nuvem. É uma suíte de projetos no qual contém vários subprojetos para trabalhar com as especificidades dos variados SGBDs. Os projetos são desenvolvidos por uma rede de companhias e desenvolvedores que estão por trás dessa tecnologia.

A Figura 01 nos traz uma visão geral do Spring Data. Esse Framework contém vários módulos para acesso de dados em diferentes modelos de bancos de dados. Tem-se o módulo Spring Data JPA que adiciona uma camada extra sobre o JPA Provider e esse módulo contém uma camada Repositórios (JpaRepository) que dá suporte à criação de repositórios estendendo interfaces do Spring Data, a infraestrutura que é compartilhada pelos bancos e o JPA Provider que implementa o JPA.
Conhecendo Spring Data JPA       
Figura 01. Visão geral da arquitetura do Spring Data.

Além do Spring Data JPA, tem o módulo Spring Data MongoDB que provê suporte à persistência de dados com o banco de dados MongoDB. Sua principal característica é o suporte à persistência de dados não estruturados. E contém métodos básicos para armazenamento e recuperação de documentos.

O módulo Spring Data Neo4J cuida da persistência de dados no SGBD Neo4J. Esse banco se trata de um banco de dados orientado a grafos que permite o armazenamento e recuperação similar ao armazenamento e recuperação de dados em grafos. Similar aos bancos relacionais no tocante às transações e operações ACID (Atomicidade; Consistência; Isolamento; Durabilidade). E existem outros módulos do Spring Data para suporte a outros bancos como o Spring Data Redis.

Utilizando Repository do Spring Data

O Objetivo do Spring Data Repository é reduzir a quantidade de código necessário para implementar a camada de acesso e persistência de dados. A abstração principal é a classe Repository em que o objetivo principal dessa classe é gerenciar a classe de domínio assim como o tipo de dado do id da classe.

CrudRepository

Disponibiliza operações CRUD para a entidade que está sendo gerenciada. A Figura 02 traz a estrutura dessa interface em que se pode notar várias operações como save, findOne e delete. Essa interface já é fornecida pelo Spring Data, dessa forma para utilizá-la, deve-se apenas implementá-la criando um repositório específico para cada entidade.

        Conhecendo Spring Data JPA

       Figura 02. IntefaceCrudRepository.

PagingAndSortingRepository

No contexto de uma aplicação com vários formulários, é comum ter funcionalidades em que os usuários podem fazer consultas e essas podem retornar zero ou dezenas de registros. É sabido que quando a consulta retorna muitos registros não é interessante listar todos esses dados para o usuário e sim dividir esses em páginas. E, além disso, esses dados sempre são ordenados de acordo com algum critério.

É prática comum o uso de estratégias para buscar as informações de uma base de dados de tal forma que essa informação será paginada, ou seja, a consulta não trará todos os dados e sim apenas aqueles que serão apresentados ao usuário de acordo com a página que o mesmo está inspecionando. Como isso é prática comum, o Spring Data fornece a interface PagingAndSortingRepository que traz facilidades para implementar a estratégia de ordenação e paginação. A Figura 03 traz as duas operações dessa interface. Ao implementar essa interface se tem algumas comodidades no tocante a implementação de um sistema de paginação e ordenação.

Conhecendo Spring Data JPA

Figura 03. Interface PagingAndSortingRepository.

O código abaixo mostra o uso do PagingAndSortingRepository para buscar um conjunto de 20 produtos da tabela Produto que se refere a página 1. A classe PageRequest permite definir a página passando para seu construtor a página e o tamanho da mesma.

PagingAndSortingRepository<Produto, Integer> repository = // … get access to a bean

Page<Produto> produtos = repository.findAll(new PageRequest(1, 20));

Métodos de Consulta

É comum a necessidade de métodos de acesso às entidades além daqueles de CRUD. O Spring Data com a classe Repository fornece uma estrutura que permite a criação de métodos de acesso sem a necessidade de escrever comandos SQL. O exemplo de código abaixo tem uma interface UsuarioRepository definida pelo desenvolvedor que estende a classe Repository.

O método findByNome da interface é a implementação da consulta que busca uma lista de usuários de acordo com o nome. Com apenas a assinatura do método a consulta já está feita. O Spring Data gera automaticamente a consulta correspondente simplesmente com a assinatura do método. Nota-se que o nome do método tem três elementos importantes, o findBy, o Nome e o parâmetro String nome. O método sempre tem que iniciar por findBy para consultas, o Nome do exemplo se refere ao atributo nome da entidade Usuário, já o parâmetro String nome é o valor que será usado para filtrar a consulta por nome. O nome da variável do parâmetro pode ser qualquer nome, porém a cadeia de caracteres que acompanha o findBy tem que ser exatamente o nome da propriedade da entidade com a primeira letra em caixa-alta. Se a consulta fosse filtrada por senha, então a assinatura do método seria List<Usuario>findBySenha(String senha).

public interface UsuarioRepository extends Repository<Usuario, Long> {

          List<Usuario>findByNome(String nome);

       }

Conclusão

Com esse artigo foi possível conhecer algumas das potencialidades do Framework Spring Data. Essa tecnologia permite que o Engenheiro de Software trabalhe com facilidades usando bancos de dados relacionais ou não relacionais como o MongoDB, Neo4J e Redis.

O artigo apresentou com mais detalhes o uso de alguns recursos para trabalhar com bancos relacionais, ou seja, o uso da classe Repository. Além dessa classe, o artigo mostra como é fácil criar consultas e usar o recurso de paginação e ordenação.

Professor autor: Cristiano Botelho