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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot 使用Jasypt加密的完整例子

    Spring Boot 使用Jasypt加密的完整例子

    本文介绍SpringBoot集成Jasypt加密的配置方法,涵盖依赖导入、秘钥设置、ENC()加密值使用及项目示例,重点说明秘钥格式规范与解密请求方式,帮助实现敏感数据加密,感兴趣的朋友一起看看吧
    2025-07-07
  • 基于SpringBoot和MongoDB实现实时分析和日志处理功能

    基于SpringBoot和MongoDB实现实时分析和日志处理功能

    实时分析和日志处理在现代应用程序开发中扮演着重要的角色,MongoDB是一个非常流行的NoSQL数据库,其高性能和灵活性使其成为实时分析和日志处理的理想选择,本文将介绍如何使用 Spring Boot 和 MongoDB 实现实时分析和日志处理的功能
    2023-06-06
  • 详解springboot集成mybatis xml方式

    详解springboot集成mybatis xml方式

    这篇文章主要介绍了详解springboot集成mybatis xml方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Java Hibernate对象(瞬时态,持久态,脱管态)详解

    Java Hibernate对象(瞬时态,持久态,脱管态)详解

    这篇文章主要介绍了Java Hibernate对象(瞬时态,持久态,脱管态)详解的相关资料,这里对Java Hibernate对象进行了介绍及总结,需要的朋友可以参考下
    2016-11-11
  • 登录EasyConnect后无法通过jdbc访问服务器数据库问题的解决方法

    登录EasyConnect后无法通过jdbc访问服务器数据库问题的解决方法

    描述一下近期使用EasyConnect遇到的问题,下面这篇文章主要给大家介绍了关于登录EasyConnect后无法通过jdbc访问服务器数据库问题的解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Windows下后端如何启动SpringBoot的Jar项目

    Windows下后端如何启动SpringBoot的Jar项目

    这篇文章主要介绍了Windows下后端如何启动SpringBoot的Jar项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 浅谈@RequestBody和@RequestParam可以同时使用

    浅谈@RequestBody和@RequestParam可以同时使用

    这篇文章主要介绍了@RequestBody和@RequestParam可以同时使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot使用Sa-Token实现登录认证

    SpringBoot使用Sa-Token实现登录认证

    本文主要介绍了SpringBoot使用Sa-Token实现登录认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • SpringBoot 版本兼容性问题解决

    SpringBoot 版本兼容性问题解决

    本文详细介绍了SpringBoot版本兼容性问题的常见场景,包括与SpringFramework、依赖库、JDK、SpringCloud及插件及工具的兼容性问题,帮助开发者避免兼容性问题,确保项目的稳定性和可维护性
    2024-10-10
  • Java正则表达式API Matcher类方法

    Java正则表达式API Matcher类方法

    这篇文章主要介绍了Java正则表达式API Matcher类方法,对Matcher类的一些有用方法进行功能对它们进行分组展开介绍,需要的朋友可以参考一下
    2022-06-06

最新评论