【Mybatis-Plus进阶学习(二)】逻辑删除

想象一个例子,你的淘宝订单被你删除了,但是你所购买的是一个假货,无奈你找到客服,客服帮你恢复了。明明被删除的数据,为什么还有呢?原来,在企业中所有信息都被存在数据库中,而用户所谓的删除都不是真正的删除,在数据库中数据一般有个字段作为删除标识符,例如delete,一般当delete为1时表示删除,为0时表示未删除。

如果我们手动实现这个功能,就是使用update来更新删除标识符。这样做很繁琐,也不符合我们的思维,代码中大量的Update方法,实际的意义确实删除。所以强大的MP为我们解决了这个问题。

逻辑删除的简单使用

第一步:全局配置

mybatis-plus.global-config.db-config.logic-not-delete-value=0//未删除为0
mybatis-plus.global-config.db-config.logic-delete-value=1//删除为1

在配置文件中配置logic-not-delete-value和logic-delete-value的值,上面给出的例子同时也是MP的默认配置,如果你想要配置和默认配置一样的值,就不需要配置了。

第二步:注册组件

    //逻辑删除 3.1.2版本以后的MP不需要
    @Bean
    public ISqlInjector iSqlInjector(){
        return new LogicSqlInjector();
    }

第三步:标记字段

    @TableLogic
    private Integer deleted;

使用 @TableLogic注解来标记删除字段,这个字段对应的数据库的值就是我们之前全局配置的删除值,同时还可以使用 @TableLogic(delval = "1",value = "0")来配置局部变量,但是不推荐这样做,因为局部变量很难被注意到。如果不同的对象有不同的局部变量的话,很容易造成混乱。

第四步:测试

        userMapper.deleteById(1094592041087729666L);
        List<User> list = userMapper.selectList(null);

可以看出,当我们删除一个数据的时候,MP帮我们更改了他的删除字段的属性。同时强大的MP还会在其他操作,例如查询时,添加上删除字段的判断条件。如上图所示,被删除的字段没有被显示出来。

查询中排除删除字段

上个例子中我们查询出的结果中都包含删除字段,这是没有必要的,如需排除,如下使用 @TableField(select = false)注解,即可。

    @TableLogic(delval = "1",value = "0")
    @TableField(select = false)
    private Integer deleted;

自定义语句不会携带删除字段的判断

当我们使用自定义语句的时候,不会自动添加删除字段的判断,如下:

userMapper.mySelectList(Wrappers.<User>lambdaQuery().gt(User::getAge, 25));

@Select("select * from user ${ew.customSqlSegment}")
List<User> mySelectList(@Param(Constants.WRAPPER) Wrapper<User> wrapper);

有两种解决办法,如下:

  1. 在wrapper中加上删除字段的限定条件
  2. 把删除字段的限定条件写在sql中
posted @ 2021-01-06 10:18  朱李洛克  阅读(577)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css