当前位置: 首页 > 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_user
		SET 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 UPDATE
     password=values(password)
</update>

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

注意事项

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

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


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

相关文章:

  • JS设计模式之单例原型
  • 【深度学习模型分类】
  • 深入解析系统调用接口(System Call Interface, SCI)
  • 使用C#元组实现列表分组汇总拼接字段
  • Android中解决Button组件英文全部自动大写的问题
  • Oracle临时表空间(基础操作)
  • 科技之光闪耀江城:2025武汉国际半导体产业与电子技术博览会5月15日盛大开幕
  • 基于阿里云可观测产品构建企业级告警体系的通用路径与最佳实践
  • 掌握 PHP 单例模式:构建更高效的应用
  • c语言样式主题 清爽风格 代码色彩 keil风格 适合单片机开发GD32 STM32等 cursor或者vscode 的settings.json文件
  • 51c自动驾驶~合集49
  • IoTDB 断电后无法启动 DataNode,日志提示 Meet error while starting up
  • Linux centos8部署maven3.9.9
  • 「软件设计模式」建造者模式
  • 数据结构——链表
  • HTML 简介
  • AspectJ 下 Advisor 的排序过程
  • 力扣 15.三数之和
  • 日语发音的节拍
  • org.springframework.boot.autoconfigure.AutoConfiguration.imports为什么使用?如何使用?
  • 官方通报汕头违建豪宅“英之园”将强拆:对有关人员严肃追责问责
  • 昆明公布3起经济犯罪案例:一人持有820余万假美元被判刑十年
  • 独家 |《苏州河》上海上演,编剧海飞:上海的风能吹透我
  • 体坛联播|巴萨提前2轮西甲夺冠,郑钦文不敌高芙止步4强
  • 商务部:长和集团出售港口交易各方不得规避审查
  • 特朗普中东行:“能源换科技”背后的权力博弈|907编辑部