26.6.05

iBatis

Um framework de mapeamento O-R e de geração de camadas de DAO (Data Access Objects, uma camada para separar a implementação do mecanismo de acesso a dados do restante da aplicação) bem simples e poderoso. Com o iBatis, você centraliza todas as queries (inserts, updates, selects) de banco de dados em arquivos XML, e utiliza-as na aplicação através de uma classe de gerenciamento de conexões (que também pode controlar transações, pooling, etc, etc). Um framework muito interessante para aplicações que não podem fazer uso de ferramentas de mapeamento O-R direto (como o Hibernate), por qualquer razão (necessidade de queries otimizadas, banco não normalizado, existência de um DBA que é primo do dono da empresa e que não pode perder o emprego.....)

iBatis em 72 segundos

1. XML... (segundos 1 a 63)
A configuração do iBatis é simples, e feita à base de arquivos XML. Para usar apenas o módulo de SQLMapping (i.e., a parte do iBatis responsável por fazer acessos ao banco), você precisa de um descritor XML com as configurações de acesso ao banco. Abaixo, o nosso arquivo ('sql-map-config.xml'):


<sqlmapconfig>
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
maxSessions="64"
maxTransactions="8"
maxRequests="128"/>

<transactionmanager type="JDBC">
<datasource type="SIMPLE">
<property value="meu_JDBC_Driver" name="JDBC.Driver">
<property value="URL_do_banco" name="JDBC.ConnectionURL">
<property value="meu_username" name="JDBC.Username">
<property value="shhh_its_secret" name="JDBC.Password">
<property value="15" name="Pool.MaximumActiveConnections">
<property value="15" name="Pool.MaximumIdleConnections">
<property value="1000" name="Pool.MaximumWait">
</datasource>
</transactionmanager>

<!-- pode ter mais de um deste -->
<sqlmap resource="database-queries.xml">
</sqlmapconfig>

Todas as consultas (e inserts, e updates e todo o resto) ficam nos 'sqlMaps', referenciados por esta configuraçao. No exemplo, definimos uma só query, que retorna um string. O nosso database-queries.xml fica assim:

<sqlmap namespace="database-queries">
<select id="getCustomerName" resultclass="string" parameterclass="int">
select name from CUSTOMER c where id=#id#
</select>
</sqlmap>
O mecanismo de mapeamento do iBatis é bem flexível, e permite, entre outras coisas, mapear result sets para objetos POJO automaticamente, utilizar recursos como iterações ou cláusulas condicionais no meio do SQL mapeado, e por aí vai.

2. Código Java! (segundos 63 a 72)
Juntar os pedaços é uma tarefa igualmente 'no-brainer'. Primeiramente, inicializamos a camada do iBatis:
String resource = "sql-map-config.xml";
Reader reader = Resources.getResourceAsReader (resource);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMap(reader);

Feito isto, fazemos a consulta chamando o <select> mapeado a partir de seu nome, e fornecendo os parâmetros necessários:

String res = (String) sqlMap.queryForObject ("getCustomerName", new Integer(2));


Para mais detalhes e recursos avançados (mapeamento para POJOs, mecanismo de DAOs, transações), o site do iBatis oferece uns bons tutoriais no seu site.
Ah! O iBatis também tem uma implementação disponível em .net (vai ver por isso não chama 'jBatis'. hohohoho...).

Nenhum comentário: