有的时候需要一次性执行大批量的SQL,而不是执行一条SQL向数据库提交一次,那么会
用到 IBATIS 的batch提交。
IBATIS的 batch提交也是基于 JDBC的batch功能。
那么我现来写段代码示范一下:
第一步,建立我的测试类。
其中 BabyDO,sexEnum 等类是自己写的,并不重要,只要让程序跑起来,读者可以自己写下。不多讲了,主要讲重点的几个语句。
第二步,建立BabyDAO的实现类BabyDAOImpl
package com.yajun.impl;
// import 很多JDK给的类
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.yajun.dao.BabyDAO;
import com.yajun.dataobject.BabyDO;
import com.yajun.dataobject.BabyTestDO;
public class BabyDAOImpl implements BabyDAO {
private SqlMapClient client;
public BabyDAOImpl() {
try {
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
client = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
……(省略其他方法)
/**
* 批量添加小孩
*
* @param babys
* @return
* @throws SQLException
*/
public Integer insertBatch(List<BabyDO> babys) throws SQLException {
int count = 0;
try {
// 自己控制事物的开始
client.startTransaction();
client.startBatch();
for (BabyDO babyDO : babys) {
try {
client.insert("insert-baby", babyDO);
} catch (Exception e) {
System.out.println("插入婴儿失败");
}
}
count = client.executeBatch();
} finally {
// 自己控制事物的结束
client.endTransaction();
}
return count;
}
……(省略其他方法)
运行起来的结果:
============ 成功插入BABY 10000条 =============
消费时间 2610
可以看到插入10000条数据只需要2秒钟。
那么这里的关键点是我的注释:需要手工控制事物执行,否则事物会在第一条SQL insert 的时候自动将事物关闭掉。
具体原因的代码请看 IBATIS 源码(主要请注意我加注释的那几句话):