百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Mybatis 批量更新数据 Mysql批量更新数据

ztj100 2025-07-21 19:10 4 浏览 0 评论

通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新。(2)一次性更新所有数据

1 批量更新相同的值 不同的条件

如这里根据订单ID来更新订单表中的两个值

1.1 java中对应的接口

//DtsOrder 是我定义的一个普通的实体类
 void updateException(@Param("sendFaileList") List<DtsOrder> sendFaileList,@Param("now") LocalDateTime now);
<!--批量更新-->
<update id="updateException" parameterType="List">
    UPDATE dts_order 
    SET is_exception =2,scan_time=#{now}
    WHERE id in
    <foreach collection="sendFaileList" item="item" index="index"
             open="(" close=")" separator=",">
        #{item.id}
    </foreach>
</update>

2 批量更新不同的值 不同的条件

MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。

 UPDATE brand
    SET name = CASE id 
        WHEN 1 THEN 'name1'
        WHEN 2 THEN 'name2'
        WHEN 3 THEN 'name3'
    END, 
    address = CASE id 
        WHEN 1 THEN '地址1'
        WHEN 2 THEN '地址2'
        WHEN 3 THEN '地址3'
    END
WHERE id IN (1,2,3)

这条sql的意思是,如果id为1,则name的值为name1,address 的值为地址1;依此类推。

<update id="updatebrandList" parameterType="list">
    update brand
    <trim prefix="set" suffixOverrides=",">
    
        <trim prefix="name=case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.name!=null">
                    when id=#{item.id} then #{item.name}
                </if>
            </foreach>
        </trim>
        
        <trim prefix="address =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.title!=null">
                    when id=#{item.id} then #{item.address}
                </if>
            </foreach>
        </trim>
    </trim>
    where
    <foreach collection="list" separator="or" item="item" index="index">
        id=#{item.id}
    </foreach>
</update>

对应的java接口

/**
 * 批量更新销量 DtsBrand 是普通的实体类
 * @param brandList
 */
void updatebrandList(@Param("list") List<DtsBrand> brandList);

3 foreach成多条sql

这种方式最简单,就是用foreach组装成多条update语句,但Mybatis映射文件中的sql语句默认是不支持以" ; " 结尾的,也就是不支持多条sql语句的执行。所以需要在连接mysql的url上加 &allowMultiQueries=true 这个才可以执行。

<update id="updatebrandList"  parameterType="java.util.List">  
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
        update tableName
        <set>
            name=${item.name},
            name2=${item.name2}
        </set>
        where id = ${item.id}
    </foreach>      
</update>

4 批量更新逐条更新

逐条更新这种方式显然是最简单,也最不容易出错的,即便出错也只是影响到当条出错的数据,而且可以对每条数据都比较可控,更新失败或成功,从什么内容更新到什么内容,都可以在逻辑代码中获取,

这种方式最大的问题就是效率问题,逐条更新,每次都会连接数据库,然后更新,再释放连接资源(虽然通过连接池可以将频繁连接数据的效率大大提高,抗不住数据量大),这中损耗在数据量较大的时候便会体现出效率问题

相关推荐

新手学Docker:挂载卷Volumes(docker挂载nfs卷)

默认情况下,在容器内创建的文件,都会保存在容器基于镜像之上的一个可读写层。但是,这一层是依赖于容器而存在的,当容器不存在时,这些数据也就不存在了。而且这些数据紧紧的耦合在容器内部,很难将这些数据导出。...

Docker命令最全详解(39个最常用命令)

Docker是云原生的核心,也是大厂的必备技能,下面我就全面来详解Docker核心命令@mikechen本文作者:陈睿|mikechen文章来源:mikechen.cc一、Docker基本命令...

松勤软件测试:详解Docker,如何用portainer管理Docker容器

镜像管理搜索镜像dockersearch镜像名称拉取镜像dockerpullname[:tag]列出镜像dockerimages删除镜像dockerrmiimage名称或id删除...

【Docker 新手入门指南】第十四章:Docker常用命令

以下Docker常用命令大全,涵盖容器、镜像、网络、数据卷及系统管理等核心操作,结合分类与示例助你快速掌握:一、容器生命周期管理...

Docker 一键清盘术,释放磁盘空间不求人

在日常开发和运维中,Docker容器化让我们的工作更高效,但不知不觉中,磁盘空间却被镜像、容器和卷悄悄吃掉。今天教你一套干净利落的Docker磁盘清理攻略,让你轻松腾出宝贵空间!一、快速查看磁盘...

第六节 Docker 容器核心操作与实践指南

一、镜像与容器的本质关系(一)镜像(Image)的核心特性静态模板:包含应用运行所需的所有依赖(系统库、运行时、配置文件等)不可变性:镜像构建完成后内容不可修改,确保环境一致性...

别再去找Docker命令了,你要的常用的全都在这

Docker常用命令集合给大家介绍一些常用的Docker命令,对你有帮助的同学建议收藏作为一个查询手册哦。Docker容器的一些命令按功能分类大致如下:Docker环境信息info、versio...

Docker 数据持久化最佳实践:Volume 使用全指南

你是不是也经常在使用Docker的时候,遇到“数据持久化”相关的困惑?容器删了,数据也跟着没了?今天就带你深入了解Docker的Volume机制,搞懂什么是Volume、怎么使用、存储在...

【Docker 新手入门指南】第十五章:常见故障排除

一、前期准备:收集关键信息在排查问题前,建议先获取以下系统数据,便于精准定位故障:...

Docker网络与iptables实战指南:从原理到安全加固

一、Docker网络核心原理:容器与iptables的“共生关系”Docker容器的网络能力依赖于Linux内核的两大核心技术:虚拟网络设备(vethpair、网桥)和iptables规则链。以默认...

别再docker exec了!盘点进入容器排错的5种“更优雅”姿势

一、dockerattach:直接“附身”容器的原始方法当容器日志疯狂刷屏时,dockerattach就像直接跳进正在行驶的汽车——能看到仪表盘数据,但方向盘不在你手上。这种直接附加到容器主进程的...

云计算核心技术Docker教程:Docker数据卷的使用

在生产环境中使用Docker,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束)或者需要在多个容器之间进行数据共享,需要将数据从宿主机挂载到容器中,这就会...

【开发技术】Mybatis中进行多表关联查询?性能是不是会变好呢?

Mybatis是一种基于Java的持久层框架,能够帮助我们操作数据库。在Mybatis中,进行多表关联的整合查询,需要使用嵌套查询或者使用ResultMap进行映射。下面,我们将从这两个方面来介绍多表...

Mybatis 批量更新数据 Mysql批量更新数据

通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新。(2)一次性更新所有数据1批量更新相同的值不同的条件...

Mybatis 如何批量删除数据(mybatis批量merge)

Mybatis如何批量删除数据本期以最常用的根据id批量删除数据为例:接口设计1:List类型单参数IntegerdeleteByIds(List<Integer>ids);...

取消回复欢迎 发表评论: