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

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.xdnf.cn/news/16973.html

相关文章:

  • 大模型(五)MOSS-TTSD学习
  • Windows 环境 psql 客户端连接数据库超慢问题
  • Mac电脑安装HomeBrew
  • GitHub 趋势日报 (2025年08月01日)
  • 【转】大模型安全治理的现状与展望
  • 【Leetcode】2561. 重排水果
  • Paper Reading《TrafficFormer: An Efficient Pre-trained Model for Traffic Data》
  • 【Leetcode hot 100】49.字母异位词分组
  • Windows中使用Qwen模型:VSCode+Cline
  • ABP VNext + NATS JetStream:高性能事件流处理
  • 【智能体cooragent】不同的单智能体调用的大模型的推理的输入与输出
  • flutter分享到支付宝
  • 模拟激光相机工作站版本6.0 5.2.32 6.0.44 6.031 5.2.20
  • LeetCode 每日一题 2025/7/28-2025/8/3
  • gcc-arm-none-eabi安装后,找不到libgcc.a的拉置
  • Java基础暑假每日一练
  • 集成电路学习:什么是CMSIS微控制器软件接口标准
  • Json Jsoncpp
  • sqli-labs:Less-20关卡详细解析
  • Gossip 协议
  • 用 Qt 打造优雅的密码输入框:添加右侧眼睛图标切换显示
  • 关于Web前端安全防御之点击劫持的原理及防御措施
  • OpenCV HSV与RGB颜色模型的区别
  • Elasticsearch+Logstash+Filebeat+Kibana单机部署
  • 论文笔记:Bundle Recommendation and Generation with Graph Neural Networks
  • OpenCV 全解读:核心、源码结构与图像/视频渲染能力深度对比
  • 电力系统分析笔记:发电机与变压器的数学建模与运行状态详解
  • 图漾AGV行业常用相机使用文档
  • Unity —— Android 应用构建与发布​
  • 边缘计算优化!陌讯轻量化模型实现路面裂缝误检率↓78%