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

MYSQL批量UPDATE的两种方式

工作中遇到批量更新的场景其实是比较常见的。
但是该如何正确的进行批量UPDATE,很多时候往往有点头大。
这里列2种可用的方式,供选择(请选择方式一,手动狗头。)。

如果使用了MyBatis增强组件MyBatisPlus

如果使用了MyBatisPlus,可以参考官网给出的解决方式(updateBatchById),或者自己查一下。


批量UPDATE方式一:SQL内foreach

举个??

<update id="updateUserForBatch" parameterType="com.bees.srx.entity.UserEntity"><foreach collection="list" item="entity" separator=";">UPDATE sys_userSET password=#{entity.password},age=#{entity.age}<where>id = #{entity.id}</where></foreach>
</update>

这样写,肯定比 在业务方法中for循环单条update的效率是要高的。
但是如果遇到大批量的更新动作,可能也会产生效率低下的问题。
原因是SQL内的foreach本质上还是循环插入每一条数据,会产生 list.size() 个单条插入的独立SQL语句,每一条 UPDATE 语句都会被单独发送到数据库服务器执行。
这意味着如果列表中有100个元素,就会产生100次数据库往返通信。
这种方式不仅效率低下,而且对于大型批处理操作来说,可能会导致性能瓶颈和资源浪费。

优化:通过JDBC批处理
通过 MyBatisSqlSession 提供的批处理功能来手动执行批量更新。

try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {UserMapper mapper = session.getMapper(UserMapper.class);for (UserEntity user : userList) {mapper.updateUser(user);}session.commit();
}

这里mapper.updateUser就是单条的UPDATE语句。

通过这种方式,MyBatis 会在内存中积累所有的更新命令,然后在调用session.commit() 时一次性提交给数据库,这比逐条执行要高效得多。

注意:是否存在效率差异,未实践过!!!可能存在误人子弟的嫌疑。

批量UPDATE方式二:INSERT + ON DUPLICATE KEY UPDATE
 <update id="updateForBatch" parameterType="com.bees.srx.entity.UserEntity">insert into sys_user(id,username,password) values<foreach collection="list" index="index" item="item" separator=",">(#{item.id},#{item.username},#{item.password})</foreach>ON DUPLICATE KEY UPDATEpassword=values(password)
</update>

不建议使用。要求较多,而且容易出现死锁。

注意事项

  • 唯一键约束:确保 sys_user 表中的 id 字段有唯一键约束(通常是主键)。如果 id 不是唯一的,ON DUPLICATE KEY UPDATE 将不会触发更新操作。
  • 性能:这种方式在大数据量的情况下比多次单独的 INSERT 和 UPDATE 操作要高效得多。
  • 事务管理:确保这个操作在一个事务中执行,以保证数据的一致性。如果中间发生错误,可以回滚整个操作。
  • 字段顺序:确保 VALUES 函数中的字段顺序与 ON DUPLICATE KEY UPDATE 子句中的字段顺序一致。
总结:

建议使用方式一,或者其优化方式(JDBC批处理)。
各位也可以与AI对话看看给出的建议是什么。


有问题一定要留言啊各位。及时发现及时改错。

相关文章:

MYSQL批量UPDATE的两种方式

工作中遇到批量更新的场景其实是比较常见的。 但是该如何正确的进行批量UPDATE&#xff0c;很多时候往往有点头大。 这里列2种可用的方式&#xff0c;供选择(请选择方式一&#xff0c;手动狗头。)。 如果使用了MyBatis增强组件MyBatisPlus 如果使用了MyBatisPlus&#xff0c;…...

【Viper】配置格式与支持的数据源与go案例

Viper 是一个用于 Go 应用程序的配置管理库&#xff0c;支持多种配置格式和数据源。 安装依赖 go get github.com/spf13/viper go get github.com/spf13/viper/remote go get go.etcd.io/etcd/client/v3"github.com/spf13/viper/remote"要写在etcd客户端import里 1…...

C++17 中的 std::reduce:详细教程

文章目录 1. 简介2. 函数签名3. 使用场景3.1 简单的累加操作3.2 自定义归并操作3.3 并行计算的性能优势 4. 注意事项4.1 归并操作的结合律和交换律4.2 默认值的使用 5. 总结 1. 简介 std::reduce 是 C17 标准库中引入的一个算法&#xff0c;用于对范围内的元素进行归并操作。它…...

解决 paddle ocr 遇到 CXXABI_1.3.13 not found 的问题

ImportError: /lib/x86_64-linux-gnu/libstdc.so.6: version CXXABI_1.3.13 not found (required by /home/hum/anaconda3/envs/ipc/lib/python3.11/site-packages/paddle/base/libpaddle.so) 通过命令检查 strings /lib/x86_64-linux-gnu/libstdc.so.6|grep CXXABI 而实际上我…...

探索 Text-to-SQL 技术:从自然语言到数据库查询的桥梁

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

mac搭建环境

从0-1搭建mac环境 先查看自己的芯片信息 bash uname -mbash-3.2$ uname -m arm64这里是自己的型号安装brew xcode-select --install xcode-select -p /bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)” source /Users/lanren/.…...

算法学习笔记之贪心算法

