MyBatis批量更新

Mybatis批量操作解析 Mybatis批量更新多条记录为多个字段为不同的值 需求:传入List集合对象,实现。 阅读详情

批量更新时一条记录update一次,性能比较差,容易造成阻塞。

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

UPDATE course
    SET name = CASE id 
        WHEN 1 THEN 'name1'
        WHEN 2 THEN 'name2'
        WHEN 3 THEN 'name3'
    END, 
    title = CASE id 
        WHEN 1 THEN 'New Title 1'
        WHEN 2 THEN 'New Title 2'
        WHEN 3 THEN 'New Title 3'
    END
WHERE id IN (1,2,3)

这条sql的意思是,如果id为1,则name的值为name1,title的值为New Title1;依此类推。


在Mybatis中的配置则如下:

<update id="updateBatch" parameterType="list">
            update course
            <trim prefix="set" suffixOverrides=",">
             <trim prefix="peopleId =case" suffix="end,">
                 <foreach collection="list" item="i" index="index">
                         <if test="i.peopleId!=null">
                          when id=#{i.id} then #{i.peopleId}
                         </if>
                 </foreach>
              </trim>
              <trim prefix=" roadgridid =case" suffix="end,">
                 <foreach collection="list" item="i" index="index">
                         <if test="i.roadgridid!=null">
                          when id=#{i.id} then #{i.roadgridid}
                         </if>
                 </foreach>
              </trim>
             
              <trim prefix="type =case" suffix="end," >
                 <foreach collection="list" item="i" index="index">
                         <if test="i.type!=null">
                          when id=#{i.id} then #{i.type}
                         </if>
                 </foreach>
              </trim>
       <trim prefix="unitsid =case" suffix="end," >
                  <foreach collection="list" item="i" index="index">
                          <if test="i.unitsid!=null">
                           when id=#{i.id} then #{i.unitsid}
                          </if>
                  </foreach>
           </trim>
             </trim>
            where
            <foreach collection="list" separator="or" item="i" index="index" >
              id=#{i.id}
          </foreach>
</update>

mybatis批量更新不同值的字段         &lt;mapper namespace=" " &gt; &lt;update id="updateByMobile" parameterType="java.util.List"&gt; update pb_vip_table set integral= &lt;foreach collection="list" item= 阅读详情

相关推荐

STM32 SAI接口实战:用CubeMX快速配置多通道音频采集(附DMA优化技巧)

本文详细介绍了如何使用STM32的SAI接口通过CubeMX快速配置多通道音频采集系统,并提供了DMA双缓冲优化技巧。内容涵盖TDM模式配置、时钟同步、DMA优化及常见问题排查,帮助开发者高效实现高速数据采集应用。

weixin_42549037的博客 190

Mybatis拦截器记录数据更新历史记录到MongoDB

Mybatis拦截器记录数据更新历史记录到MongoDB的源码,另外需要配置拦截器到mybatis配置文件中。

CentOS8静默安装Oracle11.2.0.1

背景 新安装oracle,用静默安装方式就不需要安装图形界面了,省时省力。 前期准备工作与图形化安装一样,如创建用户|用户组、环境变量、内核参数、创建目录等. 可参考图形化安装,链接:https://blog.csdn.net/heroicpoem/article/details/104229369 环境 平台 版本 操作系统 centOS 8 Oracle 11gR2 1.响应文件 响应文件的内容就是图形化安装时手工设置的选项内容。 解压后,database/response/db

heroicpoem的专栏 4494

Spring aop mybatis 审计日志数据操作前操作后对比记录

Spring aop mybatis 审计日志数据操作前操作后对比记录-封装好的源码下载地址拖到文章最底部点击跳转下载无需积分

MR_wb的博客 4718

Spring AOP实现记录mybatis-plus操作数据变化01

spring aop实现记录mybatis-plus mapper接口,在执行删除及修改数据时操作日志,自动比对历史数据.

Myron_007的博客 6646

Mybatis中进行批量更新

Mybatis中进行批量更新 Mybatis中进行批量更新 Sql 批量更新 一条sql语句来批量更新所有数据,下面直接看一下在mybatis中通常是怎么写的(去掉mybatis语法就是原生的sql语句了)。 <update id="updateBatch" parameterType="java.util.List"> update table_name set ...

superbeyone 2万+

mybatis批量更新

一.更新多条数据,每条数据都不一样 背景描述:通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新。(2)一次性更新所有数据(更准确的说是一条sql语句来更新所有数据,逐条更新的操作放到数据库端,在业务代码端展现的就是一次性更新所有数据)。两种方式各有利弊,下面将会对两种方式的利弊做简要分析,主要介绍第二种方式在mybatis中的实现。 1.逐条更新(java实现) 这种方式显然是最简单,也最不容易出错的,即便出错也只是影响到当条出错的数据,而且可以对每条数据都比较可控,更新失败

清水的专栏 1万+

Mybatis批量更新数据(批量update)

当我们使用mybatis的时候,可能经常会碰到一批数据的批量更新问题,因为如果一条数据一更新,那每一条数据就需要涉及到一次数据库的操作,包括网络IO以及磁盘IO,可想而知,这个效率是非常低下的。而平时我们很少直接使用原生jdbc直接操作数据库,而是会使用比较成熟的ORM框架,那么今天我们就来总结一下,如何使用mybatis批量更新

