Esse artigo faz parte da revista Java Magazine edição 29. Clique aqui para ler todos os artigos desta edição

OR: windowtext; FONT-FAMILY: Verdana">m 12pt">Conheça mais um componente do Jakarta Commons, o DButils, que reduz drasticamente o código em DAOs e outras classes de acesso a dados

Uma questão comum em projetos Java é como desenvolver a camada de persistência. Hoje existem ferramentas e tecnologias com esse fim para todos os gostos, como Hibernate, JDO, Ibatis etc. Mas o que me motivou a preparar esse artigo foi não poder usar nenhum desses mecanismos – uma experiência vivida em um dos projetos que já trabalhei.

Nossa equipe foi apenas orientada a criar ou utilizar algo que poupasse o esforço de integração com o banco de dados, simplificando ou eliminando tarefas trabalhosas e repetitivas, como abrir e fechar ResultSets, carregar Value Objects e implementar código de acesso em DAOs (veja o quadro "Tira-dúvidas"). Foi quando constatamos a importância do projeto Commons na vida do programador. A utilização do DBUtils trouxe uma solução produtiva dentro da imposição que nos fora feita.

O DBUtils visa simplificar o código de acesso a dados com JDBC. Ele preenche automaticamente propriedades de JavaBeans com dados de ResultSets e encapsula o tratamento de vários detalhes da API JDBC (por exemplo, o fechamento de ResultSets e Statements).

Codificação inicial

Para o exemplo criado neste artigo, foi utilizado o MySQL (versão 4.1) e seu driver JDBC, porém qualquer banco de dados com um driver JDBC atualizado pode ser utilizado. Os exemplos usam uma tabela chamada Cliente cuja definição é mostrada na Listagem 1.

A classe ClienteVO mostrada na Listagem 2 é um JavaBean simples. Para que o mapeamento de dados automático realizado pelo DBUtils funcione, os nomes dos atributos da classe devem ser os mesmos que os dos campos da tabela. Todo o uso da API DBUtils foi centralizado numa classe utilitária chamada SQLUtil (Listagem 3). Essa classe mostra a recuperação de um objeto genérico, através do método obtemObject(), e a recuperação de uma lista de objetos, usando o método obtemLista(). O DBUtils nos fornece as seguintes interfaces e classes pra isso:

§       QueryRunner – Executa uma consulta SQL.

§       ResultSetHandler Implementações desta interface fazem a conversão de ResultSets em vários tipos de objetos.

§       BeanListHandler é uma implementação de ResultSetHandler que transforma o ResultSet  retornado por um QueryRunner numa lista de beans, um bean para cada registro.

§       BeanHandler é uma implementação de ResultSetHandler que transforma a primeira linha do ResultSet retornado pelo QueryRunner em um bean.

 

Os dois métodos de SQLUtil são bastante semelhantes, sendo a única diferença o tratamento do Resultset retornado. O método obtemLista() retorna um BeanListHandler  com uma lista de objetos; obtemObject() retorna um BeanHandler com um único objeto. O método getConnection() é usado para recuperar uma conexão do banco de dados.

Classe ClienteDAO

Seguindo o conhecido padrão de projeto DAO (Data Access Object), concentramos o código de acesso a dados de clientes na classe ClienteDAO (Listagem 4). Com o uso do DBUtils, o que antes seria uma tarefa árdua torna-se simples. Recuperamos uma lista de objetos desta maneira:

List lista = SqlUtil.obtemLista(

     "SELECT * FROM CLIENTE", Cliente.class, null);

Aqui obtemos todos os clientes, mas também poderíamos parametrizar a consulta:

List lista = SqlUtil.obtemLista(

     "SELECT * FROM CLIENTE where SEXO = ?",

     Cliente.class, new Object[] { “M” } );

Para recuperar um único objeto pela chave, fazemos: ...

Quer ler esse conteúdo completo? Tenha acesso completo