環境: mybatis + oracle11g r2
1.使用"直接路徑插入"(下面sql語句中的"/*+append_values */"),並且使用關鍵字"union all":
<insert id="addUidCodeBatch" parameterType="java.util.List"> insert into /*+append_values */ T_UID_CODE(C_UID_CODE, C_SERAIL_LEN, C_BATCH_CODE, C_TYPE, C_CREATE_TIME, C_SUPER_CODE, c_security_code, C_SERIAL_CODE ) <foreach collection="list" item="item" index="index" separator="union all" > select #{item.uidCode}, #{item.kCode}, #{item.batchCode}, #{item.type}, sysdate, #{item.superCode}, #{item.securityCode}, #{item.serialCode} from dual </foreach> </insert>
2.dao層實現: 之前是一次性commit,這樣做會隨著插入數目的增大,執行速度陡然變慢,所以應該分批次進行插入:
public void save(List<UidCodeBean> uidCodeList) throws Exception { SqlSession batchSqlSession = null; try { batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);//獲取批量方式的sqlsession int batchCount = 1000;//每批commit的個數 int batchLastIndex = batchCount - 1;//每批最後一個的下標 for(int index = 0; index < uidCodeList.size()-1;){ if(batchLastIndex > uidCodeList.size()-1){ batchLastIndex = uidCodeList.size() - 1; batchSqlSession.insert(NAMESPACE+".addUidCodeBatch", uidCodeList.subList(index, batchLastIndex)); batchSqlSession.commit(); System.out.println("index:"+index+" batchLastIndex:"+batchLastIndex); break;//數據插入完畢,退出循環 }else{ batchSqlSession.insert(NAMESPACE+".addUidCodeBatch", uidCodeList.subList(index, batchLastIndex)); batchSqlSession.commit(); System.out.println("index:"+index+" batchLastIndex:"+batchLastIndex); index = batchLastIndex + 1;//設置下一批下標 batchLastIndex = index + (batchCount - 1); } } }finally{ batchSqlSession.close(); } }