学习要求

良好的java基础, 熟悉SpringBoot框架,熟悉Mybatis框架  

教学目标

 了解并掌握MyBatis-Plus 逻辑删除

概念

实际开发中,数据删除一般有2种选择:

1:物理删除

物理删除,也称为硬删除,指的是数据直接从数据库中移除,对应的SQL语句:DELETE FROM 表 where 条件,这种删除成功后,数据就无法再恢复啦。

2:逻辑删除

逻辑删除,也称为软删除,数据并没有真正删除,而是通过设置数据状态是否可显示,后续查询进行状态过滤,从而隐藏数据显示以达到删除对应的效果。比如:设置is_delete 数据状态, 0表示正常, 1表示删除。 后续的查询sql 加上 where is_delete = 0 就可以过滤删除的数据。

一般开发选用的是逻辑删除,原因有2方面,一是项目数据非常重要不能随意删除,一是项目运行产生数据一般不会是独立,它可能会通过外键形式与其他数据产生关联,如果贸然删除该数据会引起系统不稳定,甚至异常。

举个例子:比如一个用户注册之后,进行发帖,留言,点评,收藏点赞等一些操作,会在系统相关表留下该用户相关信息,如果用户销户,使用物理删除方式删除该用户数据,那么之前与用户产生关联数据表都出现脏数据啦,这很可能导致系统bug。

局部逻辑删除

MyBatis-Plus支持逻辑删除,分别是:局部逻辑删除,全局逻辑删除

具体实现步骤如下:

步骤1:在employee表添加一个del列,类型是int

步骤2:修改Employee实体类

public class Employee {
    //省略其他字段
    
    @TableLogic(value = "1", delval = "0")
    private int del;
}

@TableLogic

作用:逻辑删除注解,一般开发不建议硬删除数据(从数据库删除),建议使用软删除(数据不删除仅仅改数据状态,列表时做数据过滤)

核心属性:value, delval

value:表示未删除的数据状态

delval:表示删除之后的数据状态

步骤3:测试

@Test
public void testDelete(){
    employeeMapper.deleteById(1L);
}

原先删除语法被转行成更新语法:

UPDATE employee SET del=0 WHERE id=? AND del=1

普通列表查询

@Test
public void testselectById(){
    Employee employee = employeeMapper.selectById(1L);
}

执行SQL

SELECT id,name,password,email,age,admin,dept_id FROM employee WHERE id=? and del = 1

上面操作属于局部逻辑删除,针对是Employee对象,如果其他表也需要逻辑删除怎办?可以全局逻辑删除

全局逻辑删除

步骤1:在employee表添加一个del列,类型是int

步骤2:修改Employee实体类

public class Employee {
    //省略其他字段
    
    //@TableLogic(value = "1", delval = "0")
    //此处不需要配置注解,在全局配置文件直接指定
    private int del;
}

步骤3:配置主配置文件:application.yml

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: del # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

如果是application.properties文件

# 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
mybatis-plus.global-config.db-config.logic-delete-field=del
# 逻辑已删除值(默认为 1)
mybatis-plus.global-config.db-config.logic-delete-value=1
# 逻辑未删除值(默认为 0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0

步骤4:测试

跟之前操作一样。

全局逻辑删除需要注意,必须在所有表上统一加上del字段,要不无法实现。