Java Spring: Padrão DAO vs Repository
Padrões de projeto são soluções comuns e efetivas para problemas recorrentes no desenvolvimento de software. Alguns padrões, como o DAO e Repository, são importantes para separar responsabilidades e tornar o código mais manutenível e escalável.
Sobre o DAO e sua implementação
O padrão DAO separa as regras de acesso a banco de dados das regras de negócio em uma aplicação, isolando as operações em um objeto com uma interface definida.
public class Pessoa{
private Long id;
private String nome;
private String cpf;
// construtores, getters e setters
}
public class PessoaDao {
private final EntityManager entityManager;
public PessoaDao(EntityManager entityManager) {
this.entityManager = entityManager;
}
public void create(Pessoa pessoa) {
entityManager.persist(pessoa);
}
public Pessoa read(Long id) {
return entityManager.find(Pessoa.class, id);
}
public void update(Pessoa pessoa) {
entityManger.merge(pessoa);
}
public void remove(Pessoa pessoa) {
entityManger.remove(pessoa);
}
}
Sobre o Repository e sua implementação
O padrão Repository também lida com dados, mas está mais próximo da lógica de negócios da aplicação. Ele fica entre as regras de negócio e a camada de persistência, fornecendo uma interface fácil de usar para acessar objetos de negócio e usando a camada de persistência para gravar e recuperar os dados.
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PessoaRepository extends JpaRepository<Pessoa, Long> {
}
}
@Service
public class PessoaService {
private final PessoaRepository pessoaRepository;
public PessoaService(PessoaRepository pessoaRepository) {
this.pessoaRepository = pessoaRepository;
}
public void criarPessoa(Pessoa pessoa) {
pessoaRepository.save(pessoa);
}
public Pessoa buscarPessoaPorId(Long id) {
return pessoaRepository.findById(id).orElse(null);
}
public void atualizarPessoa(Pessoa pessoa) {
pessoaRepository.save(pessoa);
}
public void removerPessoa(Pessoa pessoa) {
pessoaRepository.delete(pessoa);
}
// outros métodos do serviço...
}
Neste exemplo, estamos injetando o nosso PessoaRepository
no construtor da classe PessoaService
e utilizamos os métodos definidos na interface para buscar e salvar pessoas. Note que não precisamos implementar esses métodos manualmente, pois o Spring já gera a implementação automaticamente para nós.
Conclusão
O uso do padrão Repository é preferível ao uso do DAO com o Spring, porque ele incentiva um design orientado a domínio e permite uma compreensão mais fácil da estrutura de dados. Além disso, o Spring cria automaticamente a implementação dos métodos definidos no repositório, tornando o código mais simples e legível.