七、MybatisPlus-进阶使用-逻辑删除

231 阅读3分钟

本文是系列文章,目录:
一、MybatisPlus-基本使用
二、MybatisPlus-进阶使用-条件构造器
三、MybatisPlus-进阶使用-自定义sql
四、MybatisPlus-进阶使用-Service接口(1)-基本使用
五、MybatisPlus-进阶使用-Service接口(2)-自定义service
六、MybatisPlus-进阶使用-Service接口(3)- 批量新增
七、MybatisPlus-进阶使用-逻辑删除
八、MybatisPlus-进阶使用-枚举处理器
九、MybatisPlus-进阶使用-JSON类型处理器
十、MybatisPlus-进阶使用-配置文件加密
十一、MybatisPlus-插件功能-分页插件(1)
十二、MybatisPlus-插件功能-分页插件(2)-通用分页封装
十三、MybatisPlus-插件功能-乐观锁插件
十四、MybatisPlus-插件功能-sql性能分析
十五、MybatisPlus-自动填充字段
MybatisPlus-问题汇总

一、什么是逻辑删除

逻辑删除是一种优雅的数据管理策略,它通过在数据库中标记记录为“已删除”而非物理删除,来保留数据的历史痕迹,同时确保查询结果的整洁性。MyBatis-Plus 提供了便捷的逻辑删除支持,使得这一策略的实施变得简单高效。

二、逻辑删除的实现

全局配置逻辑删除字段

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项

测试代码

package com.pino.demo;

import com.pino.demo.service.IAddressService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * 逻辑删除
 */
@SpringBootTest
public class I_Delete_Logic {
    @Autowired
    private IAddressService addressService;

    @Test
    void testDeleteLogic() {
       addressService.removeById(70L);
    }
}

执行结果:

image.png

可以看到,发出的SQL不再是DELETE,而是UPDATE

执行查询语句:

@Test
void testDeleteLogicQuery() {
    // 执行查询语句
    addressService.list().forEach(System.out::println);
}

执行结果: image.png

可以看到,发出的SQL语句,会自动在WHERE后面拼接逻辑未删除的条件。查询出来的结果中,没有了id为70的数据。

若想要SELECT的列,不包括逻辑删除的那一列,则可以在实体类中通过@TableField进行配置

@TableField(select = false)
private Integer 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 AddressMapper extends BaseMapper<Address> {
	@Select("select * from address")
	List<Address> selectRows();
}

调用这个selectRaw,则mp的逻辑删除不会生效。