学习要求
良好的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字段,要不无法实现。