环境: 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(); } }