Referencia a iBatis

RECU-0177 (Recurso Referencia)

Descripción

iBatis es un framework ligero de persistencia que facilita el diseño de la capa de persistencia utilizada en las aplicaciones Java para acceder a nuestro repositorio de datos. Permite que el desarrollador se olvide de la implementación del acceso a datos, únicamente se debe preocupar por realizar una correcta configuración.

iBatis se utiliza principalmente para aquellas aplicaciones en donde el Modelo de Datos está creado previamente y no está normalizado, debido a que iBatis NO es un ORM (Object Relational Mapper) verdadero. En realidad, iBatis propone un modelo de objetos inerte en donde las distintas operaciones de borrado, modificación, lectura,.. sobre estos deben ser trasladados explícitamente a la base de datos y viceversa.

iBatis carga los Objetos con las sentencias SQL mediante un descriptor XML. La simplicidad es la mayor ventaja que presenta iBatis Data Mapper sobre el resto de las herramientas usadas para el mapping relacional de los objetos.

iBatis: Utilizar SQL directamente

El mapeo objeto-relacional (ORM) usa asignación directa para generar código SQL o JDBC. Para algunos escenarios de aplicación, sin embargo, se necesita un control más directo sobre las consultas SQL. Al escribir una aplicación que incluye una serie de consultas de actualización, es más eficaz escribir sus propias consultas SQL que depender de la SQL generada. Además, ORM no se puede utilizar cuando hay un desajuste entre el modelo de objetos y el modelo de datos. Como hemos mencionado, el código JDBC fue la solución común a este tipo de problemas, pero introdujo una gran cantidad de código de base de datos en el código de la aplicación, haciendo que las aplicaciones fueran más difíciles de mantener. Por lo tanto, la capa de persistencia es necesaria para desvincular la aplicación y la base de datos.

iBATIS ayuda a resolver estos problemas. iBATIS es un framework de persistencia que proporciona los beneficios de SQL, pero evita la complejidad de JDBC. A diferencia de la mayoría de los frameworks de persistencia, iBATIS alienta el uso directo de SQL y se asegura que todos los beneficios de SQL no se reemplazan por el framework en sí.

La simplicidad de iBATIS es su mayor ventaja, ya que proporciona una mapeo simple y una API que puede ser utilizada para construir el código de acceso a los datos. En este marco el modelo de datos y el modelo de objetos no precisan un mapeo de unos a otros con precisión. Esto se debe a que iBATIS usa un trazador de datos, que asigna los objetos a los procedimientos almacenados, SQL, o ResultSets a través de un descriptor XML, más que un asignador de metadatos, que asigna los objetos en el dominio de las tablas de la base de datos. Por lo tanto, iBATIS permite el modelo de datos y al modelo de objetos ser independientes el uno del otro.

Consideraciones Generales

iBatis Data Mapper proporciona un modo simple y flexible de mover los datos entre los objetos Java y la base de datos relacional. En resumen, mapeos relacionales a objetos. De este modo, se tiene toda la potencia de SQL sin una línea de código JDBC. SQL Maps reduce considerablemente la cantidad de código necesario para acceder a una base de datos relacional. Este framework mapea la clases a sentencias SQL usando un descriptor XML muy simple. Los pasos que se realizan a la hora de utilizar SQL Maps son lo siguientes:

  • Crear los ficheros de mapeos correspondientes. Los ficheros de mapeos son ficheros XML que contiene nuestro código SQL para realizar determinadas operaciones con sus parámetros de entrada y salida correspondientes.
  • Crear los DTOs equivalentes. Van a contener los parámetros de entrada y de salida que hemos definido previamente en los ficheros de mapeos. Normalmente estos objetos se corresponderán con la/s tabla/s correspondientes de nuestro Modelo de Datos.
  • Crear el código Java trabajando con los ficheros de mapeos.

