小书MybatisPlus第8篇-逻辑删除实现及API细节精讲

栏目: IT技术 · 发布时间: 6年前

内容简介:本文为Mybatis Plus系列文章的第8篇,前7篇访问地址如下:两者的优劣:所以一张表的数据是否采用逻辑删除,还要根据数据的重要性、数据量、查询性能以及业务需求等因素综合判断。

本文为Mybatis Plus系列文章的第8篇,前7篇访问地址如下:

一、物理删除与逻辑删除

  • 物理删除:指文件存储所用到的磁存储区域被真正的擦除或清零,这样删除的文件是不可以恢复的,物理删除是计算机处理数据时的一个概念。如果在数据库中直接使用delete、drop删除了表数据,如果没有备份的话,数据就很难恢复了。
  • 逻辑删除(软删除):逻辑删除就是对要被删除的数据打上一个删除标记,通常使用一个deleted字段标示行记录是不是被删除,比如该数据有一个字段deleted,当其值为0表示未删除,值为1表示删除。那么逻辑删除就是将0变成1。在逻辑上是数据是被删除的,但数据本身是依然存在的。

两者的优劣:

  • 物理删除一定程度上删除了“无用”的数据,降低了表的数据量,对性能肯定是有好处的;但是如果没有备份的话,数据很难恢复。也无法对历史数据进行数据分析。
  • 逻辑删除恢复的话只要修改ideleted等类似的状态标示字段就可以了,但是表的数据量肯定会比物理删除增加了,并且查询时经常要考虑到deleted字段,对索引都会有影响。

所以一张表的数据是否采用逻辑删除,还要根据数据的重要性、数据量、查询性能以及业务需求等因素综合判断。

二、逻辑删除实现

  • 首先为需要逻辑删除的表增加一个deleted字段作为逻辑删除字段,并且设置其默认值为0,如下:
CREATE TABLE `user` (
	`id` BIGINT(20) NOT NULL COMMENT '主键ID',
	`name` VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	`age` INT(11) NULL DEFAULT NULL COMMENT '年龄',
	`email` VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	`deleted` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除标记',
	PRIMARY KEY (`id`)
);
  • 给数据库表对应的实体类字段上加上@TableLogic注解:

小书MybatisPlus第8篇-逻辑删除实现及API细节精讲

三、API使用方法

3.1.插入一条数据

插入数据的时候,不需要为deleted字段赋值

@Test
public void testInsert() {
  User user = new User();
  user.setName("字母哥");
  user.setAge(18);

  int row = userMapper.insert(user);
}

deleted采用默认值0(未删除),新插入的数据都是未删除的数据

小书MybatisPlus第8篇-逻辑删除实现及API细节精讲

3.2.删除一条记录:

执行如下Mybatis Plus API删除操作

userMapper.deleteById(1286797255805796354L);

小书MybatisPlus第8篇-逻辑删除实现及API细节精讲

查看数据库可以发现这条数据仍然存在,只不过逻辑删除字段值被设置为1:

UPDATE user SET deleted=1 WHERE id=? AND deleted=0

3.3.查询一条记录

  • 当我们使用MP逻辑删除的功能之后,比如执行查询、修改的方法,MP会为我们自动加上未删除的条件。是不会查到被逻辑删除的记录:
userMapper.selectList(null);

会自动添加过滤条件 WHERE deleted=0

SELECT id,name,age,email,deleted
FROM user 
WHERE deleted=0
  • 当我们查询数据时,查询结果不希望包含逻辑删除字段,可以加如下的注解
@TableLogic
@TableField(select = false)
private Integer deleted;

执行的 SQL 如下(注意查询结果不包含deleted字段):

SELECT id,name,age,email 
FROM user 
WHERE deleted=0

四、全局配置参数

通常在一个比较正规的管理项目中,逻辑删除字段不允许随意命名,所有表的逻辑删除字段使用相同的名称(比如:deleted)。我们可以在application.yml中添加全局配置,这样就不需要在每一个实体类上面都添加 @TableLogic注解了:

注意:当全局配置和 @TableLogic 局部配置同时存在,则以实体上注解为准,优先级更高。

#全局逻辑删除字段值
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted

默认情况下,逻辑已删除值为1,逻辑未删除值为0。我们也可以在application.yml中进行修改:

#逻辑已删除值(默认为 1)
#逻辑未删除值(默认为 0)
mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字): 字母哥博客

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力!。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

高性能网站建设进阶指南

高性能网站建设进阶指南

Steve Souders / 口碑网前端团队 / 电子工业出版社 / 2010年4月 / 49.80元

性能是任何一个网站成功的关键,然而,如今日益丰富的内容和大量使用Ajax的Web应用程序已迫使浏览器达到其处理能力的极限。Steve Souders是Google Web性能布道者和前Yahoo!首席性能工程师,他在本书中提供了宝贵的技术来帮助你优化网站性能。 Souders的上一本畅销书《高性能网站建设指南》(High Performance Web Sites)震惊了Web开发界,它揭示......一起来看看 《高性能网站建设进阶指南》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具