sábado, 22 de maio de 2010

Criando sua camada de persistência usando o iBATIS

Nesse post falarei sobre como montar a camada de persistência (acesso ao banco de dados) de sua aplicação em Java usando o framework iBATIS da Apache. Também explicarei sobre como usar o plugin para o Eclipse, chamado de Ibator, para gerar todo o código da camada de persistência para você utilizando o padrão DAO (Data Access Object).

Motivação
Escrever o código das classes de DAO é muuuuuuito chato. Além de ser uma tarefa repetitiva, ocasionalmente podemos acabar cometendo erros. Sendo assim, o ideal seria que pudéssemos gerar todos esse código. Evitando assim erros de programação e agilizando o desenvolvimento de nossa aplicação.

iBATIS
É exatamente para isso que o iBATIS serve. Seu objetivo é fornecer um framework de mapeamento que permite facilmente utilizar bancos de dados relacionais com aplicações orientadas a objetos.

Algumas declarações:
  • No momento em que eu estava escrevendo esse post, o time de desenvolvimento do iBATIS publicou um anúncio em seu site, informando que o projeto será migrado para o Google Code e será renomeado para MyBatis. Mas não se preocupe, o licenciamento e a compatibilidade serão mantidos :-D.
  • Usar o iBATIS é MUITO simples.
  • Use o iBATIS quando você quiser ter domínio total sobre o banco de dados, ou seja, você irá modelar o banco, e o Ibator (plugin para o Eclipse) irá gerar os seus modelos e DAO's de acordo com o banco de dados, e não o contrário.
  • O iBATIS pode ser usado tanto em Java como em .NET :-D
Não gosto muito de ficar explicando o que uma coisa é, prefiro mostrar o que ela faz, e você decide se é útil para você ou não, então vamos lá.

Obtendo o iBATIS
Você pode obter o iBATIS através dos seguintes endereços:
Consulte este artigo para saber como configurar a API no Eclipse.

Nesse exemplos estarei utilizando a versão 2.3.4, que é a última versão estável. No momento em que esse artigo estava sendo escrito, a versão 3 do iBATIS está sendo finalizada, mas houveram algumas mudanças nos nomes dos pacotes, e o Ibator ainda está gerando o código para a versão 2.3.4, por isso vamos usá-la.

Instale também o plugin para o Eclipse, chamado Ibator, que irá lhe ajudar na geração do código. Para isso, abra o Eclipse e acesse o menu "Help" > "Install new software". Na janela que será aberta, coloque o seguinte endereço dentro do campo "Work with": http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/IbatorUpdateSite/. Em seguida pressione Enter. Aguarde uns segundos até que o update site carregue. Depois disso, você deve selecionar a opção "Apache iBATIS Ibator Feature" e clicar em "Next", "Next", aceite os termos da licença, e "Finish". Aguarde até que o plugin seja completamente instalado (provavelmente você terá que reiniciar o Eclipse para que as alterações tenham efeito).

Criando seu projeto e gerando o código com o Ibator
Depois de instalar o plugin para o Eclipse e configurar a biblioteca do iBATIS no Eclipse, você poderá começar a desenvolver seu projeto.

O primeiro passo é criar um novo projeto Java no Eclipse, em seguida, clique com o botão direito sobre o projeto e escolha a opção "Add Ibator do Build Path". Isso fará o Eclipse adicionar a biblioteca do Ibator ao seu projeto.

Depois disso, temos que criar um arquivo de configuração que irá informar ao Ibator quais tabelas do banco de dados ele deve gerar o código. Nesse ponto, seu banco de dados já deve estar criado. Caso você não tenha um banco de dados, pode criar um de testes usando o MySQL. No meu caso estarei utilizando o MySQL com apenas uma tabela chamada usuários.

Para criar o arquivo de configuração do Ibator, clique com o direito sobre o projeto e escolha a opção "New" > "Other". Na janela que será aberta, procure por "Apache iBATIS Ibator" > "Apache iBATIS Ibator Configuration File", clique em "Next", informe o nome do arquivo e clique em "Finish".

