Mybaits-plus采坑之IService接口remove 方法一直返回true

  1. 版本
    springboot 2.0.3 + mybatis-plus 3.1.0

  2. 起因
    在使用MP时,我自己的Service 接口可以实现MP的IService接口,这样外部就可以直接使用Service接口调用MP通用的CRUD方法,MP IService接口save update remove (新增 ,修改,删除)方法返回类型是boolean,正常逻辑来说就是上述几类操作当数据库影响行数大于0时才能返回true否则就是false,然而实际情况确认不是我们理想中的那样,查看IService 接口实现类com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
    save方法实现
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200110094420837.pngMybaits-plus采坑之IService接口remove 方法一直返回true_第1张图片
    update方法实现
    Mybaits-plus采坑之IService接口remove 方法一直返回true_第2张图片
    remove方法实现
    Mybaits-plus采坑之IService接口remove 方法一直返回true_第3张图片
    上述区别,save和update 都是通过retBool方法判断数据库受影响行数来决定是返回true或false
    在这里插入图片描述
    查看SqlHelper,判断返回true或false的逻辑和我们预期一致
    com.baomidou.mybatisplus.extension.toolkit.SqlHelper
    在这里插入图片描述
    再来查看delBool方法,如下和我们预期不一致,此处要注意的就是只要程序运行没有报错remove方法就会一直返回true,可能就会导致我们的业务逻辑出问题
    Mybaits-plus采坑之IService接口remove 方法一直返回true_第4张图片

  3. 总结
    上述remove方法一直返回true的问题,在最新版本3.3.0已经修复,SqlHelper中已经移除delBool方法,save update remove全部都使用retBool方法判断逻辑。
    大家在使用MP 的IService接口时,如果不熟悉或不太确定接口底层的实现逻辑是否与自己的预期一致,建议是先看一下源码使用单元测试验证一下逻辑是否正常,此问题就是本人在单元测试removeById方法时,故意使用一个表中不存在的id测试,才发现此问题。

你可能感兴趣的:(mybatis-plus)