Durante longos anos, nós, desenvolvedores, tivemos que lidar com as dificuldades de mapeamento e manipulação de objetos em Java para as suas respectivas representações em um banco de dados, registros em uma tabela. O mundo relacional do banco de dados é incompatível com o mundo orientado a objetos porque eles lidam com os dados de maneiras distintas. Enquanto em Java os registros são representados por objetos que possuem comportamento, no banco de dados os registros são representados de forma textual e sem comportamento.
Para diminuir a incompatibilidade entre eles e permitir que objetos sejam representados no banco de dados, foi criada a especificação Java Database Connectivity API, o famoso JDBC. Apesar dos benefícios conquistados, também vieram muitas dificuldades, como problemas de conexão com bancos de dados diversos, casting excessivo de objetos, código complexo para ações simples, ausência de cache de objetos, etc.
Para solucionar os problemas originados com o JDBC, diversos frameworks foram criados e ganharam espaço na comunidade. Um dos mais relevantes foi o Hibernate, que rapidamente se tornou padrão nos pequenos e grandes projetos. Infelizmente essas soluções, conhecidas como frameworks ORM, não seguiam nenhum padrão de desenvolvimento e traziam algumas dificuldades, como: pouco reaproveitamento do conhecimento de um framework em relação a outro, impossibilidade de migração entre os frameworks, quando um deles possuía mais funcionalidades que outros, entre outras questões.
Para resolver esse problema, a Sun lançou, em 2006, o primeiro release de sua nova especificação, a JPA, ou Java Persistence API, para a padronização do mapeamento entre o mundo orientado a objetos e o mundo relacional. A partir desse momento, os frameworks mais utilizados, como o Hibernate, o EclipseLink e o TopLink, passaram a seguir as regras dessa especificação, o que possibilitou a migração de uma solução para a outra de forma fácil, além de uma API simples e padronizada, permitindo o reaproveitamento do conhecimento de um framework em relação a outro.
Apesar das incríveis funcionalidades existentes na especificação JPA, muitas delas são repetitivas, fazendo com que o mesmo código seja reescrito diversas vezes, ou exigem muito código para operações simples. Tendo em vista esse cenário, o Spring criou o framework Spring Data JPA, cujo principal objetivo é permitir que o desenvolvimento com JPA se torne mais fácil, prático e menos repetitivo.
A seguir listamos algumas das principais funcionalidades do Spring Data JPA, que serão analisadas ao longo do artigo, comparando também com o que há de equivalente na especificação JPA:
- Operações de criação, remoção, modificação e seleção, conhecidas como CRUD;
- Query Methods;
- Method Names;
- Query Annotation;
- Named Queries;
- Ordenação.
Configurando o Spring Data JPA
O Spring Data JPA pode ser configurado de diversas formas, por exemplo: fazendo o download manual do seu JAR; usando um gerenciador de dependências, como o Gradle ou o Maven; utilizando o projeto Spring Boot; e até mesmo o projeto JBoss Forge. Para este artigo optamos pelo gerenciador de dependências Maven. Para que o Spring Data JPA seja configurado no Maven, basta adicionar no arquivo pom.xml as linhas indicadas na Listagem 1.
Listagem 1. Declaração da dependência do Spring Data JPA.
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.9.4.RELEASE</version>
</dependency>
Implementando um CRUD com JPA
É comum que projetos em sua fase inicial comecem com operações básicas de criação, remoção, modificação e seleção de objetos. Para o nosso primeiro exemplo, criaremos um CRUD de funcionários e veremos a primeira comparação entre o framework Spring Data JPA e a especificação JPA.
Na Listagem 2 apresentamos o código da classe Funcionario, já com as anotações da JPA para que seja possível o mapeamento entre essa classe e a tabela funcionario no banco de dados.
Listagem 2. Classe Funcionario sendo mapeada pela JPA.
@Table(name = "funcionario")
@Entity
public class Funcionario {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "nome")
private String nome;
@Column(name = "sobrenome")
private String sobrenome;
@Column(name = "cargo")
private String cargo;
@Column(name = "departamento")
private String departamento;
@Deprecated
Funcionario() {
}
public Funcionario(String nome, String sobrenome, String cargo, String departamento) {
this.nome = nome;
this.sobrenome = sobrenome;
this.cargo = cargo;
this.departamento = departamento;
}
// getters e setters omitidos
}
A seguir temos a descrição de cada anotação da JPA que foi utilizada:
- @Table: É utilizada para informar o nome da tabela relacionada a essa entidade no banco de dados;
- @Entity: Indica que a classe será mapeada e passará a ser gerenciada pela JPA;
- @Column: Nos possibilita fazer algumas configurações, como o nome da coluna no banco de dados, tamanho da coluna, obrigatoriedade de campos, etc.;
- @Id: Indica que o atributo da classe será gerenciado pela JPA e terá o seu valor automaticamente incrementado;
- @GeneratedValue:
Permite que o banco utilize a estratégia de gerar automaticamente os valores da
coluna id, que representa a c ...
Quer ler esse conteúdo completo? Tenha acesso completo
Confira outros conteúdos:
Por Alexandre Em 2017Crie sua conta grátis e baixe o e-bookDê um upgrade no início da sua jornada.Perguntas frequentes
Quem somos?Por que a programação se tornou a profissão mais promissora da atualidade?Como faço para começar a estudar?Em quanto tempo de estudo vou me tornar um programador?Sim, você pode se tornar um programador e não precisa ter diploma de curso superior!O que eu irei aprender estudando pela DevMedia?Principais diferenciais da DevMediaQual o investimento financeiro que preciso fazer para me tornar um programador?Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado! Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um Full-Stack Dev!Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.