简介

来自维基百科

iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的JPetStore实例。 相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis 是一种“半自动化”的ORM实现。iBATIS需要开发人员自己来写sql语句,这可以增加了程序的灵活性,在一定程度上可以作为ORM的一种补充。程序设计人员应该结合自己的项目的实际情况,来选择使用不同的策略。iBATIS和Hibernate都做了映射,但iBATIS是把实体类和sql语句之间建立了映射关系,这种策略可以允许开发人员自己来写合适的sql语句,而Hibernate在实体类和数据库之间建立了映射关系,sql对于开发人员是不可见的,对于那些数据量非常大的应用,无法去优化sql语句。所以在实际应用中,应该根据不同的应用场景,来选择适合自己的框架。

JDBC 手动

iBATIS 半自动

Hibernate 全自动架构

框架

配置

从上面的框架中可以看出,重要的配置文件就是一个SqlMapConfig.xml和多个的SqlMap.xml文件。

SqlMapConfig.xml

SqlMapConfig.xml文件是总的配置文件。最简单的SqlMapConfig.xml配置如下:

<?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>
    <!-- 配置iBATIS事务管理,使用JDBC事务类型,数据源使用Simple类型 -->
    <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
            <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/test" />
            <property name="JDBC.Username" value="root" />
            <property name="JDBC.Password" value="4970704" />
        </dataSource>
    </transactionManager>
    <!-- 配置iBAITS要使用的SqlMap文件信息 -->
    <sqlMap resource="test.xml" />
</sqlMapConfig>

注意:SqlMapConfig.xml文件中至少需要一个sqlMap节点。可以通过配置一个空的SqlMap.xml文件来检测数据库连接是否正常。

SqlMap.xml

SqlMap.xml就是应用主要配置SQL语句的文件,该文件通过上面的SqlMapConfig.xml文件指定,可以指定多个SqlMap.xml。最简单的SqlMapConfig.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>
</sqlMap>

上述就是一个空的SqlMap.xml。

SQL语句使用

iBATIS主要是做了实体类和SQL语句之间的映射,对构建SQL语句提供了强大的支持。

从一条简单的查询语句走起
<select id="SELECT" resultClass="java.util.HashMap">
    SELECT * FROM  USER
</select>

id是该条SQL语句的标识,全局唯一,不能重复。每条SQL语句,都会变成一个com.ibatis.sqlmap.engine.mapping.statement.MappedStatement对象,由com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate里面的mappedStatements属性维护,该属性类型为java.util.HashMap,key就是该id。

注意:不同类型的SQL语句的id也不能重复,包括在不同的SqlMap.xml文件中,id也不能重复。如果添加重复的id,会抛出错误:

    // 该方法位于com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate
    /**
     * Add a mapped statement
     *
     * @param ms - the mapped statement to add
     */
    public void addMappedStatement(MappedStatement ms) {
        if (mappedStatements.containsKey(ms.getId())) {
            throw new SqlMapException("There is already a statement named " + ms.getId() + " in this SqlMap.");
        }
        ms.setBaseCacheKey(hashCode());
        mappedStatements.put(ms.getId(), ms);
    }

resultClass是返回类型,可以使用类的全路径。同时可以使用iBATIS内置的缩写,内置的缩写,维护在com.ibatis.sqlmap.engine.type.TypeHandlerFactory的typeAliases字段中,字段类型java.util.HashMap,内容如下:

{
     cursor=java.sql.ResultSet,
     dom=com.ibatis.sqlmap.engine.type.DomTypeMarker,
     external=com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig,
     simple=com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory,
     lru=com.ibatis.sqlmap.engine.cache.lru.LruCacheController,
     object=java.lang.Object,
     collection=java.util.Collection,
     date=java.util.Date,
     long=java.lang.Long,
     float=java.lang.Float,
     short=java.lang.Short,
     byte=java.lang.Byte,
     oscache=com.ibatis.sqlmap.engine.cache.oscache.OSCacheController,
     map=java.util.Map,
     xmlcollection=com.ibatis.sqlmap.engine.type.XmlCollectionTypeMarker,
     dbcp=com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory,
     boolean=java.lang.Boolean,
     domcollection=com.ibatis.sqlmap.engine.type.DomCollectionTypeMarker,
     jndi=com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory,
     jdbc=com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig,
     iterator=java.util.Iterator,
     integer=java.lang.Integer,
     int=java.lang.Integer,
     xml=com.ibatis.sqlmap.engine.type.XmlTypeMarker,
     list=java.util.List,
     double=java.lang.Double,
     decimal=java.math.BigDecimal,
     memory=com.ibatis.sqlmap.engine.cache.memory.MemoryCacheController,
     jta=com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig,
     string=java.lang.String,
     arraylist=java.util.ArrayList,
     hashmap=java.util.HashMap,
     fifo=com.ibatis.sqlmap.engine.cache.fifo.FifoCacheController
}

这些所有的缩写中,既包括返回类型和参数类型的缩写,同时也包含数据源类型如simple,缓存类型如oscache,事务管理如jdbc等。如果配置参数类型错误,可以参照此处,检查是否有误。

标签: iBatis

添加新评论