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 部分的写法。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深入理解volatile关键字的作用(一)

    深入理解volatile关键字的作用(一) (一)计算机内存模型大家都知道在计算机执行程序的时候每条指令都是在cpu中执行的,那么执行指令的同时势必会有读取和写入的操作,那么这样就引申出了一个问题。那么在程序运行时数据的存储是在计算机中的主存中(物理内存)的而内存的读取和写入的速度与cpu的执行指令速度相比差距是很大的,这样就造成了与内存交互时程序执行效率大大降低,因此在cpu中就有了高速缓存。 也就说计算机cpu在执行指令时…

    2022年5月6日
    39
  • 深度学习之softmax损失函数[通俗易懂]

    深度学习之softmax损失函数[通俗易懂]深度学习之softmax损失函数归一化向量的每个元素均大于0小于1,且和为1,所以可以将其看作归属各个类别的概率。损失函数可以看作真实类别的负对数概率,希望其越小。importnumpyasnpD=784K=10N=128#scores是分值矩阵,每行代表一个样本scores=np.random.randn(N,K)print(scores.shape)#样本标签y=np.random.randint(K,size=N)print(y.shape)#指数化分值矩

    2022年6月26日
    35
  • 文本相似度计算python lda_python文本相似度计算

    文本相似度计算python lda_python文本相似度计算原标题 python 文本相似度计算数据挖掘入门与实战公众号 datadw 步骤分词 去停用词词袋模型向量化文本 TF IDF 模型向量化文本 LSI 模型向量化文本计算相似度理论知识两篇中文文本 如何计算相似度 相似度是数学上的概念 自然语言肯定无法完成 所有要把文本转化为向量 两个向量计算相似度就很简单了 欧式距离 余弦相似度等等各种方法 只需要中学水平的数学知识 那么如何将文本表示成向量呢 词袋模型

    2025年11月26日
    2
  • win10下MinGW安装及配置

    win10下MinGW安装及配置下载MinGW安装管理器进入官网MinGW官网点击右上角download,加载可能有些慢,稍等一下。点击如图下载。下载完install安装点击change选择你要安装的目录,continue继续。等待下载,下载完成后单击continue继续。现在MinGW安装管理器就有了,可以正式安装MinGW了安装MinGW上一步安装好管理器之后会自动在桌面创建一个快捷方式,双击打开…

    2022年6月15日
    30
  • 笔记视频_微信里笔记怎么编辑

    笔记视频_微信里笔记怎么编辑日常开发小笔记(this小操作)

    2022年4月21日
    49
  • docker学习

    docker学习学习视频:https://www.bilibili.com/video/BV1R4411F7t9?from=search&seid=17327712472204933619准备工作:登录

    2022年7月2日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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