批量更新数据: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://www.pswp.cn/web/96290.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础篇04:数组、二维数组

1 数组 数组是一个数据容器&#xff0c;可用来存储一批同类型的数据。 1.1 数组的定义方式 静态初始化 数据类型[][] 数组名 {元素1&#xff0c;元素2&#xff0c;元素3}; string[][] name {"wfs","jsc","qf"} 动态初始化 数据类型[][] 数组名…

unity开发类似个人网站空间

可以用 Unity 开发 “个人网站空间” 类工具&#xff0c;但需要结合其技术特性和适用场景来判断是否合适。以下从技术可行性、优势、局限性、适用场景四个方面具体分析&#xff1a;一、技术可行性Unity 本质是游戏引擎&#xff0c;但具备开发 “桌面应用” 和 “交互内容” 的能…

SDK游戏盾如何实现动态加密

SDK游戏盾的动态加密体系通过​​密钥动态管理、多层加密架构、协议混淆、AI自适应调整及设备绑定​​等多重机制协同作用&#xff0c;实现对游戏数据全生命周期的动态保护&#xff0c;有效抵御中间人攻击、协议破解、重放攻击等威胁。以下从核心技术与实现逻辑展开详细说明&am…

TensorFlow平台介绍

什么是 TensorFlow&#xff1f; TensorFlow 是一个由 Google Brain 团队 开发并维护的 开源、端到端机器学习平台。它的核心是一个强大的数值计算库&#xff0c;特别擅长于使用数据流图来表达复杂的计算任务&#xff0c;尤其适合大规模机器学习和深度学习模型的构建、训练和部署…

TENGJUN防水TYPE-C连接器:立贴结构与IPX7防护的精密融合

在户外电子、智能家居、车载设备等对连接可靠性与空间适配性要求严苛的场景中&#xff0c;连接器不仅是信号与电力传输的“桥梁”&#xff0c;更需抵御潮湿、粉尘等复杂环境的侵蚀。TENGJUN防水TYPE-C连接器以“双排立贴”为核心设计&#xff0c;融合锌合金底座、精准尺寸控制与…

Spring Boot + Vue 项目中使用 Redis 分布式锁案例

加锁使用命令&#xff1a;set lock_key unique_value NX PX 1000NX:等同于SETNX &#xff0c;只有键不存在时才能设置成功PX&#xff1a;设置键的过期时间为10秒unique_value&#xff1a;一个必须是唯一的随机值&#xff08;UUID&#xff09;&#xff0c;通常由客户端生成…

微信小程序携带token跳转h5, h5再返回微信小程序

需求: 在微信小程序内跳转到h5, 浏览完后点击返回按钮再返回到微信小程序中 微信小程序跳转h5: 微信小程序跳转h5,这个还是比较简单的, 但要注意细节 一、微信小程序代码 1.新建跳转h5页面, 新建文件夹,新建page即可 2.使用web-view标签 wxml页面 js页面 到此为止, 小程序…

【机器学习】通过tensorflow实现猫狗识别的深度学习进阶之路

【机器学习】通过tensorflow实现猫狗识别的深度学习进阶之路 简介 猫狗识别作为计算机视觉领域的经典入门任务&#xff0c;不仅能帮助我们掌握深度学习的核心流程&#xff0c;更能直观体会到不同优化策略对模型性能的影响。本文将从 “从零搭建简单 CNN” 出发&#xff0c;逐步…

异步处理(前端面试)

Promise 1&#xff1a;使用promise原因 了解回调地狱【什么是回调地狱】 1&#xff1a;回调地狱是异步获取结果后&#xff0c;为下一个异步函数提供参数&#xff0c;层层回调嵌入回调 2&#xff1a;导致回调层次很深&#xff0c;代码维护特别困难 3&#xff1a;在没有ES6时&…

3种XSS攻击简单案例

