首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mybatis批量插入或更新的正确姿势

Mybatis批量插入或更新的正确姿势

作者头像
明明如月学长
发布于 2021-08-27 08:28:51
发布于 2021-08-27 08:28:51
2K00
代码可运行
举报
运行总次数:0
代码可运行

一、背景

最近业务中用到批量插入或更新,查了一下资料。

另外一篇博客是对本文的补充,也可以参考一下:https://cloud.tencent.com/developer/article/1868954

二、搜索

2.1 第一种写法

其中stackoverflow中这个回答给了我很大启发。

https://stackoverflow.com/questions/23486547/mybatis-batch-insert-update-for-oracle

就是在映射的方法中拼接多条插入或者更新语句

1 批量更新

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    UPDATE parties SET attending_user_count = #{model.attending_count}
    WHERE  fb_party_id = #{model.eid}  

2 批量插入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    INSERT INTO accountability_users 
        (
            accountability_user_id, accountability_id, to_username,
            record_status, created_by, created_at, updated_by, updated_at
        ) 
    VALUES
     
        (           
            #{model.accountabilityUserId}, #{model.accountabilityId}, #{model.toUsername}, 
            'A', #{model.createdBy}, #{model.createdAt}, #{model.updatedBy}, #{model.updatedAt}     
        )

参考

https://www.cnblogs.com/yangy608/p/3912580.html

所述的MySQL和Oracle的批量插入区别可以看出可能有兼容性问题(使用Oracle 的同学重点参考下)

而且jdbc链接Url要加上 allowMultiQueries=true参数。

2.2  第二种写法

还可以采用下面的写法:

https://github.com/mybatis/mybatis-3/blob/master/src/test/java/org/apache/ibatis/submitted/batch_keys/BatchKeysTest.java

mybatis官方示例所示的方式来批量插入或者更新应该是最正确的用法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Test
  public void testInsertWithMapper() {
    try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
      Mapper userMapper = sqlSession.getMapper(Mapper.class);
      User user1 = new User(null, "Pocoyo");
      userMapper.insert(user1);
      User user2 = new User(null, "Valentina");
      userMapper.insert(user2);
      sqlSession.flushStatements();
      assertEquals(new Integer(50), user1.getId());
      assertEquals(new Integer(50), user2.getId());
      sqlSession.commit();
    }

    try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
      List users = sqlSession.selectList("select");
      Assert.assertTrue(users.size() == 2);
    }
  }

另外openSession方法第二个参数是设置是否自动提交,可以设置为flase。

这里提到拿到批量更新结果的方式支持拿到批量结果。

另外这里提供批量执行的结果的打印函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void printBatchResults(List results) {
 if (results.size() > 0) {
  StringBuilder sb = new StringBuilder();
  sb.append("Batch summary:\n");
  for (int i = 0; i < results.size(); i++) {
   BatchResult result = results.get(i);
   sb.append("Result ").append(i).append(":\t");
   sb.append(result.getSql().replaceAll("\n", "").replaceAll("\\s+", " ")).append("\t");
   sb.append("Update counts: ").append(Arrays.toString(result.getUpdateCounts())).append("\n");
  }
  logDebug("082", sb.toString());
 }
}

3、结论

如果你使用的是 MySQL 直接使用第二部分 2.1部分的写法,给出的通过 在 XML 定义批量语句的方式即可。

