iBatis基础使用
简介
来自维基百科
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等。如果配置参数类型错误,可以参照此处,检查是否有误。