mybatis-plus逻辑删除是内建机制,通过字段标记与sql自动改写实现;只需三步:数据库加deleted字段并建索引、实体类用@tablelogic标注、yml中配置全局规则,即可使crud自动规避物理删除。

MyBatis-Plus 的逻辑删除插件不是独立插件,而是内建机制,通过字段标记 + 自动 SQL 改写来保护历史数据。它不依赖额外 jar 包,只需三步配置就能让所有标准 CRUD 操作自动规避物理删除、保留原始记录。
数据库加一个状态字段
在目标表中新增整数或布尔型字段(如 deleted 或 is_deleted),设默认值为 0(未删除):
-
MySQL 示例:
ALTER TABLE user ADD COLUMN deleted TINYINT DEFAULT 0 COMMENT '0-正常, 1-已删除'; - 字段类型推荐用 Integer(兼容性好)或 Boolean(语义清晰),避免用字符串
- 务必加索引(尤其高并发查询场景):
CREATE INDEX idx_user_deleted ON user(deleted);
实体类标注 @TableLogic
在对应实体类的字段上添加注解,明确告诉 MyBatis-Plus 这是逻辑删除字段:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 最简写法:
@TableLogic private Integer deleted;(使用默认值:未删=0,已删=1) - 自定义值:
@TableLogic(value = "0", delval = "1") private Integer deleted; - 若字段名不是
deleted(比如叫status),必须配合全局配置或注解显式指定
全局配置统一规则
在 application.yml 中声明通用规则,确保全项目行为一致:
-
logic-delete-field: deleted—— 所有实体共用的字段名 -
logic-not-delete-value: 0—— 查询时自动追加WHERE deleted = 0 -
logic-delete-value: 1——deleteById()实际执行UPDATE ... SET deleted = 1 - 注解配置优先级高于全局配置,适合多规范混合项目
效果验证与注意事项
配置生效后,无需修改业务代码,即可获得数据保护能力:
-
查:调用
selectList(null)或getById(),SQL 自动带AND deleted = 0 -
删:调用
deleteById(123),实际执行的是UPDATE ... SET deleted = 1 WHERE id = 123 AND deleted = 0 -
注意:自定义 XML 编写的 SQL 不受逻辑删除影响,需手动加
AND deleted = 0 -
注意:恢复数据只需
UPDATE ... SET deleted = 0,无需重建关联关系
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










