mybatis-plus使用updateBatchById小记


//    @Transactional(rollbackFor = Exception.class)
    public Boolean test() {
        List 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条数据,如果是通过代码更新前

mybatis-plus使用updateBatchById小记_第1张图片

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

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

 mybatis-plus使用updateBatchById小记_第2张图片

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

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

mybatis-plus使用updateBatchById小记_第3张图片

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

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

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

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

纯粹为了自己记录

你可能感兴趣的:(mybatis-plus,java,开发语言)