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