🍀 前言
博客地址:
- CSDN:https://blog.csdn.net/powerbiubiu
👋 简介
本章节介绍下Mybatis-Plus框架的逻辑删除功能。
📖 正文
1 逻辑删除介绍
1.1 什么是逻辑删除?
首先我们先来了解下与逻辑删除对应的物理删除。
- 物理删除:当我们需要将某条数据进行进行删除时,都会执行
delete
语句,在删除成功后,数据会从我们磁盘上删除,这种就是物理删除 - 逻辑删除:逻辑删除其实不是真正意义上的删除,而是只执行了一次更新操作。
我们实现逻辑删除时,通常的做法是在数据库表中添加一个字段is_deleted
,来标识该条数据的状态,当值为0
时,表示未删除,值为1
时,表示删除。这样在执行查询语句的时候,就会自动带上where is_deleted = 0
条件来过滤掉逻辑删除了的数据。
1.2 为什么要逻辑删除?
逻辑删除的优点:
- 避免数据永久丢失,方便数据恢复和审计
- 数据的挖掘价值,针对电商的订单,用户删除但后台不会删除,这样就能通过用户订单来对用户进行分析,推荐商品
逻辑删除的缺点:
- 在查询时,效率方面会降低,因为使用逻辑删除,查询时会增加条件
where is_deleted = 0
Tips:
在实际应用中,根据数据的价值,来决定是否使用逻辑删除,如果数据没有什么价值,可以进行物理删除,不仅节省磁盘空间,还能增加一定的效率。
2 逻辑删除实现
2.1 配置文件
首先在配置文件application.yml
中添加Mybatis-plus配置
mybatis-plus:
# 当mapper接口和mapper接口对应的配置文件在不在同目录下,需要进行绑定
mapper-locations: classpath*:/mapper/**/*.xml
global-config:
db-config:
# 逻辑删除配置
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
2.2 实体类
修改实体类,在实体类中逻辑删除字段添加@TableLogic
注解,让该自动拥有逻辑删除功能
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@TableName("tb_role")
@ApiModel(value = "Role对象", description = "角色表")
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("角色id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("角色名称")
private String roleName;
@ApiModelProperty("角色编码")
private String roleCode;
@ApiModelProperty("描述")
private String description;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("更新时间")
private LocalDateTime updateTime;
@ApiModelProperty("删除标记(0:可用 1:已删除)")
@TableLogic
private Integer isDeleted;
}
2.3 测试逻辑删除
通过删除数据库中id为4的角色,测试一下执行结果
@Test
public void deleteByLogic() {
int i = roleMapper.deleteById(4L);
System.out.println("删除结果:" + i);
}
// 删除结果:1
实际执行的SQL
UPDATE tb_role SET is_deleted=1 WHERE id=4 AND is_deleted=0
通过执行的SQL我们可以发现,和之前章节介绍Mapper接口的deleteById
方法删除执行的SQL语句是不一样的,添加的逻辑删除功能,现在删除实际执行了update
的语句,并且会添加限定条件is_deleted=0
,这时候我们在查询一下id为4的记录,看看查询结果
@Test
public void selectById() {
Role role = roleMapper.selectById(4L);
System.out.println("查询结果:" + role);
}
// 查询结果:null
实际执行的SQL
SELECT
id,role_name,role_code,description,create_time,update_time,is_deleted
FROM
tb_role
WHERE id=4
AND is_deleted=0
通过结果看可以发现,id为4的角色查询返回结果为null
,并且SQL执行语句也看到了添加了条件is_deleted=0
Tips:
逻辑删除的使用需要进行取舍,不能一味的全部使用逻辑删除,这样会增加无价值数据的堆积,不仅增加磁盘存储的空间,同时使用逻辑删除还增加效率问题。