Login Registre-se

Home > Artigos > Engenharia de Software >

Introdução ao pattern DAO

Publicado por Tutoriais Admin em 23/01/2013 - 272.214 visualizações


comentários: 2

por Davi Luan Carneiro

Desde o início da era da programação, viu-se a grande necessidade de haver um meio de armazenamento de dados. Um programa deveria saber gerenciar os dados e fazer processamentos inteligentes sobre eles, trazendo informações oportunas aos usuários.

Hoje as empresas usam grandes bancos de dados que manipulam milhões de informações. Não se pode conceber um sistema moderno sem acesso a algum tipo de base de dados.

Dessa forma, os nossos programas devem saber se comunicar com a base de dados. Como fazer isso de maneira adequada? Uma alternativa muito viável é usar o pattern DAO. Iremos explorá-lo um pouco neste artigo.

DAO: o intermediário entre os mundos

XMLs, a grosso modo, são um conjunto de tags dispostas de modo hierárquico, contendo informações estruturadas. Arquivos texto são um conjunto de caracteres. Bancos de dados relacionais são um conjunto de tabelas, colunas, e linhas. Aplicações Java são um conjunto de objetos.

O DAO deve funcionar como um tradutor dos mundos. Suponha um banco relacional. O DAO deve saber buscar os dados do banco e converter em objetos para ser usado pela aplicação. Semelhantemente, deve saber como pegar os objetos, converter em instruções SQL e mandar para o banco de dados. É assim que um DAO trabalha.

Abstração

Devido à sua qualidade de tradutor, o DAO abstrai a origem e o modo de obtenção / gravação dos dados, de modo que o restante do sistema manipula os dados de forma transparente, sem se preocupar com o que acontece por trás dos panos. Isso ajuda muito em processos de migrações de fonte de dados e testes unitários.

Unificação do acesso a dados

É muito comum em códigos de programadores iniciantes vermos a base de dados sendo acessada em diversos pontos da aplicação, de maneira extremamente explícita e repetitiva. Isso é um crime contra um bom design OO. Além de não abstrair a fonte dos dados, transforma o código em um espaguete difícil de manter. O DAO também nos ajuda a resolver este problema, provendo pontos unificados de acesso a dados. Desse modo, a? lógica? de interação com a base de dados ficam em lugares específicos e especializados nisso, além de eliminar códigos redundantes, facilitando a manutenção e futuras migrações.

DAO na prática

Geralmente, temos um DAO para cada objeto do domínio do sistema (Produto, Cliente, Compra, etc.), ou então para cada módulo, ou conjunto de entidades fortemente relacionadas.

Cada DAO deve possuir uma interface, que especifica os métodos de manipulação de dados. Nossos códigos trabalharão apenas com as interfaces dos DAOs, desconhecendo a implementação utilizada. Isso é uma boa prática, não somente em termos de persistência, mas em vários outros pontos de uma aplicação.

Para exemplificar, vamos tratar dos usuários do nosso sistema. O primeiro passo é definir uma classe User.






Agora, especificaremos a interface UserDao:






Observe que UserDao não contem nenhuma informação específica da origem dos dados. Agora, podemos codificar os nosso Daos, implementando esta interface.




Aqui exemplificamos três implementações possíveis. Uma, usando ? JDBC puro ?; a segunda, usando o framework Hibernate e a última persistindo em arquivo texto.


DAO + Factory ou DI (Dependency Injection)

Apesar de termos a interface UserDao, não há nenhum proveito em criarmos nossos DAOs desta maneira:




Se fizermos de tal modo, de nada nos aproveitará, em termos de abstração, usarmos uma interface para o DAO. O ideal é que usemos o pattern Factory ou DI (Injeção de Dependências) para máxima transparência. Nesse artigo, usaremos o Factory.

O pattern Factory implementa uma fábrica de objetos, abstraindo e isolando o modo de criação dos objetos. Veja um exemplo simples:






Assim, o único lugar em toda a aplicação que conhece a implementação de DAO usada é aqui. Quando precisarmos do UserDao, ao invés de instanciar com um new, chamaremos a fábrica:




Não entraremos em detalhes sobre a implementação destes patterns, visto que poderão ser alvos de estudo em próximos artigos.

Patterns relacionados

Há outros patterns relacionados à persistência, como o ActiveRecord e o Repository.



Leia também:
Acessando Banco de Dados em Java (PARTE 1)
Acessando Banco de Dados em Java (PARTE 2)
Acessando Banco de Dados em Java (PARTE 3)


Aplicativo Java acessando banco de dados:
Aplicativo Java com acesso a banco de dados: 1º parte - Dao
Acessando Dados com Java: Parte 2 - Prevendo problemas



Quer aprender mais sobre Java?
O que é Java?
Características Básicas
Orientação a Objetos



Tutoriais para Certificação Java
Fundamentos da Linguagem
Modificadores
Operadores e atribuições
Controle de Fluxo
Orientação a Objetos
Java Lang e Wrappers
Objetos e Conjuntos
Classes Internas
Threads (Segmentos)




comentários: 2