mybatisplus的逻辑删除问题
作者:LC超人在良家
mybatisplus的逻辑删除
mp提供的逻辑删除实现起来非常简单
只需要在application.yml中进行逻辑删除的相关配置即可
mybatis-plus: global-config: db-config: logic-delete-field: deleted # 全局逻辑删除的实体字段名 logic-delete-value: 1 # 逻辑已删除值(默认为1) logic-not-delete-value: 0 # 逻辑未删除值(默认为0) # 若逻辑已删除和未删除的值和默认值一样,则可以不配置这2项
测试代码
int i = mapper.deleteById(6); System.out.println("rowAffected = " + i);
可以看到,发出的SQL不再是DELETE,而是UPDATE
此时我们再执行一次SELECT
@Test public void testSelect() { List<User2> users = mapper.selectList(null); }
可以看到,发出的SQL语句,会自动在WHERE后面拼接逻辑未删除的条件。
查询出来的结果中,没有了id为6的王软蛋。
若想要SELECT的列,不包括逻辑删除的那一列,则可以在实体类中通过@TableField进行配置
@TableField(select = false) private Integer deleted;
可以看到下图的执行结果中,SELECT中已经不包含deleted这一列了
前面在application.yml中做的配置,是全局的。通常来说,对于多个表,我们也会统一逻辑删除字段的名称,统一逻辑已删除和未删除的值,所以全局配置即可。
当然,若要对某些表进行单独配置,在实体类的对应字段上使用@TableLogic即可。
@TableLogic(value = "0", delval = "1") private Integer deleted;
【小结】
开启mp的逻辑删除后,会对SQL产生如下的影响
INSERT
语句:没有影响SELECT
语句:追加WHERE条件,过滤掉已删除的数据UPDATE
语句:追加WHERE条件,防止更新到已删除的数据DELETE
语句:转变为UPDATE语句
注意,上述的影响,只针对mp自动注入的SQL生效。如果是自己手动添加的自定义SQL,则不会生效。
比如:
public interface User2Mapper extends BaseMapper<User2> { @Select("select * from user2") List<User2> selectRaw(); }
调用这个selectRaw,则mp的逻辑删除不会生效。
另,逻辑删除可在application.yml中进行全局配置,也可在实体类中用@TableLogic进行局部配置。
使用mybatisplus逻辑删除,修改含有逻辑删除的字段爆错
mybatisplus在配置文件中配置如下
以上是全局逻辑删除配置。
当使用mybatisplus生成的修改方法,修改含有showStatus对应的字段时,会报错。
错误sql语句如下
而我要修改的如下:
正确的修改的sql语句应该如下:
所以我们可以在xml文件中单独写sql语句
或者不在配置文件中设置逻辑删除字段名 使用@TableLogic注解
如下:
showStatus是表示此信息是否显示。
如:
表示 show_status等于0时 brand_id (即id)=1591652104429125634 的信息不显示。
这样我们就是局部使用逻辑删除。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。