<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在開發中如果遇到需要批次insert的需求,可以使用Mybatis 的 Batch Insert Support 提高插入效率。
@Autowired private SqlSessionTemplate sqlSessionTemplate; public int insertFolder(List<IpsCatalogFolderDetail> ips) { //獲取sql對談 SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false); //通過新的session獲取mapper,而不是常規的spring管理注入 IipsCatalogFolderDetailDao folderDetailDao = session.getMapper(IipsCatalogFolderDetailDao.class); int size = ips.size(); //如果有父類別子類兩層都需要批次插入也可 try { //外層迴圈 for (int i = 0; i < size; i++) { ips.get(i).setType("folder"); //用上面在session中獲取的mapper進行插入操作 folderDetailDao.insertFolder(ips.get(i)); //內層迴圈 String cs = ips.get(i).getContentIds(); if (StringUtils.isNotBlank(cs)){ List<String> con = JSON.parseArray(cs,String.class); if (cs != null && con.size() > 0) { for (int j = 0; j < con.size(); j++) { IpsCatalogFolderDetail ifd = new IpsCatalogFolderDetail(); ifd.setParentCode(ips.get(i).getCode()); ifd.setContentId(con.get(j)); ifd.setType("contents"); //同樣用上面在session中獲取的mapper進行插入操作 folderDetailDao.insertFolder(ifd); } } } //最後批次提交 if (i % 200 == 0 || i == size - 1) { session.commit();//200個提交一次,手動提交,提交後無法回滾 session.clearCache(); //清除快取,防止溢位 } } }catch (Exception e) { System.out.println(e.toString()); session.rollback(); //沒有提交的資料可以回滾 } finally { session.close(); } return 0; }
另外有時我們在插入的時候需要先查詢資料是否已存在,如果也需要批次操作可將insert和update語句合併,然後就可以繼續使用Batch Insert了
@Insert("merge into ips_catalog_folder_detail fd " + "using(select #{code,jdbcType=VARCHAR} c from dual)t " + "on(fd.FOLDERID = t.c)" + "when matched then"+ "update set "+ ...(省略)... "where ..."+ "when not matched then insert(" + "fd.PROD_LINE," + "fd.TYPE," + "fd.PARENTFOLDERCODE," + "fd.FOLDERID," + "fd.FOLDERCODE," + "fd.FOLDERNAME," + "fd.COLUMN_SORTINDEX," + "fd.DESCRIPTION," + "fd.CONTENTID," + "fd.CREATETIME" + ")" + "VALUES" + "(" + "#{prod_line}," + "#{type,jdbcType=VARCHAR}," + "#{parentCode,jdbcType=VARCHAR}," + "#{code,jdbcType=VARCHAR}," + "#{aliasCode,jdbcType=VARCHAR}," + "#{name,jdbcType=VARCHAR}," + "#{sortIndex,jdbcType=VARCHAR}," + "#{desc,jdbcType=VARCHAR}," + "#{contentId,jdbcType=VARCHAR}," + "#{createTime,jdbcType=VARCHAR}" + ")") int insertFolder(IpsCatalogFolderDetail fd);
MYSQL範例:
REPLACE INTO users (id,name,age) VALUES(1, '張雨綺', 32);
經排查發現,主要時間消耗在往MyBatis中批次插入資料。mapper configuration是用foreach迴圈做的,差不多是這樣。
<insert id="batchInsert" parameterType="java.util.List"> insert into USER (id, name) values <foreach collection="list" item="model" index="index" separator=","> (#{model.id}, #{model.name}) </foreach> </insert>
可以看 http://www.mybatis.org/mybatis-dynamic-sql/docs/insert.html 中 Batch Insert Support 標題裡的內容)
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH); try { SimpleTableMapper mapper = session.getMapper(SimpleTableMapper.class); List<SimpleTableRecord> records = getRecordsToInsert(); // not shown BatchInsert<SimpleTableRecord> batchInsert = insert(records) .into(simpleTable) .map(id).toProperty("id") .map(firstName).toProperty("firstName") .map(lastName).toProperty("lastName") .map(birthDate).toProperty("birthDate") .map(employed).toProperty("employed") .map(occupation).toProperty("occupation") .build() .render(RenderingStrategy.MYBATIS3); batchInsert.insertStatements().stream().forEach(mapper::insert); session.commit(); } finally { session.close(); }
總結一下,如果MyBatis需要進行批次插入,推薦使用 ExecutorType.BATCH 的插入方式,如果非要使用 <foreach>的插入的話,需要將每次插入的記錄控制在 20~50 左右
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45