概念

什么是逻辑删除

逻辑删除:假删除。将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。

数据库实现思路:插入数据时,标记为未删除状态;查询、修改时,只获取未删除状态的数据进行操作;删除时则更新删除状态为已删除,则可实现逻辑上删除,物理上任存在数据功能。

参考阿里巴巴开发规范表达逻辑删除的字段名为 is_deleted,1 表示删除,0 表示未删除。

测试案例

  1. 在表中添加is_deleted字段,并设置默认值为0,实体类添加逻辑删除字段并添加 @TableLogic注解;
@TableLogic
    private Integer isDeleted;
  1. 在YML中配置全局逻辑删除字段
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: is_deleted  # 全局逻辑删除的实体字段名
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  1. 测试逻辑删除查询
@Test
    public void selectTest() {
        // ID 查询
        OrderTbl orderTbl = orderTblMapper.selectById(4896);
        // 分页查询
        Page<Map<String, Object>> mapPage = orderTblMapper.selectMapsPage(new Page<>(1, 10), new LambdaQueryWrapper<>());
    }

SQL分析: 查询都自动加上了is_deleted=0

逻辑删除在Java的应用 逻辑删除字段_mysql

  1. 测试逻辑删除插入
@Test
    public void insertTest() {
        OrderTbl orderTbl = new OrderTbl().setMoney(100).setUserId("123").setCommodityCode("PHONE");
        orderTblMapper.insert(orderTbl);
    }

SQL分析:插入时没有插入逻辑删除字段,但是我们数据库配置了自动生成状态0

逻辑删除在Java的应用 逻辑删除字段_mysql_02

  1. 测试逻辑删除更新
@Test
    public void updateTest() {
        // 查询一条记录
        OrderTbl orderTbl1 = orderTblMapper.selectById(4896);
        orderTbl1.setMoney(100);
        // 更新
        orderTblMapper.updateById(orderTbl1);
    }

SQL分析:更新时,会添加is_deleted=0条件

逻辑删除在Java的应用 逻辑删除字段_逻辑删除在Java的应用_03

  1. 测试逻辑删除删除
@Test
    public void deleteTest() {
        // 删除
        orderTblMapper.deleteById(4896);
    }

SQL分析:转变为更新,添加SET is_deleted=1,修改删除状态为1

逻辑删除在Java的应用 逻辑删除字段_数据库_04

  1. 测试逻辑删除XML-SQL

SQL分析:当我们在XML自定义语句时,无法自动添加逻辑删除,需要自己添加条件

逻辑删除在Java的应用 逻辑删除字段_数据库_05

注意事项

  1. 只对自动注入的sql起效,XML文件中的SQL无效。
  2. 逻辑删除字段支持所有数据类型(推荐使用 Integer,Boolean,LocalDateTime)
  3. 逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
  4. 如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。