09/04/2014

iBatis y HashMap

Cuando se utiliza iBatis o MyBatis, como se llama actualmente el paquete, muchas veces resulta tedioso tener que crear clases que incluyan como atributos todos lo campos a recuperar de una query, para evitarlo hay una alternativa muy sencilla, que puede resultar un poco complicado encontrar.

MyBatis logo
MyBatis logo

La alternativa es crear un java.util.HashMap como resultClass y ejecutar la query con un queryForList. A continuación incluyo un ejemplo lo más sencillo y claro posible.

[pastacode provider=»manual» lang=»markup»]


    <resultMap id="myResultMap"     				class="java.util.HashMap">
        <result property="VAL1"          column="CODE" />
        <result property="VAL2"          column="DESCRIPTION" />
        <result property="VAL3"          column="VALUE" />
    </resultMap>

[/pastacode]

No es necesario que los nombres de las property coincidan con los nombres de las column.

[pastacode provider=»manual» lang=»sql»]
<select id=»nombre-de-la-query» parameterClass=»java.lang.Integer» resultMap=»myResultMap»>
select
campo1 as CODE,
campo2 as DESCRIPTION,
campo3 as VALUE
from
TABLE1
where
TABLE1.ID = #id#
</select>
[/pastacode]

Los nombres que se utilizan al definir las columnas del resultMap, tienen que coincidir con el resultado de la ejecución de la query.

[pastacode provider=»manual» lang=»java»]

List<HashMap> data = (List<HashMap>)sqlMap.queryForList("nombre-de-la-query", id);
for( HashMap temp : data){
    System.out.println((String)temp.get("VAL1"));
    System.out.println((String)temp.get("VAL2"));
    System.out.println((String)temp.get("VAL3"));
}

[/pastacode]

Para acceder a las propiedades, utilizaremos el nombre definido en el resultMap como property.

Esta manera de recuperar información con iBatis nos permite realizar consultas complejas y utilizar objetos preexistentes para guardar o utilizar la información; aunque nos libera de la necesidad de crear las clases con los objetos ad-hoc para cada una de las consultas, lo que puede agilizar sensiblemente la construcción de las consultas.