返回顶部
首页 > 资讯 > 数据库 >Mybatis批量更新优化方案
  • 386
分享到

Mybatis批量更新优化方案

mybatismysqljava 2023-09-08 14:09:29 386人浏览 泡泡鱼
摘要

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

目录

前言

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

需求

同步部门数据到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

您可能感兴趣的文档:

--结束END--

本文标题: Mybatis批量更新优化方案

本文链接: https://www.lsjlt.com/news/400021.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作