基于mybatis batch實現(xiàn)批量提交大量數(shù)據(jù)
很多人在用 MyBatis 或者 通用 Mapper 時,經常會問有沒有批量插入和批量更新的方法。
實際上許多時候沒必要用 <foreach> 去實現(xiàn)特別復雜的批量操作。直接通過 MyBatis 的 BATCH 方式執(zhí)行增刪改方法即可。
下面是一個批量用法的例子:
在xml文件配置多條參數(shù)同時插入:
<insert id="insertBatch2" parameterType="ctas.entity.SharkFlt">
<selectKey keyProperty="recId" order="BEFORE" resultType="Long">
select SEQ_CTAS_SHARK_FLT.nextval as recId from dual
</selectKey>
insert into CTAS_SHARK_FLT (<include refid="Base_Column_List"/>) SELECT SEQ_TEST.NEXTVAL, A.*
FROM (
<foreach collection="list" item="item" index="index" open="" close="" separator="union all">
select #{item.awbType,jdbcType=VARCHAR}, #{item.awbPre,jdbcType=VARCHAR},... from dual
</foreach>
) A
</insert>
在Java代碼中,oracle中一次執(zhí)行的sql語句長度是有限制的,如果最后拼出來的sql字符串過長,會導致執(zhí)行失敗,所以java端還要做一個分段處理,參考下面的處理:
List<SharkFlt> data = new ArrayList<SharkFlt>();
for (TSharkFlt f : sharkFlts) {
data.add(getSharkFlt(f));
}
System.out.println(data.size());
long beginTime = System.currentTimeMillis();
System.out.println("開始插入...");
SqlSessionFactory sqlSessionFactory
=ctx.getBean(SqlSessionFactory.class);
SqlSession session = null;
try {
session = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
int a = 2000;//每次提交2000條
int loop = (int) Math.ceil(data.size() / (double) a);
List<SharkFlt> tempList = new ArrayList<SharkFlt>(a);
int start, stop;
for (int i = 0; i < loop; i++) {
tempList.clear();
start = i * a;
stop = Math.min(i * a + a - 1, data.size() - 1);
System.out.println("range:" + start + " - " + stop);
for (int j = start; j <= stop; j++) {
tempList.add(data.get(j));
}
session.insert("ctas.importer.writer.mybatis.mappper.SharkFltMapper.insertBatch2", tempList);
session.commit();
session.clearCache();
System.out.println("已經插入" + (stop + 1) + " 條");
}
} catch (Exception e) {
e.printStackTrace();
session.rollback();
} finally {
if (session != null) {
session.close();
}
}
long endTime = System.currentTimeMillis();
System.out.println("插入完成,耗時 " + (endTime - beginTime) + " 毫秒!");
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
ZooKeeper入門教程三分布式鎖實現(xiàn)及完整運行源碼
本文是ZooKeeper入門系列教程,分布式鎖有多種實現(xiàn)方式,比如通過數(shù)據(jù)庫、redis都可實現(xiàn)。作為分布式協(xié)同工具ZooKeeper,當然也有著標準的實現(xiàn)方式。本文介紹在zookeeper中如何實現(xiàn)排他鎖2022-01-01
Spring Boot 整合 Mockito提升Java單元測試的高效實踐案例
Mockito與Spring Boot的整合為Java開發(fā)者提供了一套完整的解決方案,使得單元測試更為精準、高效,從而確保了代碼質量、降低了維護成本,并促進了項目的持續(xù)集成與交付,感興趣的朋友跟隨小編一起看看吧2024-04-04
詳解用Spring Boot零配置快速創(chuàng)建web項目
本篇文章主要介紹了詳解用Spring Boot零配置快速創(chuàng)建web項目,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
深入解析System.load 與 System.loadLibrary
以下是對System.load與System.loadLibrary進行了詳細的分析介紹。需要的朋友可以過來參考下2013-08-08

