对于Ibatis的批量插入:
(1)在代码中,BATCH_BASE 与数据库能够打开最大的游标数目有关 ,我认为这种比较好
/**
* 批量插入数据
* @param list
*/
public void insertBatch(final List<TranRec> list) {
if (list != null) {
SqlMapClientCallback callback = new SqlMapClientCallback() {
public Object doInSqlMapClient(SqlMapExecutor executor)
throws SQLException {
int size = list.size();
int loopMax = ((size - 1) / BatchNum.BATCH_BASE + 1) * BatchNum.BATCH_BASE;
for (int i = 0; i < loopMax; i++) {
executor.startBatch();
for (int j = 0, index = i * BatchNum.BATCH_BASE; (j < BatchNum.BATCH_BASE && index < size); j++, index++) {
executor.insert("TRAN_REC.insertSelective", list.get(index));
}
executor.executeBatch();
}
return null;
}
};
this.getSqlMapClientTemplate().execute(callback);
}
}
(2)在xml中 这种慎用,数据量大时执行有问题
<insert id="CHECK_DIFF.insertBatch" parameterClass="java.util.List">
INSERT All
<iterate conjunction=" ">
INTO CHECK_DIFF
(
TRAN_REC_ID,
WORK_DATE,
TRAN_DATE,
ORG_ID,
MER_ID,
STOR_ID,
PLATFORM,
TERM_ID,
TRAN_CODE,
TRAN_DESC,
TRACE_NUM,
BATCH_NUM,
CARD_NO,
TRAN_AMT,
FEE_AMT,
TRAN_AMT1,
TRAN_AMT2,
TRAN_AMT3,
TRAN_AMT4,
AUTH_CODE,
REFERENCE_NUM,
HOST_TRACE_NUM,
CD_FLAG,
ORIGINAL_TRAN_DATE,
ORIGINAL_BATCH_NUM,
ORIGINAL_TRACE_NUM,
ORIGINAL_REFER_NUM,
ORIGINAL_TRAN_REC_ID,
RESERVE1,
RESERVE2,
RESERVE3,
RESERVE4,
RESERVE5,
RESERVE6
)
VALUES
(
#list[].tranRecId#,
#list[].workDate#,
#list[].tranDate#,
#list[].orgId#,
#list[].merId#,
#list[].storId#,
#list[].platform#,
#list[].termId#,
#list[].tranCode#,
#list[].tranDesc#,
#list[].traceNum#,
#list[].batchNum#,
#list[].cardNo#,
#list[].tranAmt#,
#list[].feeAmt#,
#list[].tranAmt1#,
#list[].tranAmt2#,
#list[].tranAmt3#,
#list[].tranAmt4#,
#list[].authCode#,
#list[].referenceNum#,
#list[].hostTraceNum#,
#list[].cdFlag#,
#list[].originalTranDate#,
#list[].originalBatchNum#,
#list[].originalTraceNum#,
#list[].originalReferNum#,
#list[].originalTranRecId#,
#list[].reserve1#,
#list[].reserve2#,
#list[].reserve3#,
#list[].reserve4#,
#list[].reserve5#,
#list[].reserve6#
)
</iterate>
SELECT * FROM dual
</insert>