对iBATIS的懂得
1. iBATIS
关于iBATIS,iBATIS是一个Data Mapper 框架,并非一个ORM框架,他利用反射和数据库返回结果集的ResetSetMetaData,省去了JDBC传递参数和设置结果集的麻烦。简单是他相对于其他ORM工具的最大特性。他是直接调用你编写的SQL语句或存储过程。他还可以动态构造SQL语句。
2. iBATIS的代码生成工具:
abator (http://ibatis.apache.org/abator.html)
http://www.iteye.com/topic/138361
1) 首先配置好 abatorConfig.xml,范例参考官方文档.例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE abatorConfiguration
PUBLIC "-//Apache Software Foundation//DTD Abator for iBATIS Configuration 1.0//EN"
"http://ibatis.apache.org/dtd/abator-config_1_0.dtd">
<abatorConfiguration>
<abatorContext id="DB2Tables" generatorSet="Java2">
<jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
connectionURL="jdbc:db2:TEST"
userId="db2admin"
password="db2admin">
<classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="test.model" targetProject="\AbatorTestProject\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="test.xml" targetProject="\AbatorTestProject\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<daoGenerator type="SPRING" targetPackage="test.dao" targetProject="\AbatorTestProject\src">
<property name="enableSubPackages" value="true" />
</daoGenerator>
<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table>
</abatorContext>
</abatorConfiguration>
2) 可以将abator.jar加入到项目工程的lib下,然后在eclipse中用Java Application的方式来运行该jar包(eclipse会自动找到Main Class:org.apache.ibatis.abator.api.AbatorRunner)
加入参数: abatorConfig.xml true
也可以在控制台运行命令: java -jar abator.jar abatorConfig.xml true
3. iBATIS的占位符
$中间的变量就是直接替换成值的
#会根据变量的类型来进行转换
比如articleTitle的类型是string, 值是"标题"的时候
$articleTitle$ = 标题
#articleTitle# = '标题'
4. iBATIS的使用
使用动态条件查询时候,记得每一个条件表达式,都使用prepend="AND"
而且里面的SQL语句注意 函数名跟()括号之间不要有空格。
编写SQL语句时,因为大多是有abator来生成,注意要对表的default值做处理,以免导致将null值插入到有default值的字段中。
5. 尽量使用批处理
批处理和没批处理,相差性能很大。
try {
getSqlMapClient().startTransaction();
List<Phone> phones = (List<Phone>) getSqlMapClient().queryForList(
"selectPhone");
int effected = 1;
//getSqlMapClient().startBatch();
for (Phone ph : phones) {
getSqlMapClient().update("updatePhone", ph);
}
//getSqlMapClient().executeBatch();
getSqlMapClient().commitTransaction();
return effected;
} catch (SQLException e) {
e.printStackTrace();
return -1;
} finally {
try {
getSqlMapClient().endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
}
同样的代码,如果没有使用批处理,则更新2000条数据使用了 15,938ms。使用批处理仅需1,188ms。