Anda di halaman 1dari 21

MADEJA - iBatis

iBatis

Descripción

iBatis es un framework de código abierto basado en capas desarrollado por Apache, que se ocupa de la capa de
persistencia (se sitúa entre la capa de negocio y la capa de la base de datos). Simplifica la implementación del
patrón de diseño Direct Access Objects (DAO) y la persistencia de objetos en bases de datos relacionales.

iBatis no es un ORM (Object Relational Mapper), es decir, no es una técnica de programación para convertir
datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en
base de datos; por lo que se pueden utilizar modelos de datos existentes o poco normalizados y, finalmente,
no es completamente transparente (el programador programa el SQL). iBatis asocia objetos de modelo
(JavaBeans) con sentencias SQL o procedimientos almacenados mediante ficheros descriptores XML,
simplificando la utilización de bases de datos.

• Características
• Ventajas e inconvenientes
• Versiones
• Requisitos e incompatibilidades
• Integración con otros componentes
• Modo de empleo
• Enlaces de interés
• Recomendaciones de uso
• Aplicaciones de ejemplo

Page 1 - 08/04/2010 a las 15:22


MADEJA - iBatis

Características

La capa de Persistencia se puede subdividir en tres subcapas:

• La capa de abstracción será el interfaz con la capa de la lógica de negocio, haciendo las veces de
##fachade## entre la aplicación y la persistencia. Se implementa de forma general mediante el patrón
Data Access Object (DAO), y particularmente en iBatis se implementa utilizando su framework DAO
(ibatis-dao.jar). Esta capa se configura mediante el fichero dao.xml.
• La capa de framework de persistencia será el interfaz con el gestor de base de datos ocupándose de la
gestión de los datos mediante un API. Normalmente en Java se utiliza JDBC; iBatis utiliza su framework
SQL-MAP (ibatis-sqlmap.jar). Esta capa se configura mediante un fichero XML, sql-map-config.xml.
Además cada objeto de modelo, que representa al objeto en la aplicación, se relaciona con un fichero del
tipo sqlMap.xml, que contiene sus sentencias sql. Por ejemplo, un objeto Java Empleado con un objeto
XML empleado.xml.
• La capa de driver se ocupa de la comunicación con la propia base de datos utilizando un driver específico
para la misma.
Toda implementación de iBATIS incluye los siguientes componentes:

• Data Mapper: proporciona una forma sencilla de interacción de datos entre los objetos Java y .NET y
bases de datos relacionales.
• Data Access Object: abstracción que oculta la persistencia de objetos en la aplicación y proporciona un
API de acceso a datos al resto de la aplicación .

Terminología básica

iBatis implementa el patrón DAO. Este patrón ayuda a centralizar la responsabilidad del acceso a datos en un
único punto, y oculta al resto de la aplicación la implementación específica. Gracias a este patrón, una posible
migración del Sistema Gestor de Base de Datos sólo afectaría a la capa de persistencia, resultando transparente
para el resto de capas.

Los Objetos de Acceso a Datos son un Patrón de Diseño Core J2EE y considerados una buena práctica.
La ventaja de usar objetos de acceso a datos es que cualquier objeto de negocio(el cual contiene detalles
específicos de operación o aplicación) no requiere conocimiento directo del destino final de la información que
manipula.

Qué no es iBatis

Hay un conjunto de consideraciones que hay que tener en cuenta a la hora de estudiar iBatis. iBatis no es un
ORM, es sólo una solución rápida a la persistencia que permite utilizar la semántica de herramientas ORM,
aunque sin utilizar toda su complejidad.
• No auto-genera código SQL
• No tiene un lenguaje propietario de consultas, utiliza el SQL común.
• No utiliza objetos de entidad (Entity) ni objetos de persistencia.
• No construye objetos en caché.

Ventajas e inconvenientes

iBatis presenta grandes ventajas con respecto al resto de soluciones de su misma familia:

• iBATIS DAO facilita el manejo de la capa de persistencia mediante la utilización de interfaces.

Page 2 - 08/04/2010 a las 15:22


MADEJA - iBatis

• iBATIS SQL MAPS facilita la asignación de datos entre el modelo de datos de nuestra base de datos y el
modelo de clases de nuestra aplicación.
• Simplicidad:
° Aprender a utilizarlo
° Fácil de mantener
° Programación declarativa (configurando ficheros XML)
° Separación entre SQL y el lenguaje de programación de la aplicación (Java/.NET).

• Portabilidad: entre Java y .NET; entre diferentes proveedores de bases de datos.


• Se trata de código abierto, es decir open source.
No obstante, también existen un conjunto de inconvenientes que hacen que en ocasiones iBatis no sea la
herramienta más idónea:

