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
Características
• 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 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).
• 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) .
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.
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
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:
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 )
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.
donde se indicarán todas las interfaces utilizadas y las clases que las implementan.
<?xml version=
"1.0" encoding=
"UTF-8"?>
<!DOCTYPE daoConfig PUBLIC
"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>
private
static
final
String DAO_XML =
"es/dxd/km/dao/dao.xml";
private
static
static {
try {
daoManager = newDaoManager();
}
catch (Exception e) {
throw
new RuntimeException(
public
return daoManager;
}
public
try {
Reader reader = Resources.getResourceAsReader(DAO_XML);
return DaoManagerBuilder.buildDaoManager(reader,
null);
}
catch (Exception e) {
throw
new RuntimeException(
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
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
*/
for iBATIS.
* This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
*
* @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
*/
for iBATIS.
* This method corresponds to the database table MARISMA2MG.MA_CARTOGRAFICO
*
* @abatorgenerated Fri Feb 16 12:16:54 UTC 2007
*/
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
*/
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);
}
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;
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
*/
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
"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
"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
"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
*/
"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
*/
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
"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);
"MARISMA2MG_MA_CARTOGRAFICO.abatorgenerated_deleteByPrimaryKey", key);
return rows;
}
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.
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
"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_MA_CARTOGRAFICO_SqlMap.xml"/>
<sqlMap resource=
"com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG_MA_CDS_SqlMap.xml"/>
<sqlMap resource=
"com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG_MA_ECONOMICO_SqlMap.xml"/>
...
<!-- VISTAS -->
<sqlMap resource=
"com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG_MA_VIEW_CARTOGRAFICO_SqlMap.xml"/>
<sqlMap resource=
"com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG_MA_VIEW_SOLCART_SqlMap.xml"/>
<sqlMap resource=
"com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG_MA_VIEW_PERFILUSUARIO_SqlMap.xml"/>
...
"com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG_MA_VIEW_TERCEROS_SqlMap.xml"/>
<sqlMap resource=
"com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG_MA_VIEW_GENERAL_SqlMap.xml"/>
<sqlMap resource=
"com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG_MA_VIEW_SAETA_SqlMap.xml"/>
...
<!-- FILTROS -->
<sqlMap resource=
"com//viavansi//marisma//negocio//DAO//xml//MARISMA2MG_FILTRO_INFORME_TECNOLOGICO_SqlMap.xml"/>
</sqlMapConfig>
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
"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>
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).
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,
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,
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
String[] args) {
// getComboCartografico(){
CartograficoBO bo= CartograficoBO.getCurrentInstance();
try{
List list= (List)bo.findAll();
List combos=
new LinkedList();
// recorro la colecci##³n generando la combo
if (vo.getIdcartografico().equals(
"?") || vo.getIdcartografico().equals(
"�?")){
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());
}
}