Algunas de las características de Ibatis son:

  • Soporte para los cursores de Oracle
  • Mapeode múltiples ResultSets con los correspondientes ResultMaps o ResultClasses
  • Soporte para las propiedades privadas de los beans
  • Añade trazas de log en las operaciones previas a la conexión a la base de datos, así como nuevos métodos para seleccionar implementaciones de log específicas.
  • Informa cuando dos ids de un tag son idénticos
  • Permite especificar el timeout de una query
  • Permite al programador manipular el SQL pudiéndose optimizar las queries, las sentencias, etc.

¿Cómo funciona iBATIS?

iBATIS permite la articulación flexible de la base de datos y la aplicación mediante la asignación de la entrada y la salida de la base de datos a los objetos de dominio, introduciendo así una capa de abstracción. La asignación se realiza mediante archivos XML que contienen las consultas SQL. Este acoplamiento flexible permite la asignación de trabajo para sistemas en los que no coinciden la aplicación y el diseño de la base de datos. También ayuda en el tratamiento de bases de datos heredadas y con bases de datos que cambian con el tiempo.

El marco iBATIS utiliza principalmente los siguientes dos archivos XML como descriptores:

  • SQLMapConfig.xml
  • SQLMap.xml

Veremos en detalle cada archivo.

SQLMapConfig.xml

SQLMapConfig.xml es un archivo XML que contiene todos los detalles de configuración, como los detalles de las fuentes de datos, y, opcionalmente, información sobre la gestión de transacciones. Este archivo identifica todos los archivos SQLMap.xml (puede haber más de uno) y los carga.

Considere una clase Empleado que se asigna a una tabla de empleados en la base de datos. Las propiedades de la clase (emp_id, emp_firstname y emp_lastname ) corresponden a las columnas de nombre similar en la tabla. El archivo SQLMapConfig.xml para la clase Employee se puede escribir como:

<sqlMapConfig>
 <transactionManager type="JDBC" commitRequired="false">
  <dataSource type="EMPLOYEE">
   <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
   <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/ibatis"/>
   <property name="JDBC.Username" value="root"/>
   <property name="JDBC.Password" value=""/>
  </dataSource>
 </transactionManager>
 <sqlMap resource="com/mydomain/data/Employee.xml"/>
</sqlMapConfig>

SQLMapConfig.xml utiliza una etiqueta transactionManager para configurar un origen de datos para su uso con este mapa de SQL en particular. Especifica el tipo de la fuente de datos, junto con algunos detalles, incluyendo información sobre el driver, la dirección base de datos, y el nombre de usuario y contraseña. La etiqueta sqlMap especifica la ubicación del archivo SQLMap.xml con el fin de cargarlo.

SQLMap.xml

El otro archivo XML es SQLMap.xml, que es, en la práctica, el nombre de la tabla a la que se refiera. No puede haber cualquier número de archivos de este tipo en una sola aplicación. Este archivo es el lugar donde los objetos de dominio se asignan a las sentencias SQL. Este descriptor usa mapas de parámetros para asignar las entradas a los estados y los mapas de resultados para la asignación de SQL. Este archivo también contiene las consultas. Por lo tanto, para cambiar las consultas, es necesario cambiar el código XML, no el código de la aplicación Java. La transformación se realiza mediante el uso de las declaraciones reales de SQL que van a interactuar con la base de datos. Así, el uso de SQL ofrece una mayor flexibilidad para el desarrollador y hace que iBATIS sea fácil de comprender para cualquier persona con experiencia de programación SQL.

El archivo SQLMap.xml que define las instrucciones SQL para realizar un mantenimiento en la tabla Employee se muestra a continuación