• Las bases de datos que gestiona iBATIS deben ser exclusivamente relacionales.
• No es totalmente transparente (hay que programar SQL).
• Pierde funcionalidad si casi todas las sentencias SQL son construidas dinámicamente.

Alternativas

JDBC

Es un API (Application programming interface) que describe o define una librería estándar para acceso a fuentes
de datos, principalmente orientado a bases de datos relacionales que usan SQL (Structured Query Language).
No es buena idea usar esta solución para aplicaciones que exijan un gran rendimiento, ya que la transformación
JDBC-ODBC es costosa. Tampoco es buena solución para aplicaciones con alto nivel de escalabilidad. No
obstante, tiene la ventaja de su simplicidad.

Hibernate

Es un framework ORM. Permite la persistencia de Objetos Java. Se basa en un modelo más orientado a la
programación orientada a objeto. Más avanzado que iBatis. Permite portabilidad de base de datos, y mayor
transparencia ante cambios del modelo de objetos. Genera sentencias SQL automáticamente. No obstante,
en caso de tener la necesidad de modificar las sentencias generadas, o crear sentencias nuevas, es necesario
conocer el lenguaje de consultas HQL (Hybernate Query Languaje) .

EJB 3.0 (Enterprise Java Bean)

Un Bean es un componente software que tiene la particularidad de ser reutilizable y así evitar la tediosa tarea
de programar los distintos componentes uno a uno. Dentro de este conjunto, se encuentran los Enterprise Java
Bean que son componentes del contexto de servidor que cubren la necesidad de intermediar entre la capa
web y diversos sistemas empresariales. en este sentido, los EJB buscan la información en bases de datos
gestionando la integridad de los datos persistentes, es decir, la consistencia entre los datos de memoria y los de
la base de datos. Los ejb's son fáciles de utilizar, aunque la curva de aprendizaje puede llevar un coste bastante
considerable.

Versiones

Existen dos versiones de iBatis, una para Java y otra para aplicaciones en .NET. Para entornos JEE, iBatis
v2.3.0 es la actual y la mejor versión en modo release. Es también la primera versión que no incluye el
framework DAO. La última versión que incluye el framework DAO es la 2.2.0. Para .NET ibatis DataMapper 1.6.1
y DataAccess 1.9.1.

Page 3 - 08/04/2010 a las 15:22


MADEJA - iBatis

Requisitos e incompatibilidades

Requisitos

iBatis no debe ser utilizado cuando se requiere una automatización total y transparente de la persistencia.
Tampoco es recomendable su uso cuando se requiere soporte multi-RDBMS (motor de base de datos)
transparente y automático

Incompatibilidades

• Java 1.4 o superior.


• En versiones anteriores a la 2.0, iBatis no permitía el uso de PL/SQL. Se recomienda la NO utilización de
procedimientos almacenados, salvo en el caso de que estos existieran previamente y no se pudiera migrar
la lógica de negocio en ellos implementada a lógica de aplicación.
• Para acceder al Gestor de la Base de Datos Microsoft SQL Server 2000, existen problemas cuando
se ejecutan sentencias sin datos. Se han reportados distintos errores en donde se indica que se dejan
transacciones abiertas cuando la sentencia que se ejecuta no devuelve datos (en el caso de la consulta) o
no afecta a ningún datos (en el caso de las inserciones, actualizaciones y borrados).

Integración con otros componentes

Una de las herramientas con las que iBatis se encuentra bastante relacionada es Spring, no obstante, también
se puede utilizar sin ella. Spring ofrece un conjunto de plantillas que hacen que iBatis sea fácilmente manejable.
Para configurar Spring dentro de una aplicación, bastaría con incluir las librerías necesarias y especificar los
entities utilizados por Spring dentro de los ficheros de configuración.

Modo de empleo

Para utilizar iBatis dentro de una aplicación es necesario colocar las librerías ibatis-x.x.x.jar dentro del classpath.
Además, es necesario incluir, al menos, tres ficheros de configuración:

1. Archivo de configuración de los parámetros de base de datos


2. Archivo SqlMapConfig.xml que contiene la localización de los ficheros donde se declaran los Sql Map.
3. Archivos Sql Maps. Son uno o más archivos donde se declara la configuración de cada Sql Map y el
mapeo de una entidad dentro de la aplicación, a menudo representada por una única clase. Desde esas
clases se establecen las referencias con los métodos creados en el SqlMap de la entidad.

Enlaces de interés