No arquivo de configuração que foi criado, você deverá informar os parâmetros solicitados. No meu caso o arquivo de configuração ficou assim no final:


Notem que adicionei o caminho da biblioteca com o driver JDBC para o MySQL. Você também terá que fazer isso para o seu banco de dados.

Feito isso, você já pode gerar o código dos modelos e DAO's. Para isso, clique com o direito sobre o arquivo de configuração do Ibator e selecione a opção "Generate iBATIS Artifacts". Ao clicar nesse botão, o Ibator irá conectar no banco de dados que você informou, obter as informações sobre as tabelas que você listou, e gerar o código dos modelos, interface e implementação dos DAO's e os arquivos XML que fazem o mapeamento entre as tabelas do banco de dados e suas classes.

Configurando o iBATIS
Depois de gerado o código, agora precisamos apenas configurar o iBATIS para que ele conheça todos os arquivos XML de mapeamento que foram gerados. Fazer isso é muito fácil, você precisará adicionar esses três arquivos no seu pacote de persistência:
  • SqlMapConfig.xml: Configura a conexão e a sessão com o banco de dados. Reúne todos os arquivos de SqlMap que foram gerados.
  • SqlMapConfig.properties: Arquivo de propriedades com as informações de conexão com o banco de dados.
  • SqlMap.java: Classe utilizada para obter uma sessão com o banco de dados. Ela é responsável por ler e interpretar todos os arquivos XML de SqlMap que foram gerados.

Depois disso, você já pode acessar o seu banco de dados e realizar operações básicas de inclusão, alteração, exclusão e busca de registros.

Abaixo está um código que mostra como fazer cada uma dessas operações. Alternativamente, você pode baixar o projeto do Eclipse desse exemplo que está disponível neste endereço.

package com.ibatis.teste;

import java.sql.SQLException;
import java.util.List;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.teste.modelo.Usuario;
import com.ibatis.teste.modelo.UsuarioExample;
import com.ibatis.teste.persistencia.SqlMap;
import com.ibatis.teste.persistencia.dao.UsuarioDAO;
import com.ibatis.teste.persistencia.dao.impl.UsuarioDAOImpl;

public class Main {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws SQLException {

        // Obtém o SqlMapClient
        SqlMapClient sqlMapClient = SqlMap.getInstance();

        // Inicia uma transação
        sqlMapClient.startTransaction();

        // Cria um usuário
        Usuario usuario = new Usuario();
        usuario.setLogin("teste");
        usuario.setNome("Teste da Silva");
        usuario.setSenha("123");

        // Obtém o DAO de usuário
        UsuarioDAO usuarioDAO = new UsuarioDAOImpl(sqlMapClient);

        // Insere o usuário
        usuarioDAO.insert(usuario);

        // Busca por login
        UsuarioExample filtro = new UsuarioExample();
        filtro.createCriteria().andLoginEqualTo("teste");
        List<Usuario> encontrados = usuarioDAO.selectByExample(filtro);
        usuario = encontrados.get(0);

        // Atualiza o usuário
        usuario.setNome("Teste da Silva Atualizado");
        usuarioDAO.updateByExample(usuario, filtro);

        // Busca todos
        encontrados = usuarioDAO.selectByExample(null);
        for (Usuario registro : encontrados) {
            System.out.println(registro.getNome());
        }

        // Exclui
        usuarioDAO.deleteByPrimaryKey(usuario.getId());

        // Confirma a transação
        sqlMapClient.commitTransaction();

        // Finaliza a transação
        // Se uma transação for finalizada sem a chamada para o commit, então
        // ela será desfeita.
        sqlMapClient.endTransaction();
    }

}


Referências
Para maiores informações sobre o Ibator, acesse: http://ibatis.apache.org/docs/tools/ibator/
Para maiores informações sobre o iBATIS e como usá-lo, acesse o Guia do Usuário:

Nenhum comentário:

Postar um comentário