当前位置: 首页 > news >正文

MyBatis 批量操作 XML 实现方式

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 SETname = #{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. 错误处理:考虑分批处理,避免单批失败导致全部回滚

http://www.dtcms.com/a/311149.html

相关文章:

  • 【BTC】挖矿难度调整
  • Vue 详情模块 3
  • Matplotlib - Python图表可视化利器
  • Vue3核心语法进阶(computed与监听)
  • 除数博弈(动态规划)
  • cs336之注意pytorch的tensor在哪里?(assert的使用)
  • vue3渲染html数据并实现文本修改
  • 【7.5 Unity AssetPostprocessor】
  • 大模型 + 垂直场景:搜索 / 推荐 / 营销 / 客服领域开发有哪些新玩法?
  • Flask 框架全面详解
  • C语言字符函数和字符串函数全解析:从使用到模拟实现
  • MyBatis与MySQL
  • 【安装教程】Docker Desktop 安装与使用教程
  • 从毫秒到真义:构建工业级RAG系统的向量检索优化指南
  • Python爬虫实战:研究mahotas库,构建图像获取及处理系统
  • (思维)洛谷 P13551 ももいろの鍵 题解
  • 位菜:仪式锚与价值符
  • 24黑马SpringCloud的Docker本地目录挂载出现相关问题解决
  • 【图像处理基石】用Python实现基础滤镜效果
  • LLM中Function Call的原理及应用
  • 工业仪表盘识别误检率↓79%!陌讯多模态融合算法在设备巡检中的落地优化​
  • 安全光幕Muting功能程序逻辑设计
  • [mssql] 分析SQL Server中执行效率较低的SQL语句
  • Git、Gitee、GitHub、GitLab完整讲解:从基础到进阶
  • GaussDB 约束的使用举例
  • Leetcode-141.环形链表
  • Rust: 工具链版本更新
  • Linux网络-------4.传输层协议UDP/TCP-----原理
  • Ajax——异步前后端交互提升OA系统性能体验
  • python chardet文本编码识别代码