Páginas web:
• http://ibatis.apache.org/
• http://www.adictosaltrabajo.com
• http://ame.endesa.es
Documentos:
• iBATIS-SqlMaps-2-Tutorial.pdf (accesible desde http://ame.endesa.es )

Page 4 - 08/04/2010 a las 15:22


MADEJA - iBatis

Recomendaciones de Uso

1. Se recomienda, en la medida de lo posible, ser independiente del motor de base de datos que subyace.
2. La capa de persistencia no debe contener lógica alguna.
3. No utilizar procedimientos almacenados de BBDD si implementan lógica de negocio. Aunque se
proporcionan mecanismos para el acceso a procedimientos almacenados pre-existentes, no se propugna
su uso, sobre todo por romper la responsabilidad de las distintas capas del aplicativo, y vincular en exceso
un aplicativo a un modelo específico de base de datos. Existen ciertas consideraciones especiales, como
casos específicos de rendimiento, o implementación de ciertos aspectos específicos de acceso a datos, en
los que se podrían usar, pero deben tener un análisis previo importante.
4. Es obligatorio encapsular las operaciones persistentes y aislar su uso de la implementación, es decir, usar
patrón DAO.
5. Las entradas y salidas de la interfaz DAO son clases del modelo y/o DTOs. En la medida de lo
posible, este conjunto de clases se componen unas de otras, siendo fiel al modelo, intentando evitar la
construcción de un DTO para cada caso.
6. No utilizar las clases de iBatis propuestas para construir el patrón DAO, tal como las factorías de iBatis.
Esta funcionalidad está delegada a Spring.
7. Se recomienda usar una notación de métodos DAO consistente y uniforme: delete, insert, update, findAll,
findByPrimaryKey, findAllByFecha, findByPrimaryKeyWithUsuario, ..., etc.
8. Es obligatorio usar iBatis con Spring, heredando, directa o indirectamente, de la clase
SqlMapClientDaoSupport.
9. Es altamente recomendable no usar las APIs transaccionales de Spring o iBatis, sino usar la
transaccionalidad declarativa, mediante aspectos (AOP).
10. Se recomienda posibilitar el desacoplo iBatis de Spring, por medio de unos pequeños cambios; por
ejemplo, cambiando una clase padre de la que hereden todos los DAO.
11. Se recomienda usar un modelo de Excepciones DAO jerárquico propio, tal como por
ejemplo: DAOException, DAOIdentificadorNoInformadoException, DAOIntegrityException,
DAOValidacionException, DAOContratViolationException, DAORegistroNoEncontradoException… En la
práctica se ha demostrado que es más práctico trabajar con un modelo de excepciones de este tipo que
con un modelo de excepciones ligado al modelo (UsuarioDAOException, PagoDAOException,...).
12. Se recomienda no realizar captura de excepciones, sino delegar esta operatividad a un aspecto (AOP).
13. La configuración de contexto es preferible sacarla fuera del fichero sqlMapconfig.xml para poder cambiar
fácilmente de entorno, por ejemplo, tener un fichero donde se indiquen las propiedades de conexión
driver=org.apache.derby.jdbc.ClientDriver
url=jdbc:derby://localhost:1527/kmdb
username=derby
password=derby

Aplicación de ejemplo

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.

Page 5 - 08/04/2010 a las 15:22


MADEJA - iBatis

<?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=

Page 6 - 08/04/2010 a las 15:22


MADEJA - iBatis

"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;
}

Page 7 - 08/04/2010 a las 15:22


MADEJA - iBatis

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
*/

Page 8 - 08/04/2010 a las 15:22


MADEJA - iBatis

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;

Page 9 - 08/04/2010 a las 15:22


MADEJA - iBatis

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);

Page 10 - 08/04/2010 a las 15:22


MADEJA - iBatis

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

Page 11 - 08/04/2010 a las 15:22


MADEJA - iBatis

*
* @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

Page 12 - 08/04/2010 a las 15:22


MADEJA - iBatis

"-//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&#95;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>

Page 13 - 08/04/2010 a las 15:22


MADEJA - iBatis

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=

Page 14 - 08/04/2010 a las 15:22


MADEJA - iBatis

"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">

Page 15 - 08/04/2010 a las 15:22


MADEJA - iBatis

$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">

Page 16 - 08/04/2010 a las 15:22


MADEJA - iBatis

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">

Page 17 - 08/04/2010 a las 15:22


MADEJA - iBatis

<!--
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=

Page 18 - 08/04/2010 a las 15:22


MADEJA - iBatis

"," 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,

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">

Page 19 - 08/04/2010 a las 15:22


MADEJA - iBatis

<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 Cartografico 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

Page 20 - 08/04/2010 a las 15:22


MADEJA - iBatis

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());
}
}

Page 21 - 08/04/2010 a las 15:22

Anda mungkin juga menyukai