原创文章,如需转载,请注明出处。
1. IBatis简介
IBatis是以SQL为中心的持久化层框架,是一种“半自动化”的ORM实现。
IBatis不但提供了对象与关系数据库之间的映射,同时提供操作方法与SQL间的直接映射,设计者可以直接为一个方法指定一条SQL语句,从而取得更加准确的数据。因为 IBatis 的 sql 都保存到单独的xml文件中,有利于DBA对 sql 的 审核和优化。IBatis最大的特点就是小巧,上手很快,可维护性较好。
IBatis数据映射的工作流程图如图1所示:
图1:IBatis数据映射的工作流程图
2. 使用步骤
2.1 SQL Map 配置文件
SQL Map 配置文件中对<properties>、< settings >、< typeAlias >、< transactionManager >、< dataSource >、< sqlMap >等进行配置。
2.2 SQL Map映射文件
在SQL Map映射文件中,可以定义的Statement 类型有<statement>、<insert>、<update>、<delete>、<select>、<procedure>。
可以使用缓存模式,Cache的3个重要属性是readOnly、serialize和type;Cache类型分为MEMORY、LRU、FIFO、OSCACHE四种。
2.3编写DAO
在DAO中,可以使用SqlMapClient提供的方法执行sql操作。
3. 开发过程中的注意点
1. 对Sequence主键,插入语句之前必须指定一个主键值给要插入的记录,否则无法插入。方法是在插入语句标签<insert....>之前配置上:
<insert id="addItemDO" parameterClass="TryItem">
<selectKey keyProperty="id" resultClass="int" type="pre">
select ITEM_ID.nextval as value from dual
</selectKey>
insert into item …
</insert>
2. 通过使用<![CDATA[……]]>,可以避免SQL 中与XML 规范相冲突的字符,如<=,>=,<,>
3. 模糊查询中参数的引用,应使用$,而不是#,比如:'%$varName$%',或者 '%' || #varname# || '%'。例子:TITLE like '%' || #keyWord# || '%'
4. SQL入参parameterClass.SQL中引用parameterClass的参数有三种方式:
IBatis内置支持的类型,比如int、string,使用#value#来引用,这个value是关键字,不可变。
map类型的参数,使用#keyName#来引用,keyName为键名。
复杂对象的参数,使用#propertyName#来引用,propertyName类属性的名字。
IBatis仅接受一个入参,当几个参数分布在不同对象中的时候,将这些对象的属性(或者对象本身put)到map中,然后一次传递给sql语句是非常有效。例如parameterClass="java.util.Map"
5. 返回值参数类型: 一种是对象类型resultClass="int",一种是resultMap=" ItemResultMap "。当查询结果列名和类属性名对应不上的时候,应该选择resultMap指定查询结果集类型。否则查询出来填充的对象属性为空(数字的为0,对象的为null)。
6. 动态SQL。prepend表示链接关键字,可以为任何字符串,当为sql关键字时,IBatis自动判断是否应该添加该关键字。
例子:一个动态的where条件
<dynamic prepend="WHERE">
<isNotNull property="skin" prepend="and">
t.skin=#skin#
</isNotNull>
<isNotNull property="effi" prepend="and">
t.effect=#effi#
</isNotNull>
</dynamic>
7. 不能自动识别null,就是匹配的字段不能为null,要么就必须为其设置当是null时的默认值。
8. ibatis打印sql语句。
为了方便跟踪调试,利用log4j把ibatis执行的sql语句,参数,执行结果打印出来是一个不错的做法,只要在在配置文件log4j.properties中加入以下代码就可以了:
log4j.logger.com.ibatis = DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG
log4j.logger.java.sql.Connection = DEBUG
log4j.logger.java.sql.Statement = DEBUG
log4j.logger.java.sql.PreparedStatement = DEBUG, fileout
log4j.logger.java.sql.ResultSet = DEBUG