如果想获得更好的兼容性,可以采用 2.2 部分的写法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/10/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mybatis批量插入或更新的正确姿势
另外一篇博客是对本文的补充,也可以参考一下:https://blog.csdn.net/w605283073/article/details/88652042
全栈程序员站长
2022/11/18
1.7K0
Mybatis批量插入或更新的正确姿势
MyBatis批量插入之forEach与Batch的抉择
创建数据表,并设置22个字段。也许你会好奇为什么创建如此多字段呢?因为只有在多字段且数据量较大时,才能体现BATCH的优势。也就是说在数据表字段较少,且保存的数据量不多的情况呀,forEach实现的批量插入还是有优势的,但是却有一个隐含的风险,这里先按下不表。
猫老师的叶同学
2023/03/23
1.9K0
MyBatis批量插入之forEach与Batch的抉择
数据库批量插入这么讲究的么?
最近新的项目写了不少各种 insertBatch 的代码,一直有人说,批量插入比循环插入效率高很多,那本文就来实验一下,到底是不是真的?
秦怀杂货店
2022/02/17
9930
数据库批量插入这么讲究的么?
数据库批量插入这么讲究的么?
最近新的项目写了不少各种 insertBatch 的代码,一直有人说,批量插入比循环插入效率高很多,那本文就来实验一下,到底是不是真的?
秦怀杂货店
2022/01/04
1K0
13 秒插入 30 万条数据,批量插入正确的姿势!
超出最大数据包限制了,可以通过调整max_allowed_packet限制来提高可以传输的内容,不过由于30万条数据超出太多,这个不可取,梭哈看来是不行了 😅😅😅
好好学java
2024/04/10
1.1K0
13 秒插入 30 万条数据,批量插入正确的姿势!
MyBatis批量插入几千条数据,请慎用Foreach
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码)
搜云库技术团队
2024/01/23
4020
MyBatis批量插入几千条数据,请慎用Foreach
MyBatis 批量插入几千条数据,请慎用Foreach
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码)
搜云库技术团队
2021/12/16
1.3K0
MyBatis 批量插入几千条数据,请慎用Foreach
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码)
搜云库技术团队
2023/10/30
2.3K0
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟...
来源:blog.csdn.net/huanghanqian/article/details/83177178/ 近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码) <insert id="batchInsert" parameterType="java.util.List">     insert into 
程序猿DD
2022/09/08
1K0
MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟...
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
点击关注公众号,Java干货及时送达 近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。 mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码) <insert id="batchInsert" parameterType="java.util.List">     insert into USER (id, name) values     <foreach
Java技术栈
2022/08/25
1.2K0
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/08/31
4950
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
MyBatis一次性批量插入几千条数据,为什么性能很差?
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。
Java技术债务
2022/08/09
4.1K0
MyBatis一次性批量插入几千条数据,为什么性能很差?
mybatis中批量插入的两种方式(高效插入)
mybatis中批量插入的两种方式(高效插入)
Java架构师必看
2021/09/30
2.4K0
Mybatis Plus 批量插入性能优化,非常实用!
物联网平台背景,传感器采集频率干到了1000Hz,分了100多张表出来,还是把mysql干炸了。当前单表数据量在1000来w,从kafka上拉数据异步批量插入,每次插入数据量1500条,测试的时候还没问题,结果上线没多久,kafka服务器直接挂了,赶忙看日志,kafka服务器堆积了几十G的数据,再去看生产环境日志,发现到最后单次批量插入用时固定在10多秒,甚至20多秒,kafka直接把消费端踢出了消费组…从而kafka消息一直没有消费,总重导致kafka数据堆积挂掉了…
码猿技术专栏
2023/05/01
7.9K2
Mybatis Plus 批量插入性能优化,非常实用!
mybatis-plus批量插入你用对了吗
记得有一次我们小组code review,组长看了下我们批量插入是使用mybatis原生的xml foreach实现的,于是二话不说,拍桌子,说这有性能问题。叫我们直接使用mybatis-plus,可是为啥呢?怎么用,需要注意哪些地方,也没给我们说个明白。好吧,我们对这一块也没具体调研过,就直接按他的想法去实现了。性能有没有提升了好几倍呢,其实也没实践过,反正review过了。直到有一天。。。
阿建dong一点
2022/11/26
4K1
MyBatis批量插入大量数据(1w以上)
问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBatis开始报错。项目使用技术:SpringBoot、MyBatis
用户7353950
2022/06/23
2K0
02-MybatisPlus批量插入性能够吗?
“不要用 mybatis-plus 的批量插入,它其实也是遍历插入,性能很差的”。真的吗?他们的立场如下:
JavaEdge
2025/06/01
880
02-MybatisPlus批量插入性能够吗?
MyBatis常用函数介绍:高效SQL操作的利器
今日推荐 《Python多线程与多进程详解:性能提升技巧与实战案例》,这篇文章介绍了在Python中,多线程和多进程是提升应用程序性能的两种常用方法。虽然这两者都可以并发执行任务,但它们适用于不同的场景,并且各有优缺点。本文将探讨Python中的多线程与多进程,并提供一些性能提升的技巧和代码实例,帮助我们在实际应用中选择最合适的方法。
Front_Yue
2024/11/13
2680
MyBatis常用函数介绍:高效SQL操作的利器
mysql批量写入_mysql insert多条数据
最近新的项目写了不少各种 insertBatch 的代码,一直有人说,批量插入比循环插入效率高很多,那本文就来实验一下,到底是不是真的?
全栈程序员站长
2022/11/08
6.9K0
mysql批量写入_mysql insert多条数据
MyBatis动态SQL foreach标签实现批量插入
需求:查出给定id的记录: <select id="getEmpsByConditionForeach" resultType="com.test.beans.Employee">           SELECT * FROM tb1_emplyee WHERE id IN   <foreach collection="list" item="item_id" separator="," open="(" close=")">               #{item_id}   </foreach>
庞小明
2018/04/27
5.1K0
推荐阅读
相关推荐
Mybatis批量插入或更新的正确姿势
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档