• 使用mybatis-plus的saveOrUpdate的问题


    项目场景:

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


    问题描述

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

    service.savaOrUpdate(User user);

    这里的User是实体类

    含有属性   id 主键、name 姓名


    原因分析:

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

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

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


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

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

    核心代码是最后的一句

    !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的中方法名一样,防止出现这种错误

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


     

     

  • 相关阅读:
    Redis典型应用之分布式锁
    iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone
    MQ回退消息 springboot
    神经网络控制与matlab仿真,matlab神经网络拟合预测
    2023年中国恒温蜡疗仪发展趋势分析:应用前景存有很大发展与探索空间[图]
    梦开始的地方 —— C语言: 函数指针+函数指针数组+指向函数指针数组的指针
    澳洲猫罐头到底怎么样呢?我自己亲自喂养过的优质猫罐头分享
    毕业设计 机器学习数学原理
    BOM系列之localStorage
    AUTOSAR汽车电子嵌入式编程精讲300篇-汽车LIN总线网络通信的研究及上位机设计
  • 原文地址:https://blog.csdn.net/weixin_52574640/article/details/126877308