MyBatis批量操作XML的完整实现方案

 更新时间:2025年12月19日 09:15:48   作者:Full Stack Developme  
本文介绍了MyBatis通过XML映射文件实现批量插入、更新和删除的完整方案,包括单条SQL批量插入、批量插入并返回主键、批量更新、批量删除以及动态批量操作,最后,分享了最佳实践建议,需要的朋友可以参考下

MyBatis 通过 XML 映射文件实现批量插入(insert)、更新(update)和删除(delete)的完整方案

1. 批量插入(insert)

1.1 单条SQL批量插入(推荐)

<insert id="batchInsert" parameterType="java.util.List">
    INSERT INTO user(name, age, email) VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.name}, #{item.age}, #{item.email})
    </foreach>
</insert>

1.2 批量插入并返回主键(MySQL)

<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user(name, age, email) VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.name}, #{item.age}, #{item.email})
    </foreach>
</insert>

1.3 批量插入(Oracle特殊语法)

<insert id="batchInsert">
    INSERT ALL
    <foreach collection="list" item="item">
        INTO user(id, name, age, email) 
        VALUES(#{item.id}, #{item.name}, #{item.age}, #{item.email})
    </foreach>
    SELECT 1 FROM DUAL
</insert>

2. 批量更新(update)

2.1 使用CASE WHEN批量更新(MySQL)

<update id="batchUpdate" parameterType="java.util.List">
    UPDATE user
    <trim prefix="SET" suffixOverrides=",">
        <trim prefix="name = CASE" suffix="END,">
            <foreach collection="list" item="item">
                WHEN id = #{item.id} THEN #{item.name}
            </foreach>
        </trim>
        <trim prefix="age = CASE" suffix="END,">
            <foreach collection="list" item="item">
                WHEN id = #{item.id} THEN #{item.age}
            </foreach>
        </trim>
        <trim prefix="email = CASE" suffix="END">
            <foreach collection="list" item="item">
                WHEN id = #{item.id} THEN #{item.email}
            </foreach>
        </trim>
    </trim>
    WHERE id IN
    <foreach collection="list" item="item" open="(" separator="," close=")">
        #{item.id}
    </foreach>
</update>

2.2 批量更新(Oracle)

<update id="batchUpdate" parameterType="java.util.List">
    <foreach collection="list" item="item" open="BEGIN" close=";END;" separator=";">
        UPDATE user SET
            name = #{item.name},
            age = #{item.age},
            email = #{item.email}
        WHERE id = #{item.id}
    </foreach>
</update>

3. 批量删除(delete)

3.1 普通批量删除

<delete id="batchDelete" parameterType="java.util.List">
    DELETE FROM user WHERE id IN
    <foreach collection="list" item="item" open="(" separator="," close=")">
        #{item.id}
    </foreach>
</delete>

3.2 批量删除(Oracle)

<delete id="batchDelete" parameterType="java.util.List">
    <foreach collection="list" item="item" open="BEGIN" close=";END;" separator=";">
        DELETE FROM user WHERE id = #{item.id}
    </foreach>
</delete>

4. 动态批量操作

4.1 动态批量插入(根据条件)

<insert id="dynamicBatchInsert">
    INSERT INTO user(name, age, email) VALUES
    <foreach collection="list" item="item" separator=",">
        <if test="item.name != null and item.email != null">
            (#{item.name}, #{item.age}, #{item.email})
        </if>
    </foreach>
</insert>

4.2 批量更新非空字段

<update id="batchUpdateSelective" parameterType="java.util.List">
    UPDATE user
    <trim prefix="SET" suffixOverrides=",">
        <trim prefix="name = CASE" suffix="END,">
            <foreach collection="list" item="item">
                <if test="item.name != null">
                    WHEN id = #{item.id} THEN #{item.name}
                </if>
            </foreach>
        </trim>
        <trim prefix="age = CASE" suffix="END,">
            <foreach collection="list" item="item">
                <if test="item.age != null">
                    WHEN id = #{item.id} THEN #{item.age}
                </if>
            </foreach>
        </trim>
    </trim>
    WHERE id IN
    <foreach collection="list" item="item" open="(" separator="," close=")">
        #{item.id}
    </foreach>
</update>

5. 最佳实践建议

  1. 批量大小控制:每批处理500-1000条数据最佳
  2. 事务管理:确保批量操作在一个事务中完成
  3. JDBC参数:MySQL添加rewriteBatchedStatements=true
  4. 执行器类型:对于大量数据考虑使用ExecutorType.BATCH
  5. 错误处理:考虑分批处理,避免单批失败导致全部回滚

到此这篇关于MyBatis批量操作XML的完整实现方案的文章就介绍到这了,更多相关MyBatis批量操作XML内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 从Date到LocalDateTime解析Java JDBC时间类型映射

    从Date到LocalDateTime解析Java JDBC时间类型映射

    在软件开发中,时间处理一直是一个复杂而微妙的问题,时区、夏令时、精度、数据库兼容性等问题时常困扰着开发者,本文将从历史演进的角度,深入探讨JDBC时间类型映射的最佳实践,并解释背后的原理
    2025-12-12
  • Java8中Optional类型和Kotlin中可空类型的使用对比

    Java8中Optional类型和Kotlin中可空类型的使用对比

    这篇文章主要给大家介绍了关于Java8中Optional类型和Kotlin中可空类型的使用对比,文中通过示例代码给大家介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • Spring依赖注入的几种方式分享梳理总结

    Spring依赖注入的几种方式分享梳理总结

    这篇文章主要介绍了Spring依赖注入的几种方式分享梳理总结,文章围绕主题展开详细,具有一定参考价值,需要的朋友可以参考一下
    2022-07-07
  • Java向MySQL添加中文数据数据库显示乱码的解决方案

    Java向MySQL添加中文数据数据库显示乱码的解决方案

    在用springboot做项目时,由于重新安装了本地Mysql数据库(5.7版本)在前台向数据库插入和更新数据可的时候,涉及中文的时候在数据库一直显示异常,所以本文给大家介绍了相关的解决方案,需要的朋友可以参考下
    2024-02-02
  • 一次诡异的full gc查找问题全过程

    一次诡异的full gc查找问题全过程

    这篇文章主要给大家分享介绍了一次诡异的full gc查找问题全部过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧啊
    2018-11-11
  • Springboot启动后执行方法小结

    Springboot启动后执行方法小结

    本文主要介绍了Springboot启动后执行方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 基于SpringBoot和Vue3的博客平台文章列表与分页功能实现

    基于SpringBoot和Vue3的博客平台文章列表与分页功能实现

    在前面的教程中,我们已经实现了基于Spring Boot和Vue3的发布、编辑、删除文章功能。本教程将继续引导您实现博客平台的文章列表与分页功能,需要的朋友可以参考阅读
    2023-04-04
  • maven如何在tomcat8中实现自动部署

    maven如何在tomcat8中实现自动部署

    本篇文章主要介绍了maven如何在tomcat8中实现自动部署,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java自动生成编号的方法步骤

    Java自动生成编号的方法步骤

    在新增数据时,往往需要自动生成编号,本文主要介绍了Java自动生成编号的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java调整图片大小的3种方式小结

    Java调整图片大小的3种方式小结

    在软件开发中处理图像是一个常见任务,特别是当我们需要优化图像尺寸以适应不同的应用场景时,这篇文章主要介绍了Java调整图片大小的3种方式,需要的朋友可以参考下
    2024-09-09

最新评论