逻辑删除是一种软删除的手段,它通过将数据的状态标记为已删除,而不是直接从数据库中删除数据。以下是逻辑删除的一般流程:
-
数据库设计:在数据库表中添加一个用于表示删除状态的字段,通常是一个布尔类型的列,比如
is_deleted
。 -
标记为已删除:当需要删除数据时,而不是直接从数据库中删除,而是将
is_deleted
字段设置为真(1或true),表示该数据已被逻辑删除。 -
查询数据:在查询数据时,需要过滤掉已被逻辑删除的数据。查询语句通常会包含一个额外的条件,如
WHERE is_deleted = false
,这样只会返回未被逻辑删除的数据。 -
恢复数据:如果需要恢复被逻辑删除的数据,可以更新
is_deleted
字段为假(0或false)。
而在MyBatisPlus
框架中,它可以自动帮我们实现逻辑删除。我们先来看一下MyBatisPlus
官方文档:
说明:
只对自动注入的 sql 起效:
插入: 不作限制
查找: 追加 where 条件过滤掉已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段
更新: 追加 where 条件防止更新到已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段
删除: 转变为 更新
例如:
删除: update user set deleted=1 where id = 1 and deleted=0
查找: select id,name,deleted from user where deleted=0
字段类型支持说明:
支持所有数据类型(推荐使用 Integer,Boolean,LocalDateTime)
如果数据库字段使用datetime,逻辑未删除值和已删除值支持配置为字符串null,另一个值支持配置为函数来获取值如now()
附录:
逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。
#使用方法
#步骤 1: 配置com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig
例: application.yml
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
#步骤 2: 实体类字段上加上@TableLogic注解
@TableLogic
private Integer deleted;
逻辑删除的好处是,在删除数据时不会真正地删除它们,而是保留数据的历史记录。这有助于保留数据完整性以及提供恢复和审计功能,同时还可以避免误删数据的风险。然而,需要注意的是逻辑删除只是一种软删除方式,对于一些敏感数据或需要完全删除的情况,物理删除可能更合适。
总结:逻辑删除是一种不直接删除数据而是将其状态标记为已删除的方法。通过在数据库表中添加一个表示删除状态的字段,并在查询数据时过滤已被逻辑删除的数据,可以实现逻辑删除的效果。逻辑删除保留了数据的历史记录并提供了恢复和审计功能,但需要注意逻辑删除并非适用于所有情况,特定的业务需求可能需要考虑使用其他删除方式。