MyBatisPlus之逻辑删除

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

MyBatisPlus之逻辑删除


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

在学习MyBatisPlus的过程中,逻辑删除是一个比较重要的知识点。逻辑删除是指使用一个特殊的字段来表示数据库表中的一条记录是否被删除了(或是否存在),例如为数据库表中的每一条记录都增加一个is_delete字段,当is_delete为1时,表示该记录已经被删除了,当is_delete为0时,表示该记录还有效。与逻辑删除相对的就是物理删除,指直接从数据库中删除记录。

逻辑删除是为了方便数据恢复和保护数据本身价值等的一种方案,但实际就是删除。如果需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。

希望通过本文的介绍,大家对MyBatisPlus的逻辑删除有一个初步的了解。后续会详细介绍逻辑删除的实现在此基础上。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是逻辑删除

逻辑删除是一种用于表示数据删除状态的数据处理方式。在逻辑删除中,数据并没有从数据库中真正被删除,而是通过标记或更新一个字段来表示该数据已被删除。

常见的实现方式是在数据库表中添加一个名为is_deleted的字段,并将其设置为1或true来表示数据已被删除,设置为0或false来表示数据未被删除。这样,在查询数据时,可以通过添加条件来过滤出已被删除的数据。此时增删改查的Sql语句发生变化:

  • 插入: 不作限制
  • 查找: 追加where条件过滤掉已删除数据。例如 select id,name,deleted from user where deleted=0
  • 更新: 追加where条件防止更新到已删除数据。
  • 删除: 转变为更新,例如 update user set deleted=1 where id = 1 and deleted=0

逻辑删除的好处是可以保留数据的历史记录,以便在需要时进行恢复或审计。同时,它还可以避免由于误操作或数据完整性问题导致的数据丢失。

需要注意的是,逻辑删除只是一种数据处理方式,并不代表数据真正被删除。在实际应用中,需要根据具体情况选择合适的数据处理方式,并确保数据的安全性和完整性。

二、逻辑删除的使用

1.在配置文件配置逻辑删除

yaml 复制代码
# mybatis-plus相关配置
mybatis-plus:
 # 全局配置
  global-config:
   db-config:
   # 全局逻辑删除的字段名
    logic-delete-field: deleted
   # 逻辑已删除值(默认为 1)
    logic-delete-value: 1
   # 逻辑未删除值(默认为 0)
    logic-not-delete-value: 0

2.修改实体类,添加逻辑删除属性

java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student extends Model<Student> {
  @TableId(value = "sid")
  private Integer id;
  @TableField("sname")
  private String name;
  private String email;
  private String gender;
  private Integer age;
  @Version
  private Integer version;
  @TableLogic
  private Integer deleted;
}

3.修改数据库表,添加一列整型deleted字段并设置默认值为0

4.测试删除和查询方法,会看到删除时将deleted字段变为1,查询时添加条件deleted=0

三、自动填充

因为存在逻辑删除字段,所以在向数据库插入数据时,都需要将deleted字段的值设置为 0。每次插入数据都要设置这个值,非常繁琐。因此,MyBatis-Plus 提供了自动填充功能来解决这个问题。

自动填充步骤

1.为实体类的自动填充字段添加@TableField

java 复制代码
@TableLogic
// 自动填充字段
@TableField(fill = FieldFill.INSERT)
private Integer deleted;

填充策略:

  • DEFAULT:默认不处理
  • INSERT:插入操作填充字段
  • UPDATE:更新操作填充字段
  • INSERT_UPDATE:插入操作和更新操作均填充字段

2.自定义填充类实现MetaObjectHandler接口

java 复制代码
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
  /**
   * 插入时填充逻辑
   * @param metaObject 元对象
   */
  @Override
  public void insertFill(MetaObject metaObject) {
    /**
     * 参数1:填充字段名
     * 参数2:参数值
     * 参数3:元对象
     */
    this.setFieldValByName("deleted", 0, metaObject);
   }


  /**
   * 更新时填充逻辑
   * @param metaObject
   */
  @Override
  public void updateFill(MetaObject metaObject) {
   }
}

总结

提示:这里对文章进行总结:

  1. 什么是逻辑删除:逻辑删除是指文件或数据没有被真正删除,只是通过对数据进行标注,使其无法被识别到。这种删除操作通常是可逆的,即可以使用适当的工具或软件将删除的文件或数据恢复出来。
  2. 常规逻辑删除:在数据库表中添加一个is_delete字段,值为0表示数据未删除,值为1表示数据已删除。插入数据时,该字段默认为0。删除数据时,将该值设置为1。查询和更新数据时都将is_delete=0作为条件,只查询和更新未删除的数据。
相关推荐
老华带你飞10 分钟前
酒店预约|基于springboot 酒店预约系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
会飞的土拨鼠呀27 分钟前
如何查询MySQL的CPU使用率突然变高
数据库·mysql
想用offer打牌35 分钟前
一站式了解数据库三大范式(库表设计基础)
数据库·后端·面试
甘露s37 分钟前
MySQL深入之索引、存储引擎和SQL优化
数据库·sql·mysql
偶遇急雨洗心尘1 小时前
记录一次服务器迁移时,数据库版本不一致导致sql函数报错和系统redirect重定向丢失域名问题
运维·服务器·数据库·sql
Arva .2 小时前
MySQL 的存储引擎
数据库·mysql
Logic1012 小时前
《Mysql数据库应用》 第2版 郭文明 实验5 存储过程与函数的构建与使用核心操作与思路解析
数据库·sql·mysql·学习笔记·计算机网络技术·形考作业·国家开放大学
小二·2 小时前
MyBatis基础入门《十六》企业级插件实战:基于 MyBatis Interceptor 实现 SQL 审计、慢查询监控与数据脱敏
数据库·sql·mybatis
bing.shao2 小时前
Golang WaitGroup 踩坑
开发语言·数据库·golang
专注VB编程开发20年2 小时前
C#内存加载dll和EXE是不是差不多,主要是EXE有入口点
数据库·windows·microsoft·c#