系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
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) {
}
}
总结
提示:这里对文章进行总结:
- 什么是逻辑删除:逻辑删除是指文件或数据没有被真正删除,只是通过对数据进行标注,使其无法被识别到。这种删除操作通常是可逆的,即可以使用适当的工具或软件将删除的文件或数据恢复出来。
- 常规逻辑删除:在数据库表中添加一个is_delete字段,值为0表示数据未删除,值为1表示数据已删除。插入数据时,该字段默认为0。删除数据时,将该值设置为1。查询和更新数据时都将is_delete=0作为条件,只查询和更新未删除的数据。