mybatis批量更新

  金牌会员 | 2024-12-6 02:59:10 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 857|帖子 857|积分 2571

参考:
mybatis批量更新
https://blog.csdn.net/qq_16992475/article/details/139633631
https://blog.csdn.net/zk673820543/article/details/106579809/
记得修改配置,增长rewriteBatchedStatements=true
  1. datasource:
  2.     type: com.alibaba.druid.pool.DruidDataSource
  3.     driverClassName: com.mysql.cj.jdbc.Driver
  4.     druid:
  5.         # 主库数据源
  6.         master:
  7.             url: jdbc:mysql://xxx:3306/xxx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
  8.             username: xxx
  9.             password: xxx
复制代码
保举方式

第三种方案,利用sqlSessionFactory实现批量插入(保举)
  1. @Resource
  2. private SqlSessionFactory sqlSessionFactory;
  3. // 关闭session的自动提交
  4. SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
  5. try {
  6.     UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  7.     list.stream().forEach(user -> userMapper.saveInfo(user));
  8.     // 提交数据
  9.     sqlSession.commit();
  10. } catch (Exception e) {
  11.     sqlSession.rollback();
  12. } finally {
  13.     sqlSession.close();
  14. }
复制代码
上风:这种方式可以说是集第一种和第二种方式的优点于一身,既可以提高运行效率,又可以包管大数据量时实行成功,大数据量时保举利用这种方式。
其他方式

批量修改方案

第一种 for

  1.     <!-- 批量更新第一种方法,通过接收传进来的参数list进行循环着组装sql -->
  2.     <update id="updateBatch" parameterType="java.util.List">
  3.         <foreach collection="list" item="item" index="index" open="" close="" separator=";">
  4.             update people
  5.             <set>
  6.                 <if test="item.firstName != null">
  7.                     first_name = #{item.firstName,jdbcType=VARCHAR},
  8.                 </if>
  9.                 <if test="item.lastName != null">
  10.                     last_name = #{item.lastName,jdbcType=VARCHAR},
  11.                 </if>
  12.             </set>
  13.             where id = #{item.id,jdbcType=BIGINT}
  14.         </foreach>
  15.     </update>
复制代码
第二种 case when

  1.     <!-- 批量更新第二种方法,通过 case when语句变相的进行批量更新 -->
  2.     <update id="updateBatch2" parameterType="java.util.List">
  3.         update people
  4.         <trim prefix="set" suffixOverrides=",">
  5.             <trim prefix="first_name = case" suffix="end,">
  6.                 <foreach collection="list" item="i" index="index">
  7.                     <if test="i.firstName!=null">
  8.                         when id=#{i.id} then #{i.firstName}
  9.                     </if>
  10.                 </foreach>
  11.             </trim>
  12.             <trim prefix="last_name = case" suffix="end,">
  13.                 <foreach collection="list" item="i" index="index">
  14.                     <if test="i.lastName!=null">
  15.                         when id=#{i.id} then #{i.lastName}
  16.                     </if>
  17.                 </foreach>
  18.             </trim>
  19.         </trim>
  20.         where id in
  21.         <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
  22.             #{item.id,jdbcType=BIGINT}
  23.         </foreach>
  24.     </update>
复制代码
第三种 replace into

  1. <!-- 批量更新第三种方法,通过 replace into  -->
  2. <update id="updateBatch3" parameterType="java.util.List">
  3.     replace into people
  4.     (id,first_name,last_name) values
  5.     <foreach collection="list" index="index" item="item" separator=",">
  6.         (#{item.id},
  7.         #{item.firstName},
  8.         #{item.lastName})
  9.     </foreach>
  10. </update>
复制代码
第四种 ON DUPLICATE KEY UPDATE

  1.     <!-- 批量更新第四种方法,通过 duplicate key update  -->
  2.     <update id="updateBatch4" parameterType="java.util.List">
  3.         insert into people
  4.         (id,first_name,last_name) values
  5.         <foreach collection="list" index="index" item="item" separator=",">
  6.             (#{item.id},
  7.             #{item.firstName},
  8.             #{item.lastName})
  9.         </foreach>
  10.         ON DUPLICATE KEY UPDATE
  11.         id=values(id),first_name=values(first_name),last_name=values(last_name)
  12.     </update>
  13.    
复制代码
效率比较


总结

sql语句for循环效率实在相当高的,因为它仅仅有一个循环体,只不外最后update语句比较多,量大了就有可能造成sql壅闭。
case when虽然最后只会有一条更新语句,但是xml中的循环体有点多,每一个case when 都要循环一遍list聚集,所以大批量拼sql的时间会比较慢,所以效率题目严厉。利用的时间发起分批插入。
duplicate key update可以看出来是最快的,但是一般大公司都禁用,公司一般都禁止利用replace into和INSERT INTO … ON DUPLICATE KEY UPDATE,这种sql有可能会造成数据丢失和主从上表的自增id值不一致。而且用这个更新时,记得一定要加上id,而且values()括号里面放的是数据库字段,不是java对象的属性字段

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表