iBatis lo mejor del SQL Dinámico y de los ORM

21/11/2013

Cuando desarrollamos aplicaciones, normalmente necesitamos gestionar el acceso a datos con una base de datos.

›En programación, existen diversos patrones de acceso a datos: procedimientos almacenados,  SQL inyectado, SQL dinámico y ORM cada uno con sus ventajas y desventajas.

Tabla comparativa de acceso a datos

Tabla comparativa de acceso a datos

¿Qué es iBatis?
›iBatis es una solución híbrida que intenta usar lo mejor del SQL Dinámico y del mapeo ORM.
›
›Con iBatis podemos usar la gran flexibilidad del SQL Dinámico (JDBC) sin generar tanto código y ser fácilmente reutilizable. También obtenemos la facilidad del mapeo de los ORM (hibernate) pero evitamos su rigidez (mapeamos  clases a SQL, no a tablas).

›Para ello usa ficheros xml de configuración que le sirven como mapeador para la capa de persistencia a datos.
A diferencia de los ORM, iBatis es un mapeador de datos. En concreto mapea clases a SQL. Se diferencia de un ORM en que no mapea a tablas, sino a SQL directamente usando varios ficheros xml de configuración.
iBatis mapea a SQL en vez de a tablas

iBatis mapea a SQL en vez de a tablas

¿Qué ventajas obtenemos de usar iBatis y no otros ORM?
›SQL Externalizado: Todo el mapeo está externalizado en ficheros xml que pueden ser compartidos fácilmente entre distintos lenguajes de programación y/o arquitecturas: Java, .NET… En la aplicación no aparece por ningún sitio código SQL.
›
›SQL Encapsulado: iBatis usa XML para encapsular el SQL, usando parámetros de entrada/salida (interfaces), ocultando el SQL al resto de la aplicación, haciéndolo más portable.
Veamos un ejemplo:
Declaramos una clase POJO que es un COCHE
›public class Coche {

    private Integer id;
    private String marca; 

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;

    }

    public String getMarca() {
        return marca;

    }

    public void setMarca(String marca) {
        this.marca = marca;
    } 

}

Declaramos un fichero de configuración xml donde configuramos el acceso vía JDBC a la base de datos (en este caso una b.d mySQL en local). La parte más interesante de este xml, es el apartado de mappers en donde indicamos claramente que existe un fichero coche.xml que es el que nos va a servir para mapear el POJO coche a SQL y a la tabla de mySQL.

<?xml version=”1.0″ encoding=”UTF-8″ ?>
<!DOCTYPE configuration PUBLIC “-//mybatis.org//DTD Config 3.0//EN”
http://mybatis.org/dtd/mybatis-3-config.dtd”&gt;

 <configuration>
<environments default=”development”>
<environment id=”development”>
<transactionManager type=”JDBC”/>
<dataSource type=”POOLED”>
   <property name=”driver” value=”com.mysql.jdbc.Driver”/>
   <property name=”url” value=”jdbc:mysql://localhost/coches”/>
   <property name=”username” value=”root”/>
   <property name=”password” value=“root/>
</dataSource>
</environment>
</environments>

<mappers>
   <mapper resource=”com/persistencia/xml/coche.xml”/>

</mappers>

</configuration>

En el fichero coches.xml declaro dos mapeos que pueden ser llamadas desde el propio código de la aplicación: getCoche e insertCoche. En los mapeos indicamos los parámetros de entrada y salida. Con resultType indicamos  el objeto que vamos a devolver, en concreto nuestro POJO. Fijémonos que también indicamos la propia SQL que es pasada directamente a la base de datos.

<?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”&gt;

<mapper namespace=”com.persistencia.xml.coche”> 

<select id=”getCoche” parameterType=”int” resultType=”com.persistencia.beans.Coche”>
select * from coche where id_coche = #{id}
</select>

<insert id=”insertCoche” parameterType=”com.persistencia.beans.Coche” >
   insert into coche (id_coche, marca) values (#{id},#{marca})

</insert>

</mapper>

Por último nos queda el código de la aplicación. Lo primero que hacemos es utilizar un objeto SqlSessionFactory para mapear el fichero de configuración xml de ibatis. Puesto que dicho fichero ya contiene los mapeadores xml de los POJOs, no tenemos que hacer ya nada más. iBatis sabría localizar el resto de ficheros xml de mapeo. Después usamos el objeto SqlSession para crear una sesión con iBatis.

En la propia aplicación podemos ver que creamos un objeto Coche, y luego sobre el objeto SqlSession llamamos al método insert donde pasamos precisamente nuestro objeto coche y la función de mapeo del fichero xml configurado: insertCoche. Puesto que estamos insertando es necesario llamar a commit del objeto SqlSession para confirmar la transacción.

En el caso de la recuperacion de dicho objeto, vemos que llamamos al método selectOne del objeto SqlSession donde le pasaremos la función de mapeo de recuperación de coches: getCoche y un parámetro con el número de coche a recuperar.

public class Aplicacion {

  public static void main(String[] args) throws IOException { 
       String resource = “com/persistencia/xml/configuracionibatis.xml”;
       Reader reader = Resources.getResourceAsReader(resource);
       SqlSessionFactory sqlMap = new SqlSessionFactoryBuilder().build(reader);
       SqlSession session = sqlMap.openSession(); 

      try{

  // Insertamos un coche 
  Coche coche = new Coche();
  coche.setMarca(“Ford”);
  coche.setId(1);
  session.insert(“insertCoche”, coche);
  System.out.println(“Insertado el primer coche”); 
  session.commit();

  // Recuperamos el primer coche
  Integer claveCoche = new Integer(1);

  Coche coche2 = (Coche) session.selectOne(“getCoche”, claveCoche);
  System.out.println(“El modelo del primer coche es: ” + coche2.getMarca());

        } finally { 

      session.close();

       }

  }

}

Para más información sobre iBatis, podéis usar la documentación oficial:

http://mybatis.github.io/mybatis-3/es/index.html

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: