O que é DAO ?
DAO (Data Access Object): Entendendo sua Importância e Evolução com JPA
Introdução
O desenvolvimento de software requer uma abordagem organizada para lidar com dados armazenados em bancos de dados. Uma das padrões mais utilizados para essa interação é o DAO (Data Access Object), um conceito essencial na arquitetura de software. Este artigo explora a origem do DAO, os problemas que ele resolve, sua relação com SQL e como JPA e ORM surgiram para aprimorar essa abordagem.
O que é DAO?
DAO é um padrão de projeto (design pattern) que separa a lógica de acesso a dados da lógica de negócio em uma aplicação. Ele encapsula toda a interação com o banco de dados, permitindo que a lógica de negócio não precise lidar diretamente com comandos SQL.
Em uma arquitetura baseada em DAO, uma classe DAO é responsável por realizar as operações CRUD (Create, Read, Update, Delete) sobre uma entidade, proporcionando uma camada de abstração entre o banco de dados e a lógica da aplicação.
Origem e Problema Resolvido
O conceito de DAO surgiu no contexto da programação orientada a objetos como uma solução para reduzir o acoplamento entre a camada de negócio e a camada de persistência. Antes do uso de DAOs, a própria lógica de negócio continha instruções SQL espalhadas pelo código, tornando a manutenção difícil e a migração entre bancos de dados custosa.
A introdução do DAO resolveu esse problema ao:
- Criar uma camada intermediária entre o banco de dados e a lógica de negócio;
- Permitir a reutilização de código para operações comuns no banco de dados;
- Facilitar a troca de fornecedores de banco de dados sem grandes impactos na lógica da aplicação;
- Melhorar a testabilidade, pois permite substituir DAOs reais por implementações simuladas (mock) durante os testes.
DAO e SQL
Os DAOs interagem diretamente com o banco de dados por meio de comandos SQL. Para isso nós fazemos o uso direto de comandos SQL. O então DAO contém consultas SQL escritas manualmente, como "SELECT * FROM usuario WHERE id = ?" ou "INSERT INTO ...". Embora eficiente, isso pode resultar em um alto acoplamento com um banco de dados específico, dificultando a migração para outro sistema de gerenciamento de banco de dados (SGBD).
O problema do alto acoplamento entre o DAO e o SQL é que, ao mudar de um banco de dados para outro (por exemplo, de MySQL para PostgreSQL), é possível que seja necessária uma reescrita significativa das consultas SQL.
A Evolução: JPA e ORM
Para resolver o problema do acoplamento dos DAOs com bancos de dados específicos, surgiram os frameworks ORM (Object-Relational Mapping). O JPA (Java Persistence API) é uma especificação do Java que padroniza a maneira como objetos Java são mapeados para tabelas do banco de dados, tornando a persistência mais abstrata e independente do SQL específico de um SGBD.
Como o JPA Resolve os Problemas do DAO
Com o uso do JPA, o DAO tradicional, que precisava lidar diretamente com SQL, passa a ser substituído por uma abordagem baseada em entidades e repositórios:
- O desenvolvedor define entidades Java anotadas com @Entity, e o JPA cuida do mapeamento dessas classes para tabelas do banco de dados.
- As consultas podem ser escritas usando JPQL (Java Persistence Query Language) ou usando Criteria API, que evitam o uso de SQL específico de um banco de dados.
- O JPA permite que a troca do provedor de banco de dados seja feita sem alteração significativa no código, bastando modificar a configuração do provedor ORM (como Hibernate, EclipseLink, entre outros).
Exemplo de DAO com JPA
Sem JPA, um DAO tradicional poderia ter um método assim:
public Usuario buscarPorId(int id) {
Connection conexao = DriverManager.getConnection(...);
PreparedStatement stmt = conexao.prepareStatement("SELECT * FROM usuario WHERE id = ?");
stmt.setInt(1, id);
ResultSet rs = stmt.executeQuery();
// Processamento do resultado
}
Com JPA, a abordagem muda para algo mais abstrato e independente de SQL:
@Entity
public class Usuario {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
// Getters e Setters
}
public interface UsuarioRepository extends JpaRepository<Usuario, Long> {
}
Agora, o acesso a dados é feito de forma muito mais simples:
Usuario usuario = usuarioRepository.findById(1L).orElse(null);
Conclusão
O padrão DAO ajudou a organizar o acesso a dados em aplicações, reduzindo o acoplamento entre a lógica de negócio e o banco de dados. No entanto, ao depender fortemente de SQL, ele ainda apresentava desafios relacionados à portabilidade entre diferentes bancos de dados.
A introdução de ORM e JPA trouxe uma abordagem mais flexível e independente de SGBD, eliminando a necessidade de SQL escrito manualmente na maioria dos casos. Com isso, a camada de persistência se tornou mais simples, reutilizável e fácil de manter.
Compreender essa evolução é essencial para arquitetar sistemas robustos e escaláveis, garantindo que a escolha entre DAO tradicional e JPA seja feita conforme a necessidade do projeto.