目录
  • 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 点进去 

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

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

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

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

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

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

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

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

    否则就是新增

    这就是saveOrUpdate的底层原理

     敲黑板  我出现的问题

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

    这个方法的selectById()

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

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

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

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

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

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

    最后

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

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。