参考:https://baomidou.com/guides/logic-delete/
本质:逻辑删除的效果等同于物理删除,其目的是为了保留数据,实现数据价值最大化
逻辑删除字段类型
支持所有数据类型,但推荐使用 Integer、Boolean 或 LocalDateTime。
- 若为datetime类型:未删除值可为null字符串,已删除值可为now()
- 若为bigint 类型:未删除值可为 0,已删除值可为当前时间戳(UNIX_TIMESTAMP)
当一条记录需要多次逻辑删除,或者需要与逻辑删除列共同组成唯一索引时,可以选择以当前时间或者当前时间戳作为逻辑删除标记。
项目配置使用
- 全局配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除字段名
logic-delete-value: 1 # 逻辑已删除值
logic-not-delete-value: 0 # 逻辑未删除值
- 实体类配置
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface TableLogic {
/**
* 默认逻辑未删除值(该值可无、会自动获取全局配置)
*/
String value() default "";
/**
* 默认逻辑删除值(该值可无、会自动获取全局配置)
*/
String delval() default "";
}
工作原理
MyBatis-Plus 的逻辑删除功能会在执行数据库操作时自动处理逻辑删除字段。
- 插入:逻辑删除字段的值不受限制。
- 方法①:建表语句中为逻辑删除字段设置默认值
- 方法②:插入数据前手动设置逻辑删除字段的值
- 方法③:使用 MyBatis-Plus 的自动填充功能
- 查找:自动添加条件,过滤掉标记为已删除的记录。
- 更新:防止更新已删除的记录。
- 删除:将删除操作转换为更新操作,标记记录为已删除
com.baomidou.mybatisplus.core.injector.AbstractMethod#sqlWhereEntityWrapper()