IBatis (MyBatis): Trabalhando com Construtores

10 Mar 2011
2 mins read

Este tutorial tem como objetivo fazer o setup de uma aplicação Java usando iBatis (MyBatis) demonstrando o uso de contrutores com argumentos (parâmetros).

Pré-Requisitos

Para este tutorial usei:

IDE: Eclipse (você pode usar a sua IDE favorita)
DataBase: MySQL
Libs/jars: MybatisMySQL conector e JUnit (para testes)

No Eclipse, a estrutura do seu projeto vai ficar assim:

Dados de Exemplo

Execute o script que está dentro da pasta sql antes de começar o projeto. Este arquivo contém os dados de exemplo usados neste tutorial.

1 - Blog POJO

Representei o POJO que vamos usar neste tutorial com um diagrama UML, mas você pode fazer o download do código fonte completo no final deste tutorial.

Como podem ver, não temos um construtor padrão na classe Blog, apenas temos um construtor com argumentos. Alguns frameworks de persistência não suportam esse tipo de situação, mas você precisa ter cuidado ao implementar a lógica de negócio.

Vamos dizer que você tem dois atributos na sua classe que são obrigatórios (não podem ser nulos), e apenas um construtor padrão (aquele new Blog()). Nada te impede de instanciar a classe e tentar fazer um insert ou update no banco. E aí você tem uma exception. Para prevenir esse tipo de situação, você pode criar um construtor com argumentos e não ter o construtor padrão.

2 - Blog Mapper - XML

Para injetar os resultados no construtor, o MyBatis precisa identificar o contrutor pelo tipo e seus parâmetros. Em Java não existe uma maneira para introspectar (ou refletir) o nome de parâmetros. Quando for cirar um elemento construtor, tenha certeza de que os argumentos estão na ordem correta (declaração) e que todos os tipos de dados estão especificados.

Usar construtor não impede que você tenha outros results mapeados. Você ainda pode ter outros atributos, association, collection, etc.

O nosso arquivo Blog.xml com um elemento constructor declarado:

[code lang="xml" firstline="1" toolbar="true" collapse="false" wraplines="false"]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="Blog">

<resultMap id="resultBlog" type="Blog">
<constructor>
<idArg column="id" javaType="int"/>
<arg column="url" javaType="String"/>
</constructor>
<result property="name"/>
</resultMap>

<select id="selectBlog" resultMap="resultBlog">
SELECT idBlog as id, name, url FROM BLOG
</select>

</mapper>
[/code]

3 - Blog Mapper - Annotations

Agora que fizemos as configurações em XML, vamos ver como fica usando annotations.

Esse é o código para a classe BlogMapper.java:
[code lang="java" firstline="1" toolbar="true" collapse="false" wraplines="false"]
package com.loiane.data;

import java.util.List;

import org.apache.ibatis.annotations.Arg;
import org.apache.ibatis.annotations.ConstructorArgs;
import org.apache.ibatis.annotations.Select;

import com.loiane.model.Blog;

public interface BlogMapper {

/**
* Returns the list of all Blog instances from the database.
* @return the list of all Blog instances from the database.
*/
@Select("SELECT idBlog as id, name, url FROM BLOG ")
@ConstructorArgs(value = {
@Arg(column="id",javaType=Integer.class),
@Arg(column="url",javaType=String.class)
})
List<Blog> selectAllBlogs();
}
[/code]
Vamos dar uma olhada nas annotations @ConstructorArgs e @Arg:

@ConstructorArgs

Coleta um grupo de results para serem passados para um construtor.

Atributos: value, que é um array de Args.

Equivalente em XML: constructor

@Arg

Apenas um argumento do construtor que faz parte do array de Args do ContructorArgs.

Atributos: id, column, javaType, jdbcType, typeHandler.

O atributo id é um valor booleano que identifica a propriedade a ser usada em comparações, similar ao elemento idArg no XML;

Equivalente em XML: idArg, arg

Não precisamos usar a annotation @Results pois os outros atributos possuem o mesmo nome no result set. Mas se precisa, pode usar como fizemos em exemplos anteriores.

Download

Se desejar, pode fazer o download do código completo na minha conta do GitHub: https://github.com/loiane/ibatis-constructor

Se desejar fazer o download do arquivo zip do projeto, clique em download (depois é só importar no Eclipse ou outra IDE):

Mais artigos sobre iBatis estão por vir. Fique ligado!

Bons códigos! :)