想象一个例子,你的淘宝订单被你删除了,但是你所购买的是一个假货,无奈你找到客服,客服帮你恢复了。明明被删除的数据,为什么还有呢?原来,在企业中所有信息都被存在数据库中,而用户所谓的删除都不是真正的删除,在数据库中数据一般有个字段作为删除标识符,例如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);
有两种解决办法,如下:
- 在wrapper中加上删除字段的限定条件
- 把删除字段的限定条件写在sql中