我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mybatis批量更新优化方案

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mybatis批量更新优化方案

目录

前言

今天在对接客户接口的时候,对方同步数据到我们系统,涉及到数据批量更新,插入的逻辑,出于性能方面的考虑,决定对自己写的逻辑进行优化,下面对几种优化方案进行总结。

需求

同步部门数据到mysql数据库,响应示例:

在这里插入图片描述
拿到json后,如果数据库不存在部门数据,则进行插入操作;存在部门数据,则做修改操作。这里演示存在数据进行修改操作。

原方案

使用mybatis-plus的saveOrUpdateBatch接口

修改部分代码逻辑:
在这里插入图片描述

启动项目进行测试:

在这里插入图片描述

经测试,接收的数据30条左右,耗时 1082ms ,显然达不到预期的性能要求,于是针对此进行优化。

优化方案一

在mybatis的xml文件中,使用foreach标签来拼接SQL语句。

代码示例:

    <update id="updateBatchById">        <foreach collection="list" item="item" separator=";">            update            `sys_dept`            set            `DEPT_NAME` = #{item.deptName},            `DEPT_CODE` = #{item.deptCode},            `PARENT_ID` = #{item.parentId}            where            dept_id = #{item.deptId}        </foreach>    </update>

mapper层:

        void updateBatchById(@Param("list") List<SysDept> list);

然后在修改数据的逻辑中,直接调用mapper的接口

在这里插入图片描述

重启项目,再次测试:

在这里插入图片描述

可以看到,同样的数据,这个方案耗时273ms

优化方案二

foreach标签配合case when拼接SQL语句。

代码示例:

<update id="batchUpdate" parameterType="java.util.List">        update sys_dept        <trim prefix="set" suffixOverrides=",">            <trim prefix=" `DEPT_NAME` = case " suffix=" end, ">                <foreach collection="list" item="item">                    <if test="item.deptName != null">                        when dept_id = #{item.deptId} then #{item.deptName}                    </if>                </foreach>            </trim>            <trim prefix=" `DEPT_CODE` = case " suffix=" end, ">                <foreach collection="list" item="item">                    <if test="item.deptCode != null">                        when dept_id = #{item.deptId} then #{item.deptCode}                    </if>                </foreach>            </trim>            <trim prefix=" `PARENT_ID` = case " suffix=" end, ">                <foreach collection="list" item="item">                    <if test="item.parentId != null">                        when dept_id = #{item.deptId} then #{item.parentId}                    </if>                </foreach>            </trim>        </trim>        where        dept_id in        <foreach collection="list" item="item" open="(" close=")" separator=",">            #{item.deptId}        </foreach>    </update>

mapper层:

        void batchUpdate(@Param("list") List<SysDept> list);

修改逻辑处直接调用:

在这里插入图片描述
重启项目,再次测试:

在这里插入图片描述
可以看到,同样的数据,这个方案耗时131ms。

经过多次测试会发现,在本案例中,优化方案二性能略强于优化方案一

总结

使用mybatisplus的saveOrUpdateBatch操作效率极低,查看sql日志可以发现,实际上还是一条一条插入的,而且在插入之前还要查询数据库是否存在该数据,耗时很久,建议不要使用。优化方案一是多条sql语句,需要数据库执行多次修改操作,而优化方案二是一条sql语句,只需要数据库执行一次修改操作。在数据量不是特别大的情况下,优化方案二优于优化方案一。

在数据量不大的情况下,推荐使用方案二。

来源地址:https://blog.csdn.net/lianaozhe/article/details/129872757

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mybatis批量更新优化方案

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MyBatis iterate优化大数据批量更新

在处理大数据批量更新时,MyBatis 提供了一些方法来优化性能。以下是一些建议:使用批量更新:在 MyBatis 的 XML 映射文件中,可以使用 标签进行批量更新。这样可以将多个更新操作合并为一个 SQL 语句,从而
MyBatis iterate优化大数据批量更新
2024-09-19

MyBatis批量更新(updateBatch)

更新多条数据,每条数据都不一样 通常有两种解决方法: 1) 在业务代码中循环遍历逐条更新。 2) 一次性更新所有数据(更准确的说是一条sql语句来更新所有数据,逐条更新的操作放到数据库端,在业务代码端展现的就是一次性更新所有数据)。 逐条更
2023-08-17

mysql批量更新怎么优化

在 mysql 中批量更新数据时,可以采用以下技巧来优化性能:1. 使用事务来锁定数据,防止并发问题;2. 使用批量更新语句来一次性更新多行;3. 使用 preparedstatements 来减少开销;4. 减少锁竞争,使用乐观锁机制;5
mysql批量更新怎么优化
2024-05-30

mybatis-plus的批量新增/批量更新以及问题

这篇文章主要介绍了Mybatis-Plus实现批量新增与批量更新以及出现的问题,文章中有详细的代码示例,感兴趣的同学可以参考一下
2023-05-15

基于mybatis进行批量更新

MyBatis是一种基于Java的持久层框架,提供了一种优雅的方式来进行数据库操作。对于批量更新数据操作,MyBatis 提供了两种方法:使用 foreach 标签和 batch 执行器。 使用 foreach 标签 使用 foreach
2023-08-18

mybatis怎么批量更新数据

MyBatis 可以通过批量操作来更新数据。下面是一个示例代码,展示如何使用 MyBatis 进行批量更新数据:1. 首先,需要在 Mapper XML 文件中定义一个批量更新的 SQL 语句,如下所示:```xmlUPDATE table
2023-08-09

Mybatis 大数据量批量写优化的案例详解

这篇文章主要介绍了Mybatis 大数据量批量写优化的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-18

大批量数据分批批量插入或更新(Mybatis+MySQL)

大批量数据分批批量插入或更新 在MySQL数据库的前提下,插入或更新大批量数据。首先批量插入需要考虑到以下几个因素: 数据库一次可以承受多大或者多少条数据的插入批量插入是否会占用Mysql资源太久,影响系统整体使用性能代码中的集合是否会造成
2023-08-30

Mybatis执行多条语句/批量更新方式

这篇文章主要介绍了Mybatis执行多条语句/批量更新方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-13

mybatis-plus的批量新增/批量更新问题怎么解决

本文小编为大家详细介绍“mybatis-plus的批量新增/批量更新问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatis-plus的批量新增/批量更新问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
2023-07-06

MyBatis ORM的批量操作优化

MyBatis ORM的批量操作优化是提高数据库操作效率的关键。通过减少数据库访问次数、降低网络开销、提高事务效率、减少资源消耗、优化内存使用、提高并发度以及降低锁的竞争,可以显著提升整体性能。以下是一些关于MyBatis ORM批量操作优
MyBatis ORM的批量操作优化
2024-09-16

编程热搜

目录