Jpa
CRUD
Create (Criar), Read (Ler), Update (Atualizar) e Delete (Excluir)
Pré-requisitos: Noções Básicas de SQL e um projeto Spring Boot com Spring Data JPA conectando em um banco de dados relacional.
C.R.U.D
O que é CRUD?
CRUD é um acrônimo para Create (Criar), Read (Ler), Update (Atualizar) e Delete (Excluir). Essas quatro operações básicas são usadas para gerenciar dados em sistemas de banco de dados, aplicativos e outros tipos de armazenamento.
Operações
- Create:
Criação de novos registros no banco de dados. Exemplo: Inserir um novo usuário em um sistema.
- SQL:
INSERT INTO tabela (campo1, campo2) VALUES (valor1, valor2);
- Read:
Leitura ou recuperação de dados do banco de dados. Exemplo: Buscar informações sobre um usuário.
- SQL:
SELECT * FROM tabela WHERE condição;
- Update:
Atualização de registros existentes no banco de dados. Exemplo: Alterar o endereço de um usuário.
- SQL:
UPDATE tabela SET campo1 = valor1 WHERE condição;
- Delete:
Exclusão de registros do banco de dados. Exemplo: Remover um usuário do sistema.
- SQL:
DELETE FROM tabela WHERE condição;
Características
- Simplicidade: CRUD é uma abordagem simples e eficiente para gerenciar dados.
- Versatilidade: Pode ser utilizado em diversas tecnologias (SQL, MongoDB, Firebase, etc.).
- Base de Desenvolvimento: CRUD forma a base de muitos aplicativos web e móveis.
Contexto
Aqui está uma estrutura simples de uma entidade Cliente utilizando JPA, contendo os atributos id
, nome
, aniversario
, renda
e cidade
para podermos praticar as diferentes abordagens para a realização de consulta de dados com JPA.
Cliente.java
import jakarta.persistence.*;
import lombok.Data;
import java.time.LocalDate;
@Entity
@Table(name = "tab_cliente")
@Data
public class Cliente {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_cliente")
private Integer id;
@Column(name = "nome_completo")
private String nome;
@Column(name = "dt_aniversario")
private LocalDate aniversario;
@Column(name = "renda_media")
private Double renda;
@Column(name = "nome_cidade")
private String cidade;
@Override
public String toString() {
return "Cliente{" +
"id=" + id +
", nome='" + nome + '\'' +
", aniversario=" + aniversario +
", renda=" + renda +
", cidade='" + cidade + '\'' +
'}';
}
}
Estamos customizando todas as características de nossa entidade
Cliente
em relação a tabela no banco de dados para facilitar a compreensão entre SQL e JPQL.- Entidade Cliente:
- A entidade
Cliente
deve conter os seguintes atributos:id_cliente
(Identificador único, chave primária)nome_completo
(Nome do cliente)dt_aniversario
(Data de aniversário)renda_media
(Renda mensal média)nome_cidade
(Cidade de residência)
- Operações de Inserção:
- Inserir 5 registros com os seguintes dados:
- João: data de aniversário (15/05/1990), renda (2500.00), cidade ("São Paulo")
- Lucas: data de aniversário (22/03/1985), renda (3000.00), cidade ("Rio de Janeiro")
- Ana: data de aniversário (10/07/1992), renda (3500.00), cidade ("Belo Horizonte")
- Letícia: data de aniversário (10/07/1992), renda (3200.00), cidade ("Porto Alegre")
- Marcos: data de aniversário (30/11/1988), renda (2000.00), cidade ("Curitiba")
- Alterações nos Dados:
- Alterar a cidade de João para "Recife".
- Alterar a renda de Lucas para 3500.00.
- Exclusão de Registro:
- Excluir o registro de Marcos.
SQL
- INSERT
-- Inserindo os registros
INSERT INTO tab_cliente (nome_completo, dt_aniversario, renda_media, nome_cidade)
VALUES
('Joao', '1990-05-15', 2500.00, 'São Paulo'),
('Lucas', '1985-03-22', 3000.00, 'Rio de Janeiro'),
('Ana', '1992-07-10', 3500.00, 'Belo Horizonte'),
('Leticia', '1992-07-10', 3200.00, 'Porto Alegre'),
('Marcos', '1988-11-30', 2000.00, 'Curitiba');
- UPDATE
UPDATE tab_cliente
SET nome_cidade = 'Recife'
WHERE nome_completo = 'Joao';
UPDATE tab_cliente
SET renda_media = 3500.00
WHERE nome_completo = 'Lucas';
- DELETE
DELETE FROM tab_cliente
WHERE nome_completo = 'Marcos';
Spring Data
O Spring Data JPA Repository possui um arsenal de métodos já disponíveis na especificação, mas iremos ilustrar outra forma de localizar um registro no banco de dados.
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface ClienteRepository extends JpaRepository<Cliente, Integer> {
// Método customizado para buscar cliente pelo nome
Optional<Cliente> findByNome(String nome);
}
Agora vamos criar um Service que métodos de exemplo de CRUD.
Esta abordagem apresentada no Service é uma ilustração, recomendamos não utilizar em prjetos reais.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.Optional;
@Service
public class ClienteService {
@Autowired
private ClienteRepository clienteRepository;
// Criar clientes
public void criarClientes() {
Cliente joao = new Cliente();
joao.setNome("Joao");
joao.setAniversario(LocalDate.of(1990, 5, 15));
joao.setRenda(2500.00);
joao.setCidade("São Paulo");
Cliente lucas = new Cliente();
lucas.setNome("Lucas");
lucas.setAniversario(LocalDate.of(1985, 3, 22));
lucas.setRenda(3000.00);
lucas.setCidade("Rio de Janeiro");
Cliente ana = new Cliente();
ana.setNome("Ana");
ana.setAniversario(LocalDate.of(1992, 7, 10));
ana.setRenda(3500.00);
ana.setCidade("Belo Horizonte");
Cliente leticia = new Cliente();
leticia.setNome("Leticia");
leticia.setAniversario(LocalDate.of(1992, 7, 10));
leticia.setRenda(3200.00);
leticia.setCidade("Porto Alegre");
Cliente marcos = new Cliente();
marcos.setNome("Marcos");
marcos.setAniversario(LocalDate.of(1988, 11, 30));
marcos.setRenda(2000.00);
marcos.setCidade("Curitiba");
clienteRepository.save(joao);
clienteRepository.save(lucas);
clienteRepository.save(ana);
clienteRepository.save(leticia);
clienteRepository.save(marcos);
}
// Buscar cliente por ID
public Cliente buscarPorId(Integer id) {
return clienteRepository.findById(id).orElseThrow(() -> new RuntimeException("Cliente não encontrado"));
}
// Buscar cliente por nome
public Cliente buscarPorNome(String nome) {
return clienteRepository.findByNome(nome).orElseThrow(() -> new RuntimeException("Cliente não encontrado"));
}
// Alterar a cidade de João
@Transactional
public void alterarCidadeDeJoao() {
Cliente joao = buscarPorNome("Joao");
joao.setCidade("Recife");
clienteRepository.save(joao);
}
// Alterar a renda de Lucas
@Transactional
public void alterarRendaDeLucas() {
Cliente lucas = buscarPorNome("Lucas");
lucas.setRenda(3500.00);
clienteRepository.save(lucas);
}
// Excluir Marcos
@Transactional
public void excluirMarcos() {
Cliente marcos = buscarPorNome("Marcos");
clienteRepository.delete(marcos);
}
}
READ?
Agora que você dominou as operações principais de persistência de dados, que tal explorar as alternativas de consultas SQL em nossa plataforma? Acesse o link JPA - Consultas