【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 @   朱李洛克  阅读(621)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
阅读排行:
· 盘点!HelloGitHub 年度热门开源项目
· DeepSeek V3 两周使用总结
· 02现代计算机视觉入门之:什么是视频
· C#使用yield关键字提升迭代性能与效率
· 回顾我的软件开发经历(1)
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css
点击右上角即可分享
微信分享提示