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

批量更新数据:Mybatis update foreach 和 update case when 写法及比较

        在平常的开发工作中,我们经常需要批量更新数据,业务需要每次批量更新几千条数据,采用 update foreach 写法的时候,接口响应 10s 左右,优化后,采用 update ... case when 写法,接口响应 2s 左右。今天来总结一下两种常见的写法使用场景及性能比较。

一:foreach 批量更新

<update id="batchUpdateStudentScore"><foreach collection="list" item="item" separator=";">UPDATE student_scoreSET score = #{item.score}, grade = #{item.grade}  <!-- 修复原写法的语法错误 -->WHERE id = #{item.id}</foreach>
</update>

        生成的执行sql如下:

UPDATE student_score SET score = 85, grade = 'A' WHERE id = 1;
UPDATE student_score SET score = 70, grade = 'B' WHERE id = 2;
UPDATE student_score SET score = 95, grade = 'A+' WHERE id = 3;

二:update ... case when 批量更新

<update id="batchUpdateStudentScore">UPDATE student_scoreSET score = CASE <foreach collection="list" item="item" separator="">WHEN id = #{item.id} THEN #{item.score}</foreach>ELSE score END,grade = CASE <foreach collection="list" item="item" separator="">WHEN id = #{item.id} THEN #{item.grade}</foreach>ELSE grade ENDWHERE id IN <foreach collection="list" item="item" open="(" separator="," close=")">#{item.id}</foreach>
</update>

        生成的执行sql如下:

UPDATE student_score
SET score = CASE WHEN id = 1 THEN 85 WHEN id = 2 THEN 70 WHEN id = 3 THEN 95 ELSE score END,grade = CASE WHEN id = 1 THEN 'A' WHEN id = 2 THEN 'B' WHEN id = 3 THEN 'A+' ELSE grade END
WHERE id IN (1, 2, 3);

三:对比总结

维度

foreach批量更新

UPDATE ... CASE WHEN批量更新

SQL 语句数量

N 条(N = 列表长度)

1 条

数据库交互次数

N 次

1 次

原子性依赖事务天然原子性
适用数据量50 条50 条 - 5000 条,数量量超过 1000 时建议分批

网络传输量

大(多次传输 SQL)

小(单次传输长 SQL)

  总结:foreach 本质都是循环执行多条 SQL,效率远低于 case when,当一次批量更新的数据大于10条时,建议采用 case when 写法。

 四:使用场景

1:foreach 批量更新适用场景

        a:如单次更新 10 条以内,循环的性能损耗可忽略。

        b:每条记录更新需单独控制事务(如某条失败不影响其他)。

        注意:需确保数据库连接池允许批量执行多条 SQL(如 MySQL 需开启allowMultiQueries=true)。数据量过大(如 N>1000)可能导致连接超时或 SQL 注入风险增加。

2. update...case when 适用场景

        a:单次更新 50-1000 条,需减少数据库交互次数。

        b:仅需根据主键(id)匹配更新值,无需额外计算。

        c:同时更新多个字段时,case when 比  foreach 更简洁高效。

        注意:必须加 where id in (...),否则会全表扫描(未匹配记录会被ELSE保持原值,但浪费性能)。若 N>1000,生成的 SQL 可能过长,建议分批次(如每 500 条一批)。

五:总结

        数据量小于 50 条时,优先采用 update foreach,写法简单,性能也可以。当大于 50 条,甚至上千条时,采用 update...case when 写法,执行效率高,比 update foreach 写法性能提升几倍。但是如果一次更新几千条数据,建议分批执行,比如每500条执行一次。


文章转载自:

http://SJymq2X8.hngmg.cn
http://AszCYhtx.hngmg.cn
http://d1PsShve.hngmg.cn
http://RzgtDijv.hngmg.cn
http://d7dghfcc.hngmg.cn
http://b9ugkNP5.hngmg.cn
http://9mUo9hOv.hngmg.cn
http://z2tIlHCQ.hngmg.cn
http://7evpkgo3.hngmg.cn
http://AybI0P92.hngmg.cn
http://lZw9Cy3S.hngmg.cn
http://GvDXtTgr.hngmg.cn
http://Y74CtcbL.hngmg.cn
http://PuThILcR.hngmg.cn
http://PyPAlwcn.hngmg.cn
http://8BRz4DaM.hngmg.cn
http://a4tCG4cc.hngmg.cn
http://OVLrF3FM.hngmg.cn
http://Z3KfxxBE.hngmg.cn
http://uybmGvdg.hngmg.cn
http://AK10rWha.hngmg.cn
http://j1NyVD5n.hngmg.cn
http://9BNpTl6Y.hngmg.cn
http://KbehRAJ6.hngmg.cn
http://cDQVor47.hngmg.cn
http://evFsdHx9.hngmg.cn
http://t6hj7xSd.hngmg.cn
http://MQj3Mj3U.hngmg.cn
http://FjlyZaNq.hngmg.cn
http://FI24U0wK.hngmg.cn
http://www.dtcms.com/a/377676.html

相关文章:

  • 九、瑞萨发布RZT/N认证的PROFINET-IRT和PROFIdrive软件协议栈
  • Linux系统学习之注意事项及命令基本格式
  • MoE架构训练系统设计:专家并行与门控网络优化策略
  • 深入分析神马 M56S+ 202T 矿机参数与性能特点
  • 工业RFID现场网关模块:实现多协议互通,128台读写设备互连!
  • Linux系统之----信号
  • 硅基计划4.0 算法 归并排序
  • 关于发布未来工业互联网基础理论与关键技术重大研究计划2025年度项目指南的通告
  • RAG技术解析:AI如何“边查边答”,还要守住数据安全底线?
  • 多通道相参信号
  • 数据映射表
  • NVSpeech_170k 数据集音频提取处理
  • GC Root的一些理解
  • Windows 使用 SHFileOperation 实现文件复制功能
  • Linux防火墙-Firewalld
  • 面壁智能开源多模态大模型——MiniCPM-V 4.5本地部署教程:8B参数开启多模态“高刷”时代!
  • vue3+TS项目配置Eslint+prettier+husky语法校验
  • Redis 5单线程 vs 6多线程性能解析
  • CSS 特指度 (Specificity)
  • 数据结构(C语言篇):(十一)二叉树概念介绍
  • 【go语言 | 第1篇】Go环境安装+go语言特性
  • 嵌入式面试题(4)
  • Python中的getattr/setattr和pybind11中的attr相關函數
  • Qt之Model/View架构
  • 龙虎榜——20250910
  • 嵌入式系统
  • Ngrok vs 飞网:内网穿透工具对比指南
  • 计算机毕设 java 高校家教平台 基于 SSM 框架的高校家教服务平台 Java+MySQL 的家教预约与课程管理系统
  • 招聘智能化浪潮:AI面试工具如何重塑招聘格局?
  • Java EE servlet与MySQL表单 工程实现增加查询数据