乐趣区

关于spring:小书MybatisPlus第8篇逻辑删除实现及API细节精讲

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

  • 小书 MybatisPlus 第 1 篇 - 整合 SpringBoot 疾速开始增删改查
  • 小书 MybatisPlus 第 2 篇 - 条件结构器的利用及总结
  • 小书 MybatisPlus 第 3 篇 - 自定义 SQL
  • 小书 MybatisPlus 第 4 篇 - 表格分页与下拉分页查问
  • 小书 MybatisPlus 第 5 篇 -Active Record 模式精讲
  • 小书 MybatisPlus 第 6 篇 - 主键生成策略精讲
  • 小书 MybatisPlus 第 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 注解:

三、API 应用办法

3.1. 插入一条数据

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

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

  int row = userMapper.insert(user);
}

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

3.2. 删除一条记录:

执行如下 Mybatis Plus API 删除操作

userMapper.deleteById(1286797255805796354L);

查看数据库能够发现这条数据依然存在,只不过逻辑删除字段值被设置为 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

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

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

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学 Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2 一本通》
  • 《实战前后端拆散 RBAC 权限管理系统》
  • 《实战 SpringCloud 微服务从青铜到王者》
  • 《VUE 深入浅出系列》
退出移动版