IBatis (MyBatis): Trabalhando com Construtores
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: Mybatis, MySQL 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! :)