解决MyBatisPlus的updateBatchById()批量修改失效问题

 更新时间:2024年08月19日 14:28:52   作者:左小福  
这篇文章主要介绍了解决MyBatisPlus的updateBatchById()批量修改失效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

MyBatisPlus的updateBatchById()批量修改失效

1、问题描述

一个实现类page分页查询方法,一进入实现类page方法先获取所有的表数据,再设置符合条件的数据状态为1,使用集合收集,再使用updateBatchById()方法批量修改,接着继续分页查询,按入参条件查询相关数据返回,结果批量修改方法未生效。

2、初步判断

日志显示有:

c.c.h.b.c.m.BaseMetaObjectHandler :start update fill .... ==> Parameters: 1(String)

判断:

事务问题,使用updateBatchById()会有事务。不知道为什么事务没有提交。

3、修改尝试

使用循环update()单个数据。结果修改生效了!

MyBatisPlus使用updateBatchById小记

 
//    @Transactional(rollbackFor = Exception.class)
    public Boolean test() {
        List<StaffInfo> staffInfos = this.list();
        staffInfos = staffInfos.stream().map(staffInfo -> {
            if(staffInfo.getNumber().equals("0132791")) {  //如果number=0132791,则把元素设置成null,制造exception
                staffInfo = null;
                return staffInfo;
            }else{
                staffInfo.setEntryTime(0L);
                return staffInfo;
            }
        }).collect(Collectors.toList());
      return   this.updateBatchById(staffInfos);
//        staffInfos.forEach(staffInfo -> {
//            this.updateById(staffInfo);
//        });
//        return true;
    }

过程

staff_info表里,我通过sql把entry_time字段先设置成2,然后再通过代码设置成0,设置成2的时候一共有483条数据,然后通过代码修改的时候,

我把number=0132791的数据设置成null,即更新这一条数据肯定会报错,通过debug我知道number=2这条数据在更新的list中处于index=141的位置,

所以在number=0132791之后待更新的数据还有483-141=342条数据,如果是通过代码更新前

  • 第一种情况:不加@Transactional注解,使用updateById,一条一条数据更新

如下图:很明显,在报错位置之后的记录里都没有被更新,报错位置之前的都被更新了【报错之前已经提交了事务】 ,报错之后程序不再运行,故后边数据没更新

  • 第二种情况:加@Transactional注解,使用updateById,一条一条数据更新

都没有被更新,因为加了事务之后,是在调用事务的方法上执行完成之后,才会提交事务,最终因为报错,方法没有执行完,所以事务没有被提交

  • 第三种情况:不加@Transactional注解,使用updateBatchById,批量更新

都没有被更新,因为批量更新是开启了一个事务,然后统一提交,最后没提交成功

  • 第四种情况:加@Transactional注解,使用updateBatchById,批量更新

和情况3相同,都没有被更新,全部回滚

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于红黑树插入操作原理及java实现方法(分享)

    基于红黑树插入操作原理及java实现方法(分享)

    下面小编就为大家分享一篇基于红黑树插入操作原理及java实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 实例讲解Java设计模式编程中如何运用代理模式

    实例讲解Java设计模式编程中如何运用代理模式

    这篇文章主要介绍了Java设计模式编程中如何运用代理模式,文中举了普通代理和强制代理的例子作为代理模式的扩展内容,需要的朋友可以参考下
    2016-02-02
  • SpringBoot3和4的版本新特性及升级要点详解

    SpringBoot3和4的版本新特性及升级要点详解

    Spring Boot 4.0作为生态内的重大更新,基于Spring Framework 6.1+ 构建,带来了一系列颠覆性优化,这篇文章主要介绍了SpringBoot3和4的版本新特性及升级要点的相关资料,需要的朋友可以参考下
    2026-03-03
  • Spring Boot中的微信支付全过程(小程序)

    Spring Boot中的微信支付全过程(小程序)

    微信支付是企业级项目中经常使用到的功能,作为后端开发人员,完整地掌握该技术是十分有必要的。今天通过本文给大家介绍Spring Boot中的微信支付全过程,感兴趣的朋友一起看看吧
    2022-05-05
  • jenkins按模块进行构建遇到的问题及解决方案

    jenkins按模块进行构建遇到的问题及解决方案

    这篇文章主要介绍了jenkins按模块进行构建的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Mybatis中foreach标签带来的空格\换行\回车问题及解决方案

    Mybatis中foreach标签带来的空格\换行\回车问题及解决方案

    这篇文章主要介绍了解决Mybatis中foreach标签带来的空格,换行,回车问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 基于令牌桶的限流器注解的简单实现详解

    基于令牌桶的限流器注解的简单实现详解

    令牌桶算法是一种常用的流量控制算法,用于限制请求或事件的发生速率,这篇文章主要介绍了如何基于令牌桶实现限流器注解,需要的可以参考一下
    2023-08-08
  • SpringCloud使用Feign实现远程调用的使用示例

    SpringCloud使用Feign实现远程调用的使用示例

    Feign是一个基于注解的HTTP客户端库,它允许您将HTTP请求转换为声明式的Java接口,本文主要介绍了SpringCloud使用Feign实现远程调用的使用示例,感兴趣的可以了解一下
    2023-09-09
  • SpringBoot中的条件装配方法

    SpringBoot中的条件装配方法

    在实际的项目开发中,我们往往需要根据不同的环境做出不同的配置,例如:在开发环境下,我们会使用内存数据库以便快速启动服务并进行开发调试,在test环境、生产环境,会使用对应环境的数据库,这篇文章主要介绍了SpringBoot中的条件装配方法,需要的朋友可以参考下
    2024-08-08
  • Java @Scheduled定时器用法解析

    Java @Scheduled定时器用法解析

    这篇文章主要介绍了Java @Scheduled定时器用法解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05

最新评论