栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis 批量更新数据 mysql批量更新数据

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis 批量更新数据 mysql批量更新数据

也许你迷茫,但是我想说,在你迷茫的同时,保持本心,过好今天就好。

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

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

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

1.1 java中对应的接口
//DtsOrder 是我定义的一个普通的实体类
 void updateException(@Param("sendFaileList") List sendFaileList,@Param("now") LocalDateTime now);


    UPDATE dts_order 
    SET is_exception =2,scan_time=#{now}
    WHERe id in
    
        #{item.id}
    

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 brand
    
    
        
            
                
                    when id=#{item.id} then #{item.name}
                
            
        
        
        
            
                
                    when id=#{item.id} then #{item.address}
                
            
        
    
    where
    
        id=#{item.id}
    

对应的java接口

void updatebrandList(@Param("list") List brandList);
3 foreach成多条sql

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

  
    
        update tableName
        
            name=${item.name},
            name2=${item.name2}
        
        where id = ${item.id}
          

4 批量更新逐条更新

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/643249.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号