carbuser_xl的博客 9万+

mybatis批量更新

sql语句for循环效率其实相当高的,因为它仅仅有一个循环体,只不过最后update语句比较多,量大了就有可能造成sql阻塞。case when虽然最后只会有一条更新语句,但是xml中的循环体有点多,每一个case when 都要循环一遍list集合,所以大批量拼sql的时候会比较慢,所以效率问题严重。使用的时候建议分批插入。

qq_32389095的博客 2969

mybatis更新时记录变更的字段日志&&java反射获取字段值转成string

mybatis更新时记录变更的字段日志&&java反射获取字段值转成string

饥饿中s的博客 1286

基于Mybatis拦截器开发自定义拦截器,实现记录数据表最后更新时间

可以通过设置information_schema_stats_expiry=0来解决。1.实现Mybatis拦截器Interceptor,重写intercept方法。记录有过增删改操作的数据表及最后更新时间,实现数据增量同步。2.使用druid解析sql,获取sql中涉及的表。MySql系统表可查询数据表的最后更新时间。基于Mybatis拦截器开发自定义拦截器。但InnoDB引擎下更新记录会有延迟。同理,也可实现日志收集等功能。

secretdaixin的博客 1933

Mybatis拦截器记录数据变更信息

Slf4j})@Override// 获取MappedStatement//获取类型// 获取SQL语句的ID,哪个方法执行// // 获取SQL语句try {if(param!// 变更信息入表@Override// 使用 Plugin.wrap 方法生成代理对象@Override// 获取配置文件中的属性值拦截器加入Mybatis configurationSpringboot-Mybatis-start可以直接使用@Component加入。

cyh0107的博客 1288

SpringCloud或SpringBoot+Mybatis-Plus利用mybatis插件实现数据操作记录及更新对比

引文   本文主要介绍如何使用mybatis插件实现拦截数据库操作并根据不同需求进行数据对比分析,主要适用于系统中需要对数据操作进行记录、在更新数据时准确记录更新字段 核心:mybatis插件(拦截器)、mybatis-Plus实体规范、数据对比 1、相关技术简介 mybatis插件:   mybatis插件实际上就是官方针对4层数据操作处理预留的拦截器,使用者可以根据不同的需求进行操作拦截并处理。这边笔者不做详细描述,详细介绍请到官网了解,这里笔者就复用官网介绍。 插件(plugins).

yong472727322的博客 3979

关于Mybatis根据ID批量更新,接的参数值为null问题

问题描述:在业务中有一个根据ID,批量更新状态的操作。发现后台sql语句执行的时候id为null xml 这样运行提示idlist 参数找不到,修改成 这样是可以运行,但是就出现了标题的问题,arg1可以正常接收参数,但是id都是null3、解决方法将list,status都放在一个map里,dao方法参数就一个map.最后代码:...

LLLLLer的博客 964

MySQL批量update数据(更新的数据值不同)

(一)纯mysql: ​UPDATE my_table SET status = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END, title = CASE id WHEN 1 THEN 'New Title 1' WHEN 2 T...

斜阳雨陌 4338

mybatis 记录sql执行前后的数据变化

此方法并不完善,只是简单记录。 以update语句为例。通过mybatis的拦截器拦截sql,然后提取出表名和条件,查询出来原始数据,然后保存数据和update语句。这样就可以对比原始数据,和执行sql的改变的数据。 delete和insert 只记录sql,直接插入记录中。 注意:如果记录要插入数据库,那么记录表要记的忽略。不然会一直调用 import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSON; im

迷宫的博客 4277

mybatis 批量更新update详解

-1的数据才能进行status更新.其他的将使用默认值更新,而不会保持原数据不变.如果要保持原数据不变呢?即满足条件的更新,不满足条件的保持原数据不变,简单的来做就是再加一个,因为mybatis中没有if…这条sql的意思是,如果id为1,则name的值为name1,title的值为New Title1;MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。经测试 100条数据的时候第一种方式的效率比第二种差不多高1倍。3 更新多条记录为多个字段为不同的值。...

weixin_44227650的博客 2万+

mybatis 批量更新update详解文档

Mybatis批量更新Update详解文档

qq_40093255的博客 7400

MyBatis根据ID数组批量更新

一开始想到的方法 通过每一个id查出每一个实体,然后改变每一个实体里的值,再每一个调用更新方法更新。 这样会很慢很慢,一次删除操作可能要访问几百次数据库。 public int deleteCourseClassificationByIds(Long[] ids) { //获取删除人userId long userId = SecurityUtils.getUserId(); //用课程分类id查出课程分类实体 for (Long id : i

weixin_45563088的博客 2849

欧姆龙cx-one

cx-one 文件太大,txt里面是我的网盘地址,要的自己下去吧

上一篇: Lucene学习笔记(1)-索引创建和简单的查询
下一篇: Lucene学习笔记(2)自定义TokenFilter实现同义词
简单的小白
博客等级 码龄12年 1粉丝 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值