用到 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 源碼(主要請注意我加註釋的那幾句話):