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: