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. 最佳实践建议
- 批量大小控制:每批处理500-1000条数据最佳
- 事务管理:确保批量操作在一个事务中完成
- JDBC参数:MySQL添加
rewriteBatchedStatements=true - 执行器类型:对于大量数据考虑使用
ExecutorType.BATCH - 错误处理:考虑分批处理,避免单批失败导致全部回滚
到此这篇关于MyBatis批量操作XML的完整实现方案的文章就介绍到这了,更多相关MyBatis批量操作XML内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
基于SpringBoot和MongoDB实现实时分析和日志处理功能
实时分析和日志处理在现代应用程序开发中扮演着重要的角色,MongoDB是一个非常流行的NoSQL数据库,其高性能和灵活性使其成为实时分析和日志处理的理想选择,本文将介绍如何使用 Spring Boot 和 MongoDB 实现实时分析和日志处理的功能2023-06-06
Java Hibernate对象(瞬时态,持久态,脱管态)详解
这篇文章主要介绍了Java Hibernate对象(瞬时态,持久态,脱管态)详解的相关资料,这里对Java Hibernate对象进行了介绍及总结,需要的朋友可以参考下2016-11-11
登录EasyConnect后无法通过jdbc访问服务器数据库问题的解决方法
描述一下近期使用EasyConnect遇到的问题,下面这篇文章主要给大家介绍了关于登录EasyConnect后无法通过jdbc访问服务器数据库问题的解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下2023-02-02
Windows下后端如何启动SpringBoot的Jar项目
这篇文章主要介绍了Windows下后端如何启动SpringBoot的Jar项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-07-07
浅谈@RequestBody和@RequestParam可以同时使用
这篇文章主要介绍了@RequestBody和@RequestParam可以同时使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03


最新评论