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

Mybatis批量插入或更新的正确姿势最近业务中用到批量插入或更新,查了一下资料。另外一篇博客是对本文的补充,也可以参考一下:https://blog.csdn.net/w605283073/article/details/88652042其中stackoverflow中这个回答给了我很大启发。https://stackoverflow.com/questions/23486547/mybatis-batch-ins…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

一、背景

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

另外一篇博客是对本文的补充,也可以参考一下:https://blog.csdn.net/w605283073/article/details/88652042

 

二、搜索

2.1 第一种写法

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

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

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

1 批量更新

<foreach collection="attendingUsrList" item="model"  separator=";">
    UPDATE parties SET attending_user_count = #{model.attending_count}
    WHERE  fb_party_id = #{model.eid}  
</foreach>

Jetbrains全家桶1年46,售后保障稳定

2 批量插入

<insert id="insertAccountabilityUsers" parameterType="AccountabilityUsersModel" useGeneratedKeys="false">
    INSERT INTO accountability_users 
        (
            accountability_user_id, accountability_id, to_username,
            record_status, created_by, created_at, updated_by, updated_at
        ) 
    VALUES
    <foreach collection="usersList" item="model" separator=","> 
        (           
            #{model.accountabilityUserId}, #{model.accountabilityId}, #{model.toUsername}, 
            'A', #{model.createdBy}, #{model.createdAt}, #{model.updatedBy}, #{model.updatedAt}     
        )
    </foreach>
</insert>

 

 

参考

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官方示例所示的方式来批量插入或者更新应该是最正确的用法。

 @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<User> users = sqlSession.selectList("select");
      Assert.assertTrue(users.size() == 2);
    }
  }

 

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

 

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

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

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

public void printBatchResults(List<BatchResult> 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 部分的写法。

 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/207179.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • CSDN积分获取(csdn怎么查看积分)

    下载积分攻略:个人设置里进行手机绑定CSDN账户奖励50分(右上角设置-账户安全-手机绑定)完成任务送若干分积分http://task.csdn.net/上传有效资源获取积分(上传非法,广告资源用户,将被扣除一定积分,严重者封号)。·上传自己设分资源被下载,下载量×资源分,100分封顶。·上传0分资源被下载,下载量×系统奖励1分,100封顶评论资源获取积分(所下载资源只可以…

  • spring boot vue跨域_vue怎么解决跨域问题

    spring boot vue跨域_vue怎么解决跨域问题一、什么是跨域在springboot+vue前后端分离项目中,请求资源的端口号,域名(ip地址)不同。二、跨域的解决方案1、springboot后端处理:在每个controller上加上@CrossOrigin注解或在controller的基类上添加@CrossOrigin注解,其他controller类加上@Controller即可。2、在vue前端进行处理:通过代理的方式访问后端接口。…

  • 国内it软件外包公司排行榜是怎么样的「建议收藏」

    国内it软件外包公司排行榜是怎么样的「建议收藏」国内it软件外包公司排行榜是怎么样的由于互联网技术的快速发展,特别是手机移动端的的普及,使得企业越来越需要开发自己自己的软件,但是软件开发人才缺口很大,企业没有这个技术实力去开发自己的软件,对于中小企业也不好招人,而这软件外包开发公司就可以帮助企业实现目标,这其中鱼龙混杂,让不少想要软件外包开发的企业难以选择,那么国内软件外包公司排行榜是怎么样的呢?下面为大家介绍华盛恒辉排名…

  • stat 函数详解

    stat 函数详解stat函数作用:获取文件信息头文件:include<sys/types.h>#include<sys/stat.h>#include<unistd.h>​函数原型:intstat(constchar*path,structstat*buf)​返回值:成功返回0,失败返回-1;​参数:文件路径(名),structstat…

    2022年10月24日
  • mongodb存储的数据类型(redis存储数据类型)

    MongoDB数据存储结构1.基本概念在MongoDB中数据存储的基本概念是数据库、集合、文档。文档(document)是MongoDB中数据的基本存储单元,非常类似与关系型数据库管理系统中的行,当更有表现力。集合(collection)可以看作是一个拥有动态模式(dynamicschema)的表。MongoDB的一个实例可以拥有多个相互独立的数据库(database),每一…

  • color颜色十六进制编码大全

    color颜色十六进制编码大全最近刚开始学web,发现好的颜色搭配可以让自己的网页更加美观,中午不想做事,就无聊滴花了两个小时测试了所有颜色的编码,总结如下新手没有什么吊炸天的技术,仅仅是一份辅助的文档,有兴趣的朋友可以收藏下,开发中对于颜色的设置还是比较使用的,以下是对color颜色的十六进制的编码的总结,纯手工测试,转载请说明出处白色#FFFFFF象白色#FF

    2022年10月24日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号