1、接收cookie端攻击机上用python写个接收web程序flask from flask import Flask, request, Responseapp Flask(__name__)app.route(/) def save_cookie():cookie request.args.get(cookie, )if cookie:with open(/root/cookies.txt, a) as f:f.write(f"{cookie}\n"…

Docker 部署生产环境可用的 MySQL 主从架构

简介跨云服务器一主一从&#xff0c;可以自己按照逻辑配置多个从服务器 假设主服务器ip: 192.168.0.4 从服务器ip&#xff1a;192.168.0.5 系统 CentOS7.9 &#xff08;停止维护了&#xff0c;建议大家用 Ubuntu 之类的&#xff0c;我这个没办法&#xff0c;前人在云服务器上…

DeepResearch(上)

概述 OpenAI首先推出Deep Research Agent&#xff0c;深度研究智能体&#xff0c;简称DRA。 通过自主编排多步骤网络探索、定向检索和高阶综合&#xff0c;可将大量在线信息转换为分析师级别的、引用丰富的报告&#xff0c;将数小时的手动桌面研究压缩为几分钟。 作为新一代…

附050.Kubernetes Karmada Helm部署联邦及使用

文章目录karmada简介karmada概述karmada Helm部署Kubernetes karmada介绍基础准备Kubernetes集群获取chat包正式部署karmada使用karmada纳管集群查看memeber集群导出kubeconfig切换集群测试应用karmada简介 karmada概述 参考&#xff1a;附049.Kubernetes Karmada Local-up部…

必知必会:基于Transformer 的预训练语言模型如何区分文本位置(sinusoidal位置编码、原理和详细推导)

预训练位置编码 基于Transformer 的预训练语言模型如何区分文本位置? 基于 Transformer 的预训练语言模型主要通过位置编码来区分文本位置。Transformer 核心的自注意力机制本身并不考虑词的顺序&#xff0c;它对输入序列的处理是与位置无关的。在 query 和 key 的矩阵乘法之后…

redis key过期后会立马删除吗

Redis 的 Key 过期后不会立即被删除。Redis 采用了一种结合 ​惰性删除 (Lazy Expiration)​​ 和 ​定期删除 (Periodic Expiration)​​ 的策略来管理过期 Key 的回收&#xff0c;这是为了在内存管理、性能和 CPU 开销之间取得平衡。&#x1f4cc; Redis 过期 Key 删除的两种…

关于 React 19 的四种组件通信方法

注意&#xff1a;使用的是UI库是 antd-mobile1.父子级组件通信父组件单向数据流&#xff1a;数据从父组件流向子组件。支持多种数据类型&#xff1a;字符串、数字、对象、数组、函数等。只读性&#xff1a;子组件不能直接修改 props 中的数据。import { useState } from react …

OC-单例模式

文章目录单例模式定义特点使用原因缺点模式介绍懒汉模式同步锁实现dispatch_once饿汉模式实现总结懒汉模式优点缺点饿汉模式优点缺点单例模式 定义 单例模式&#xff0c;简单的说就是一个类始终只对应同一个对象&#xff0c;每次获取这个类的对象获得的都是同一个实例 如果一…

[论文阅读] 算法 | 抗量子+紧凑!SM3-OTS:基于国产哈希算法的一次签名新方案

抗量子紧凑&#xff01;SM3-OTS&#xff1a;基于国产哈希算法的一次签名新方案 论文信息信息类别具体内容论文原标题SM3-OTS: 基于国密算法SM3的紧凑型后量子一次签名方案主要作者杨亚涛、殷方锐、陈亮宇、潘登研究机构1. 北京电子科技学院 电子与通信工程系&#xff08;北京 1…

C语言-指针用法概述

目录 1.指针基础概念 2. 指针与数组 3. 指针作为函数参数 4. 动态内存分配 5. 指针的高级用法 6. 常见错误与注意事项 7. 指针数组 vs. 数组指针 8.总结与建议 本文主要作为指针用法的复习&#xff0c;会对指针的大致用法进行举例和概述。 1.指针基础概念 ​什…

Java调用Whisper和Vosk语音识别(ASR)模型,实现高效实时语音识别(附源码)

简介 语音识别&#xff08;Automatic Speech Recognition, ASR&#xff09;是将人类的语音信号自动转换为对应文字的技术&#xff0c;它使计算机能够“听懂”人说的话&#xff0c;是人机语音交互的核心技术&#xff0c;广泛应用于智能助手、语音输入、客服系统等场景。 现在我…