导引&#xff08;硕鼠的交易&#xff09; 硕鼠准备了M磅猫粮与看守仓库的猫交易奶酪。 仓库有N个房间&#xff0c;第i个房间有 J[i] 磅奶酪并需要 F[i] 磅猫粮交换&#xff0c;硕鼠可以按比例来交换&#xff0c;不必交换所有的奶酪 计算硕鼠最多能得到多少磅奶酪。 输入M和…...

Docker 镜像标签使用

写在前面 当使用命令 docker pull mysql 拉取镜像时&#xff0c;其实等价于如下命令 docker pull mysql:latest latest 是默认的标签&#xff0c;字面上理解为最新版本的镜像&#xff0c;实质上 latest 只是镜像的标签名称&#xff0c;跟具体某个版本号地位一样&#xff0c;…...

STM32之SG90舵机控制

目录 前言&#xff1a; 一、硬件准备与接线 1.1 硬件清单 1.2 接线 二、 SG90舵机简介 1.1 外观 1.2 基本参数 1.3 引脚说明 1.4 控制原理 1.5 特点 1.6 常见问题 三、 单片机简介 四、 程序设计 4.1 定时器配置 4.2 角度控制函数 4.3 主函数调用 五、 总结 …...

VSCode Error Lens插件介绍(代码静态检查与提示工具)(vscode插件)

文章目录 VSCode Error Lens 插件介绍**功能概述****开发背景****使用方法****适用场景** VSCode Error Lens 插件介绍 功能概述 Error Lens 是一款增强 VS Code 错误提示的扩展工具&#xff0c;通过 内联显示错误和警告信息&#xff0c;直接定位代码问题&#xff0c;提升开发…...

list_for_each_entry_safe 简介

list_for_each_entry_safe 是 Linux 内核中用于遍历链表的一个宏&#xff0c;特别适用于在遍历过程中可能需要删除链表节点的场景。它的设计保证了在删除当前节点时&#xff0c;不会影响后续节点的访问&#xff0c;从而实现安全的遍历。 定义 #define list_for_each_entry_sa…...

微软AutoGen高级功能——Memory

介绍 大家好&#xff0c;博主又来给大家分享知识了。这次又要给大家分享什么呢&#xff1f;哈哈。这次要给大家分享的是微软AutoGen框架的高级且重要的功能&#xff1a;Memory。在微软AutoGen中&#xff0c;Memory(记忆)是一个重要概念&#xff0c;它主要用于存储和管理智能体…...

【鸿蒙开发】第三十六章 状态管理 - V1V2混用和迁移指导

目录​​​​​​​ 1 自定义组件混用场景指导 1.1 概述 1.2 状态管理装饰器总览 状态管理V1的装饰器 状态管理V2的装饰器 状态管理装饰器支持的数据类型总览 1.3 限制条件 1.3.1 V1和V2的装饰器不允许混用 1.V1的自定义组件中不可以使用V2的装饰器 2.V2的自定义组件…...

轮子项目--消息队列的实现(3)

上一篇文章中我把一些关键的类以及表示出来&#xff0c;如何对这些类对应的对象进行管理呢&#xff1f;管理分为硬盘和内存上&#xff0c;硬盘又分为数据库&#xff08;管理交换机&#xff0c;队列和绑定&#xff09;和文件&#xff08;管理消息&#xff09;&#xff0c;本文就…...

一文深入了解DeepSeek-R1:模型架构

本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型&#xff0c;以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 &#x1f4dd; 1. 输入上下文长度 DeepSeek-R1的输入上下文长…...

秘密信息嵌入到RGB通道的方式:分段嵌or完整嵌入各通道

目录 1. 将秘密信息分为三部分的理由 &#xff08;1&#xff09;均匀分布负载 &#xff08;2&#xff09;提高鲁棒性 &#xff08;3&#xff09;容量分配 2. 不将秘密信息分为三部分的情况 &#xff08;1&#xff09;嵌入容量 &#xff08;2&#xff09;视觉质量 &#…...

Ai人工智能的未来:趋势、挑战与机遇

Ai人工智能的未来&#xff1a;趋势、挑战与机遇 引言 人工智能&#xff08;AI&#xff09;已经成为当代科技发展的核心驱动力&#xff0c;其影响力渗透到各个行业&#xff0c;并塑造了我们未来的社会结构。无论是在医疗、金融、制造业&#xff0c;还是在自动驾驶、智能客服、…...

理解WebGPU 中的 GPUDevice :与 GPU 交互的核心接口

在 WebGPU 开发中&#xff0c; GPUDevice 是一个至关重要的对象&#xff0c;它是与 GPU 进行交互的核心接口。通过 GPUDevice &#xff0c;开发者可以创建和管理 GPU 资源&#xff08;如缓冲区、纹理、管线等&#xff09;&#xff0c;并提交命令缓冲区以执行渲染和计算任…...

Java 设计模式之桥接模式

文章目录 Java 设计模式之桥接模式概述UML代码实现 Java 设计模式之桥接模式 概述 桥接模式(Bridge)&#xff1a;将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。通过桥接模式&#xff0c;可以避免类爆炸问题&#xff0c;并提高系统的可扩展性。 UML 核心…...

机器学习(李宏毅)——GAN

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记&#xff0c;感谢台湾大学李宏毅教授的课程&#xff0c;respect&#xff01;&#xff01;&#xff01; 不得不说GAN真是博大精深&#xff01; 二、大纲 GAN问世基本思想原理剖析Tips of GANGAN的应用Cycle GANEva…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...