Mybatis中进行批量修改的方法小结

 更新时间:2025年08月07日 08:21:18   作者:熊猫片沃子  
我们在使用 Mybatis 框架进行实现数据库操作的时候,通常会遇到一些需要进行批量修改的方式,本文对常见的 Mybatis 批量修改方法并进行了总结,希望对大家有所帮助

我们在使用 Mybatis 框架进行实现数据库操作的时候,通常会遇到一些需要进行批量修改的方式,不同的方式可适用不同的场景,也会出现一些优缺点。本文常见的 Mybatis 批量修改方法并进行总结:

1. 循环修改

通过 Java 循环调用单个 update 语句实现批量修改,不考虑性能,最简单,最偷懒的方式。

Mapper 接口

void updateUser(User user);

XML 映射

<update id="updateUser">
    UPDATE user 
    SET name = #{name}, age = #{age}
    WHERE id = #{id}
</update>

Service中调用

for (User user : userList) {
    userMapper.updateUser(user);
}

特点

  • 实现简单,易于理解和维护
  • 性能差(需要多次进行数据库连接和交互)
  • 适用于数据量极小的场景

2. 使用 MyBatis 的 foreach 标签构建批量修改SQL

通过 foreach 标签动态生成批量更新语句。

Mapper 接口

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

XML 映射

<update id="batchUpdate">
    UPDATE user 
    SET name = CASE
        <foreach collection="list" item="item" index="index">
            WHEN id = #{item.id} THEN #{item.name}
        </foreach>
    END,
    age = CASE
        <foreach collection="list" item="item" index="index">
            WHEN id = #{item.id} THEN #{item.age}
        </foreach>
    END
    WHERE id IN
    <foreach collection="list" item="item" separator="," open="(" close=")">
        #{item.id}
    </foreach>
</update>

特点

  • 一次数据库连接完成批量操作
  • SQL 语句长度随数据量增长,有可能超过数据库限制
  • 适用于中等数据量(建议不超过 1000 条)

3. 多条 SQL 语句批量执行

在一条 SQL 中包含多个 update 语句,用分号分隔。 Mapper 接口

void batchUpdateMultiSQL(@Param("list") List<User> userList);

XML 映射

<update id="batchUpdateMultiSQL">
    <foreach collection="list" item="item" separator=";">
        UPDATE user 
        SET name = #{item.name}, age = #{item.age}
        WHERE id = #{item.id}
    </foreach>
</update>

注意:进行这个操作的时候,需要在数据库连接 URL 中添加 allowMultiQueries=true 参数(以 MySQL 为例)。

特点

  • 实现简单,SQL 语句清晰
  • 同样存在 SQL 长度限制问题
  • 部分数据库可能不支持(需数据库特性支持)

4. 使用 BatchExecutor(MyBatis 批量执行器)

配置 MyBatis 执行器为 BATCH 模式,主要作用是累积所有Sql语句进行一次性执行的操作。

实现方式

SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper userMapper = session.getMapper(UserMapper.class);

for (User user : userList) {
    userMapper.updateUser(user);
}

session.commit();
session.close();

特点

  • MyBatis 内部优化的批量处理方式
  • 减少网络交互和事务提交次数
  • 内存占用可能较高(需注意批量大小)
  • 适用于大数据量批量操作

5. 使用数据库特定的批量更新语法

某些数据库提供了专有的批量更新语法,如 PostgreSQL 的 UPDATE ... FROM 语法。

PostgreSQL 示例

<update id="batchUpdatePostgreSQL">
    UPDATE user u
    SET name = c.name, age = c.age
    FROM (
        VALUES
        <foreach collection="list" item="item" separator=",">
            (#{item.id}, #{item.name}, #{item.age})
        </foreach>
    ) AS c(id, name, age)
    WHERE u.id = c.id
</update>

特点

  • 性能好,充分利用数据库特性
  • 数据库兼容性差,移植性低
  • 适用于固定使用特定数据库的场景

方法比较总结

方法优点缺点适用场景
循环修改简单直观,易于调试性能差,多次交互数据量极小(<10 条)
foreach 构建 CASE 语句一次交互,兼容性好SQL 长度有限制中等数据量(<1000 条)
多条 SQL 语句批量执行实现简单,SQL 清晰需数据库支持,有长度限制数据量较小,且数据库支持
BatchExecutor性能好,MyBatis 原生支持内存占用高,需手动管理会话大数据量批量操作
数据库特定语法性能最优,利用数据库特性兼容性差,移植性低固定数据库,追求极致性能

个人建议

数据量小时(<100 条),优先考虑 foreach 构建 CASE 语句。

数据量大时(>1000 条),建议使用 BatchExecutor 并分批处理(每批 500-1000 条)。

考虑数据库特性,如果项目固定使用某一数据库,可采用其专有的批量语法。

避免循环单次修改,除非数据量极小且对性能无要求。

最主要一点,选择合适的批量修改方式需综合考虑数据量大小、数据库类型、性能要求和代码可维护性等因素。

到此这篇关于Mybatis中进行批量修改的方法小结的文章就介绍到这了,更多相关Mybatis批量修改内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java+opencv3.2.0实现hough直线检测

    Java+opencv3.2.0实现hough直线检测

    这篇文章主要为大家详细介绍了Java+opencv3.2.0之hough直线检测,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 隐藏idea的.idea和.mvn文件的解决方案

    隐藏idea的.idea和.mvn文件的解决方案

    这篇文章主要介绍了隐藏idea的.idea和.mvn文件的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Centos7.3下jre1.8安装和配置教程

    Centos7.3下jre1.8安装和配置教程

    这篇文章主要为大家详细介绍了Centos7.3下jre1.8安装和配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Jackson使用示例-Bean、XML、Json之间相互转换

    Jackson使用示例-Bean、XML、Json之间相互转换

    Jackson是一个强大工具,可用于Json、XML、实体之间的相互转换,JacksonXmlElementWrapper用于指定List等集合类,外围标签名,JacksonXmlProperty指定包装标签名,或者指定标签内部属性名,JacksonXmlRootElement指定生成xml根标签的名字,JacksonXmlText指定当前这个值
    2024-05-05
  • java自定义任务类定时执行任务示例 callable和future接口使用方法

    java自定义任务类定时执行任务示例 callable和future接口使用方法

    Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务
    2014-01-01
  • 举例讲解设计模式中的访问者模式在Java编程中的运用

    举例讲解设计模式中的访问者模式在Java编程中的运用

    这篇文章主要介绍了举例讲解设计模式中的访问者模式在Java编程中的运用,访问者模式是一种将算法与对象结构分离的软件设计模式,需要的朋友可以参考下
    2016-05-05
  • MyBatis-Plus 如何单元测试的实现

    MyBatis-Plus 如何单元测试的实现

    这篇文章主要介绍了MyBatis-Plus 如何单元测试的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java将word文件转成pdf文件的操作方法

    Java将word文件转成pdf文件的操作方法

    这篇文章主要介绍了Java将word文件转成pdf文件的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 在springboot中对kafka进行读写的示例代码

    在springboot中对kafka进行读写的示例代码

    本篇文章主要介绍了在springboot中对kafka进行读写的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Java设计模式之策略模式详解和示例

    Java设计模式之策略模式详解和示例

    这篇文章主要介绍了Java设计模式之策略模式详解和示例,策略模式就是一种行为可能会因为不同的逻辑造成多个算法,比如人吃饭,美国人吃饭用刀叉,中国吃饭用筷子,都是吃饭的行为但是使用的工具(算法)不一样,需要的朋友可以参考下
    2024-01-01

最新评论