欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Mybatis-Plus的saveOrUpdateBatch(null)问题及解决,

来源: javaer 分享于  点击 40095 次 点评:110

Mybatis-Plus的saveOrUpdateBatch(null)问题及解决,


目录
  • Mybatis-Plus的saveOrUpdateBatch(null)问题
  • mybatis-plus的saveOrUpdate问题
    • 项目场景
    • 问题描述
    • 原因分析
  • 最后

    Mybatis-Plus的saveOrUpdateBatch(null)问题

    Mybatis-Plus的saveOrUpdateBatch对象属性为空(null)不更新的问题

    saveOrUpdateBatch对象属性为空(null)不更新的问题

    在属性上假如注解即可updateStrategy = FieldStrategy.IGNORED

    就是为null的时候也更新字段值

      @ApiModelProperty(value = "固定电话")
        @TableField(value = "FIXED_TELEPHONE",updateStrategy = FieldStrategy.IGNORED)
        private String fixedTelephone;

    mybatis-plus的saveOrUpdate问题

    项目场景

    在使用mybatis-plus的时候传入的数据id不为空的时候

    问题描述

    出现问题是一直是新增而不是修改

    service.savaOrUpdate(User user);

    这里的User是实体类

    含有属性   id 主键、name 姓名

    原因分析

    这里我先说明一下saveOrUpdate()的底层原理是:

    先进行查询 如果这个id为空 -----就新增

    如果有id的话就会通过这个id先进行查询 如果查到数据就进行修改,如果没有查到数据就进行新增

    现在让我们看一下它的源码:

     public boolean saveOrUpdate(T entity) {
            if (null == entity) {
                return false;
            } else {
                TableInfo tableInfo = TableInfoHelper.getTableInfo(this.entityClass);
                Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!", new Object[0]);
                String keyProperty = tableInfo.getKeyProperty();
                Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!", new Object[0]);
                Object idVal = tableInfo.getPropertyValue(entity, tableInfo.getKeyProperty());
                return !StringUtils.checkValNull(idVal) && !Objects.isNull(this.getById((Serializable)idVal)) ? this.updateById(entity) : this.save(entity);
            }
        }

    核心代码是最后的一句

    !StringUtils.checkValNull(idVal) && !Objects.isNull(this.getById((Serializable)idVal)) ? this.updateById(entity) : this.save(entity);
    • 首先第一个
    !StringUtils.checkValNull(idVal)

    这一句是idVal是id值

    checkValNull 点进去 

     

    这句代表的是id是否为空  如果为空的话就 最后结果就是真 (因为有!)

    • 第二个
    !Objects.isNull(this.getById((Serializable)idVal))

    this.getById((Serializable)idVal)这个方法是

    是通过id进行查询是否有id的这个数据  如果有的话就就是真 

    这样两个条件都成立 ---也就是id不为空,id这个数据存在的话 ---就进行修改

    否则就是新增

    这就是saveOrUpdate的底层原理

     敲黑板  我出现的问题

    这个方法的selectById()

    我的情况是我在mapper中自己写了一个方法名字跟这个一样。

    因为mapper是继承了BaseMapper这个类,调用的时候子类有方法就调用了子类的方法

    因此我的情况是变成了有id也变成了新增

    最后总结 !!!非常重要的是 我们自己mapper中定义的方法一定不要跟mybatisplus的中方法名一样,防止出现这种错误

    这也是我代码规范没有写好,大家写的时候一定要按照阿里的开发规约进行开发,取名要正规 

    最后

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持3672js教程。

    您可能感兴趣的文章:
    • mybatis-plus 关于savebatch,saveorupdatebatch遇到的坑及解决办法
    • Mybatis saveAndUpdate空值不更新问题及解决
    • Mybatis-Plus使用saveOrUpdate及问题解决方法
    相关栏目:

    用户点评