<sqlMap namespace="Employee">
 <typeAlias alias="Employee" type="com.sample.Employee"/>
  <resultMap id="EmpResult" class="Employee">
  <result property="id" column="emp_id"/>
  <result property="firstName" column="emp_firstname"/>
  <result property="lastName" column="emp_lastname"/>
 </resultMap>
 <select id="selectAllEmps" resultMap="EmpResult">
 select * from EMPLOYEE
 </select>
 <select id="selectEmpById" parameterClass="int" resultClass="Employee">
 <select emp_id as id,emp_firstname as firstName,emp_lastname as lastName from EMPLOYEE where emp_id= #id# </select>
 <insert id="insertEmp" parameterClass="Employee"> insert into EMPLOYEE ( emp_id, emp_firstname, emp_lastname) values ( #id#, #firstName# , #lastName# ) </insert>
 <update id="updateEmp" parameterClass="Employee"> update EMPLOYEE set emp_firstname = #firstName#, emp_lastname = #lastName# where emp_id = #id# </update>
 <delete id="deleteEmp" parameterClass="int"> delete from EMPLOYEE where emp_id = #id# </delete> </sqlMap>

La etiqueta typeAlias se utiliza para representar los alias de tipo, para evitar tener que escribir el nombre completo de la clase cada vez. Contiene la etiqueta resultMap que describe la asignación entre las columnas que se devuelven en una consulta y las propiedades de la clase representada por la clase Employee. La etiqueta resultMap es opcional y no es necesaria si las columnas de la tabla de alias coinciden con las propiedades de la clase exactamente. Esta etiqueta resultMap es seguida por una serie de consultas. SQLMap.xml puede contener cualquier número de consultas. Todos los seleccionar, insertar, actualizar y eliminar están escritas en sus etiquetas respectivas. Cada declaración se nombra usando el atributo de id.

El resultado de una consulta de selección puede ser asignado a un resultMap o a una clase de resultado que es un JavaBean. Los alias en las consultas deben coincidir con las propiedades de la clase del resultado de destino (es decir, el JavaBean). El atributo parameterClass se utiliza para especificar al JavaBean que propiedades son las entradas. Los parámetros en el símbolo de hash son las propiedades del JavaBean.

Cuándo utilizar iBATIS

iBATIS se utiliza mejor cuando se necesita el control completo del SQL. También es útil cuando las consultas SQL deben afinarse. IBATIS no debe ser utilizada cuando se tiene control completo sobre la aplicación y el diseño de la base de datos porque, en estos casos, la solicitud podría ser modificada para adaptarse a la base de datos, o viceversa. En tales situaciones son preferibles otras herramientas de ORM. También es inapropiado para las bases de datos relacionales, ya que esas bases de datos no soportan las operaciones y otras características clave que utiliza iBATIS.

Ejemplos

Dentro del catálogo interno de la Junta de Andalucía se encuentra el proyecto MARISMA, en el cual se hace uso de iBatis para solventar el uso de la persistencia. Este proyecto sirve de inventario de software de una organización.

Para comenzar a utilizar iBatis dentro de un proyecto JEE es necesario configurar varios ficheros XML y declarar en iBatis DAO las clases que implementan la interfaz y el comportamiento específico.

Utilización de iBatis DAO

Será necesario crear el fichero dao.xml, donde se indicarán todas las interfaces utilizadas y las clases que las implementan.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE daoConfig PUBLIC "-//ibatis.apache.org//DTD DAO Configuration 2.0//EN" "http://ibatis.apache.org/dtd/dao-2.dtd">
<daoConfig>
  <context>
    <transactionManager type="SQLMAP">
    <property name="SqlMapConfigResource"  value="com//viavansi//marisma//negocio//DAO//xml//sqlMapConfig.xml"/>
    </transactionManager>   
        <!-- TABLAS ->   
        <dao interface="com.viavansi.marisma.negocio.DAO.CartograficoDAO" implementation="com.viavansi.marisma.negocio.DAO.CartograficoDAOImpl"/>
        <dao interface="com.viavansi.marisma.negocio.DAO.CdsDAO" implementation="com.viavansi.marisma.negocio.DAO.CdsDAOImpl"/>
        <dao interface="com.viavansi.marisma.negocio.DAO.EconomicoDAO" implementation="com.viavansi.marisma.negocio.DAO.EconomicoDAOImpl"/>   
        ...       
        <!-- VISTAS -->       
        <dao interface="com.viavansi.marisma.negocio.DAO.ViewUnidadadminDAO" implementation="com.viavansi.marisma.negocio.DAO.ViewUnidadadminDAOImpl"/>
<dao interface="com.viavansi.marisma.negocio.DAO.ViewPerfilusuarioDAO" implementation="com.viavansi.marisma.negocio.DAO.ViewPerfilusuarioDAOImpl"/>
        <dao interface="com.viavansi.marisma.negocio.DAO.ViewHeradmonDAO" implementation="com.viavansi.marisma.negocio.DAO.ViewHeradmonDAOImpl"/>       
        ...           
        <!-- SAETA -->
        <dao interface="com.viavansi.marisma.negocio.DAO.ViewTercerosDAO" implementation="com.viavansi.marisma.negocio.DAO.ViewTercerosDAOImpl"/>
        <dao interface="com.viavansi.marisma.negocio.DAO.ViewGeneralDAO" implementation="com.viavansi.marisma.negocio.DAO.ViewGeneralDAOImpl"/>
        <dao interface="com.viavansi.marisma.negocio.DAO.ViewLotesxexpDAO" implementation="com.viavansi.marisma.negocio.DAO.ViewLotesxexpDAOImpl"/>     
  </context>
</daoConfig>

Crear una utilidad de configuración para DaoConfig.xml (.java)

public class DaoConfig {
        private static final String DAO_XML = "es/dxd/km/dao/dao.xml";
private static final DaoManager daoManager;
static {
    try {
        daoManager = newDaoManager();
    } catch (Exception e) {
        throw new RuntimeException("Description. Cause: " + e, e);
    }
}
public static DaoManager getDaoManager() {
    return daoManager;
}
public static DaoManager newDaoManager() {
    try {
        Reader reader = Resources.getResourceAsReader(DAO_XML);
        return DaoManagerBuilder.buildDaoManager(reader, null);
    } catch (Exception e) {
        throw new RuntimeException("Could not initialize DaoConfig. Cause: " +         e, e);
    }
}
}

Dentro del proyecto MARISMA, esta clase se encuentra en el paquete com.viavansi.persistencia.ibatis dentro del fichero de librería avansiLib-old-all-1.0.2.jar. Crear las interfaces del DAO para cada una de las interfaces que se utilicen. Por ejemplo, dentro del proyecto marisma, se crea la interface CartograficoDAO(.java)

package com.viavansi.marisma.negocio.DAO;
import com.viavansi.marisma.negocio.VO.Cartografico;
import com.viavansi.marisma.negocio.VO.CartograficoExample;
import java.util.List;
public interface CartograficoDAO {
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    Long insert(Cartografico record);
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    int updateByPrimaryKey(Cartografico record);
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    int updateByPrimaryKeySelective(Cartografico record);
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    List selectByExample(CartograficoExample example);
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    Cartografico selectByPrimaryKey(Long idcartografico);
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    int deleteByExample(CartograficoExample example);
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    int deleteByPrimaryKey(Long idcartografico);
}

Crear la clase que implemente a esta interface En este caso CartograficoDAOImpl (.java)

package com.viavansi.marisma.negocio.DAO;
import com.ibatis.dao.client.DaoManager;
import com.ibatis.dao.client.template.SqlMapDaoTemplate;
import com.viavansi.marisma.negocio.VO.Cartografico;
import com.viavansi.marisma.negocio.VO.CartograficoExample;
import java.util.List;
public class CartograficoDAOImpl extends SqlMapDaoTemplate implements CartograficoDAO {
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    public CartograficoDAOImpl(DaoManager daoManager) {
        super(daoManager);
    }
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    public Long insert(Cartografico record) {
        Object newKey = insert("MARISMA2MG_MA_CARTOGRAFICO.abatorgenerated_insert", record);
        return (Long) newKey;
    }
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    public int updateByPrimaryKey(Cartografico record) {
        int rows = update("MARISMA2MG_MA_CARTOGRAFICO.abatorgenerated_updateByPrimaryKey", record);
        return rows;
    }
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    public int updateByPrimaryKeySelective(Cartografico record) {
        int rows = update("MARISMA2MG_MA_CARTOGRAFICO.abatorgenerated_updateByPrimaryKeySelective", record);
        return rows;
    }
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    public List selectByExample(CartograficoExample example) {
        List list = queryForList("MARISMA2MG_MA_CARTOGRAFICO.abatorgenerated_selectByExample", example);
        return list;
    }
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    public Cartografico selectByPrimaryKey(Long idcartografico) {
        Cartografico key = new Cartografico();
        key.setIdcartografico(idcartografico);
        Cartografico record = (Cartografico) queryForObject("MARISMA2MG_MA_CARTOGRAFICO.abatorgenerated_selectByPrimaryKey", key);
        return record;
    }
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    public int deleteByExample(CartograficoExample example) {
        int rows = delete("MARISMA2MG_MA_CARTOGRAFICO.abatorgenerated_deleteByExample", example);
        return rows;
    }
    /**
     * This method was generated by Abator for iBATIS.
     * This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
     *
     * @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
     */
    public int deleteByPrimaryKey(Long idcartografico) {
        Cartografico key = new Cartografico();
        key.setIdcartografico(idcartografico);
        int rows = delete("MARISMA2MG_MA_CARTOGRAFICO.abatorgenerated_deleteByPrimaryKey", key);
        return rows;
    }

Creación de los ficheros sqlmap

El marco de trabajo SQL Maps es tolerante tanto con las malas implementaciones de los modelos de datos, como con las malas implementaciones de los modelos de objetos. A pesar de ello, es muy recomendable utilizar las mejores practicas tanto al diseñar la base de datos (normalización apropiada, etc.), como al diseñar el modelo de objetos. Así, se garantizará un mejor rendimiento y un diseño más claro.

Creación del fichero con la configuración sqlMapConfig.xml

El fichero de configuración es un fichero XML dentro del cual se configurarán ciertas propiedades, el DataSource JDBC y los mapeos SQL que utilice la aplicación.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!--
  <properties resource="properties/database.properties"/>
 -->
 <settings useStatementNamespaces="true" />
 
  <transactionManager type="JDBC">
                      <dataSource type="JNDI">
             <property name="DBJndiContext" value="java:comp/env/POOL_JDBC"/>
        </dataSource>
   
  </transactionManager>
          <!-- TABLAS -->
          <sqlMap resource="com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG&#95;MA&#95;CARTOGRAFICO&#95;SqlMap.xml"/>
          <sqlMap resource="com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG&#95;MA&#95;CDS&#95;SqlMap.xml"/>
          <sqlMap resource="com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG&#95;MA&#95;ECONOMICO&#95;SqlMap.xml"/>
          ...
          <!-- VISTAS -->
          <sqlMap resource="com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG&#95;MA&#95;VIEW&#95;CARTOGRAFICO&#95;SqlMap.xml"/>
          <sqlMap resource="com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG&#95;MA&#95;VIEW&#95;SOLCART&#95;SqlMap.xml"/>
          <sqlMap resource="com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG&#95;MA&#95;VIEW&#95;PERFILUSUARIO&#95;SqlMap.xml"/>
         
        ...
         
          <!-- SAETA -->
          <sqlMap resource="com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG&#95;MA&#95;VIEW&#95;TERCEROS&#95;SqlMap.xml"/>   
          <sqlMap resource="com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG&#95;MA&#95;VIEW&#95;GENERAL&#95;SqlMap.xml"/>
          <sqlMap resource="com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG&#95;MA&#95;VIEW&#95;SAETA&#95;SqlMap.xml"/>         
        ...
           <!-- FILTROS -->
           <sqlMap resource="com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG&#95;FILTRO&#95;INFORME&#95;TECNOLOGICO&#95;SqlMap.xml"/>
</sqlMapConfig>

Fichero de SQL Map

Una vez configurado el DataSource y listo el fichero de configuración central, es necesario proporcionar al fichero de SQL Map con el código SQL y los mapeos para cada uno de los objetos parámetro y de los objetos resultado (entradas y salidas respectivamente). Se configuran las operaciones y las sentencias sql para este sqlMap. Por ejemplo, siguiendo con el módulo de cartografía del proyecto marisma, se encuentra el fichero MARISMA2MG_MA_CARTOGRAFICO_SqlMap.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="MARISMA2MG_MA_CARTOGRAFICO">
  <resultMap class="com.viavansi.marisma.negocio.VO.Cartografico" id="abatorgenerated_CartograficoResult">
    <!--
      WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
      This element was generated on Fri Feb 16 12:16:54 UTC 2007.
    -->
    <result column="IDCARTOGRAFICO" jdbcType="NUMERIC" property="idcartografico"/>
    <result column="IDTECNOLOGICO" jdbcType="NUMERIC" property="idtecnologico"/>
    <result column="ENTORNO" jdbcType="VARCHAR" property="entorno"/>
    <result column="IDVISORCART" jdbcType="NUMERIC" property="idvisorcart"/>
    <result column="IDGISPER" jdbcType="NUMERIC" property="idgisper"/>
    <result column="IDGISESC" jdbcType="NUMERIC" property="idgisesc"/>
    <result column="GEOBDPERSONAL" jdbcType="NUMERIC" property="geobdpersonal"/>
    <result column="FICHEROSCART" jdbcType="NUMERIC" property="ficheroscart"/>
  </resultMap>
  <sql id="abatorgenerated_Example_Where_Clause">
    <!--
      WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
      This element was generated on Fri Feb 16 12:16:54 UTC 2007.
    -->
    <iterate conjunction="or" prepend="where" property="oredCriteria" removeFirstPrepend="iterate">
      (
      <iterate conjunction="and" prepend="and" property="oredCriteria[].criteriaWithoutValue">
        $oredCriteria[].criteriaWithoutValue[]$
      </iterate>
      <iterate conjunction="and" prepend="and" property="oredCriteria[].criteriaWithSingleValue">
        $oredCriteria[].criteriaWithSingleValue[].condition$
          #oredCriteria[].criteriaWithSingleValue[].value#
      </iterate>
      <iterate conjunction="and" prepend="and" property="oredCriteria[].criteriaWithListValue">
        $oredCriteria[].criteriaWithListValue[].condition$
        <iterate close=")" conjunction="," open="(" property="oredCriteria[].criteriaWithListValue[].values">
          #oredCriteria[].criteriaWithListValue[].values[]#
        </iterate>
      </iterate>
      <iterate conjunction="and" prepend="and" property="oredCriteria[].criteriaWithBetweenValue">
        $oredCriteria[].criteriaWithBetweenValue[].condition$
        #oredCriteria[].criteriaWithBetweenValue[].values[0]# and
        #oredCriteria[].criteriaWithBetweenValue[].values[1]#
      </iterate>
      )
    </iterate>
  </sql>
  <select id="abatorgenerated_selectByPrimaryKey" parameterClass="com.viavansi.marisma.negocio.VO.Cartografico" resultMap="abatorgenerated_CartograficoResult">
    <!--
      WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
      This element was generated on Fri Feb 16 12:16:54 UTC 2007.
    -->
    select IDCARTOGRAFICO, IDTECNOLOGICO, ENTORNO, IDVISORCART, IDGISPER, IDGISESC, GEOBDPERSONAL,
      FICHEROSCART
    from MARISMA2MG.MA_CARTOGRAFICO
    where IDCARTOGRAFICO = #idcartografico:NUMERIC#
  </select>
  <select id="abatorgenerated_selectByExample" parameterClass="com.viavansi.marisma.negocio.VO.CartograficoExample" resultMap="abatorgenerated_CartograficoResult">
    <!--
      WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
      This element was generated on Fri Feb 16 12:16:54 UTC 2007.
    -->
    select IDCARTOGRAFICO, IDTECNOLOGICO, ENTORNO, IDVISORCART, IDGISPER, IDGISESC, GEOBDPERSONAL,
      FICHEROSCART
    from MARISMA2MG.MA_CARTOGRAFICO
    <isParameterPresent>
      <include refid="MARISMA2MG_MA_CARTOGRAFICO.abatorgenerated_Example_Where_Clause"/>
      <isNotNull property="orderByClause">
        order by $orderByClause$
      </isNotNull>
    </isParameterPresent>
  </select>
  <delete id="abatorgenerated_deleteByPrimaryKey" parameterClass="com.viavansi.marisma.negocio.VO.Cartografico">
    <!--
      WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
      This element was generated on Fri Feb 16 12:16:54 UTC 2007.
    -->
    delete from MARISMA2MG.MA_CARTOGRAFICO
    where IDCARTOGRAFICO = #idcartografico:NUMERIC#
  </delete>
  <delete id="abatorgenerated_deleteByExample" parameterClass="com.viavansi.marisma.negocio.VO.CartograficoExample">
    <!--
      WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
      This element was generated on Fri Feb 16 12:16:54 UTC 2007.
    -->
    delete from MARISMA2MG.MA_CARTOGRAFICO
    <include refid="MARISMA2MG_MA_CARTOGRAFICO.abatorgenerated_Example_Where_Clause"/>
  </delete>
  <insert id="abatorgenerated_insert" parameterClass="com.viavansi.marisma.negocio.VO.Cartografico">
    <!--
      WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
      This element was generated on Fri Feb 16 12:16:54 UTC 2007.
    -->
    <selectKey keyProperty="idcartografico" resultClass="java.lang.Long">
      select  MARISMA2MG.MA_SEQ_CARTOGRAFICO.nextval from DUAL
    </selectKey>
    insert into MARISMA2MG.MA_CARTOGRAFICO (IDCARTOGRAFICO, IDTECNOLOGICO, ENTORNO, IDVISORCART,
      IDGISPER, IDGISESC, GEOBDPERSONAL, FICHEROSCART)
    values (#idcartografico:NUMERIC#, #idtecnologico:NUMERIC#, #entorno:VARCHAR#,
      #idvisorcart:NUMERIC#, #idgisper:NUMERIC#, #idgisesc:NUMERIC#, #geobdpersonal:NUMERIC#,
      #ficheroscart:NUMERIC#)
  </insert>
  <update id="abatorgenerated_updateByPrimaryKey" parameterClass="com.viavansi.marisma.negocio.VO.Cartografico">
    <!--
      WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
      This element was generated on Fri Feb 16 12:16:54 UTC 2007.
    -->
    update MARISMA2MG.MA_CARTOGRAFICO
    set IDTECNOLOGICO = #idtecnologico:NUMERIC#,
      ENTORNO = #entorno:VARCHAR#,
      IDVISORCART = #idvisorcart:NUMERIC#,
      IDGISPER = #idgisper:NUMERIC#,
      IDGISESC = #idgisesc:NUMERIC#,
      GEOBDPERSONAL = #geobdpersonal:NUMERIC#,
      FICHEROSCART = #ficheroscart:NUMERIC#
    where IDCARTOGRAFICO = #idcartografico:NUMERIC#
  </update>
  <update id="abatorgenerated_updateByPrimaryKeySelective" parameterClass="com.viavansi.marisma.negocio.VO.Cartografico">
    <!--
      WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
      This element was generated on Fri Feb 16 12:16:54 UTC 2007.
    -->
    update MARISMA2MG.MA_CARTOGRAFICO
    <dynamic prepend="set">
      <isNotNull prepend="," property="idtecnologico">
        IDTECNOLOGICO = #idtecnologico:NUMERIC#
      </isNotNull>
      <isNotNull prepend="," property="entorno">
        ENTORNO = #entorno:VARCHAR#
      </isNotNull>
      <isNotNull prepend="," property="idvisorcart">
        IDVISORCART = #idvisorcart:NUMERIC#
      </isNotNull>
      <isNotNull prepend="," property="idgisper">
        IDGISPER = #idgisper:NUMERIC#
      </isNotNull>
      <isNotNull prepend="," property="idgisesc">
        IDGISESC = #idgisesc:NUMERIC#
      </isNotNull>
      <isNotNull prepend="," property="geobdpersonal">
        GEOBDPERSONAL = #geobdpersonal:NUMERIC#
      </isNotNull>
      <isNotNull prepend="," property="ficheroscart">
        FICHEROSCART = #ficheroscart:NUMERIC#
      </isNotNull>
    </dynamic>
    where IDCARTOGRAFICO = #idcartografico#
  </update>
</sqlMap>

Consulta con paso de parámetros

Cuando se define una sentencia que necesita parámetros para ejecutarse, hay que decidir como se le pasan esos parámetros. Se le pueden pasar bien mediante un parameterClass (una clase) o bien mediante un parameterMap (colección de parámetros).

Paso de parámetros con 'parameterClass'

Si la sentencia va a recoger los parámetros de una clase (parameterClass), en la sentencia se pueden utilizar los nombres de las propiedades de esa clase.

<select id="findByFilter" resultMap="cabeceraListadoResult" parameterClass="filtroUsuario" cacheModel="listado-cache">
             SELECT t 1.CIDCAB, t1.CIDTTA, t2.DDESCTTA, t1.CIDESTAC, t4.DDESCEST, t3.FLOBJETI, t1.DENTPOBL, t1.DDIRECCI, t1.CONTREXT, t1.CPRIORID,
             case t1.CPRIORID when 1 then 'Urgente' else 'Normal' end DDESCPRIOR
             FROM dsc5c04.t5cabec t1,  dsc5c04.t5tipta t2, dsc5c04.T5CABOS t3, dsc5c04.T5ESTTA t4
             WHERE t1.cemptitu=#empresaTitularID# and t1.cidutaac=#pdsID#
             and t1.CIDTTA= t2.CIDTTA
             and t1.CIDCAB=t3.CIDCAB
             and t1.CIDESTAC= t4.CIDEST
        </select>

Paso de parámetros con 'parameterMap'

Si la sentencia espera un mapa de parámetros (parameterMap), en la sentencia solo se pueden utilizar los nombres de las propiedades del Map cuando la sentencia es dinámica, si es estática solo se pueden utilizar interrogaciones y las propiedades en el Map tiene que tener el mismo orden que espera la sentencia.

<parameterMap id="usuarioTarea" class="map"> 
    <parameter property="empresaTitularID" javaType="java.lang.Integer"/>
    <parameter property="pdsID" javaType="java.lang.Integer"/>
    <parameter property="idTarea" javaType="java.lang.Integer"/>              </parameterMap>
        <select id="findByPrimaryKey" resultMap="cabeceraDetalleResult" parameterMap="usuarioTarea">
            SELECT t1.CIDCAB, t1.CIDTTA, t1.DDIRECCI,t1.CONTREXT, t1.CMONORE,
               case t1.cmonore when ' ' then 1 else 0 end REALIZADO
            FROM Dsc5c04.t5cabec t1
            WHERE  t1.cemptitu=? and t1.cidutaac=?  and t1.CIDCAB=?
        </select>

Ejemplo de uso para recuperar datos de BBDD

Ahora que la instancia de SqlMap está inicializada y es accesible de forma sencilla, podrá realizarse uso de ella. Para obtener un objeto map de la base de datos, simplemente se necesita la instancia de SqlMap, el nombre de la sentencia a ejecutar y un ID dentro de la BBDD. Así por ejemplo, el siguiente método realiza un acceso a BBDD para recuperar todos los registros de la tabla donde se encuentran los elementos cartográficos:

/**
     * @param args
     */
    public static void main(String[] args) {
        // getComboCartografico(){
            CartograficoBO bo= CartograficoBO.getCurrentInstance();
            try{
                List list= (List)bo.findAll();
                List combos= new LinkedList();
                // recorro la colección generando la  combo
                for (Iterator it = list.iterator(); it.hasNext();) {
                    Cartografico vo = (Cartografico) it.next();
                    if (vo.getIdcartografico().equals("?") || vo.getIdcartografico().equals("&#65533;?")){
                        combos.add(0, new SelectItem(vo.getIdcartografico(),""));
                    }else{
                        combos.add(new SelectItem(vo.getIdcartografico(),""+vo.getIdtecnologico()));
                    }
                }
                System.out.println(combos);
            }catch(Exception e){
                System.out.println("ERROR_NO_FOUND_COMBO_IDTIPOEMPRESA" +     e.getMessage());
            }
        }

Enlaces externos

Contenidos relacionados

Pautas
Área: Desarrollo » Construcción de Aplicaciones por Capas » Capa de Persistencia » Java
Código Título Tipo Carácter
PAUT-0311 Uso de iBatis Pauta Directriz Recomendada