mybatis 本身不提供逻辑删除功能,但可通过 mybatis-plus 内置支持或手动扩展 sql 实现:添加 deleted 字段、用 @tablelogic 标注、配置 logic-delete-value,使 deletebyid 变为 update、查询自动追加 deleted=0 条件;纯 mybatis 需在 xml 中定义逻辑删除语句和通用查询过滤片段,并注意事务、缓存、索引、归档及联表一致性。

MyBatis 本身不直接提供逻辑删除功能,但结合 MyBatis-Plus 或手动扩展 SQL 可以轻松实现——核心是用字段标记“已删除”状态(如 is_deleted 或 deleted_at),查询时自动过滤,删除时只更新状态而非执行 DELETE。
使用 MyBatis-Plus 自动逻辑删除(推荐)
MyBatis-Plus 内置了逻辑删除支持,只需简单配置即可全局生效,无需修改每个 Mapper 方法。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
数据库加字段:在表中添加一个标识字段,例如
deleted BIT DEFAULT 0(MySQL)或deleted TINYINT(1) DEFAULT 0,值为1表示已逻辑删除。 -
实体类标注:在对应属性上加
@TableLogic注解:private Integer deleted;@TableLogicprivate Integer deleted; -
配置默认值(可选):在
application.yml中指定逻辑未删除/已删除的值:mybatis-plus:global-config:db-config:logic-delete-field: deletedlogic-delete-value: 1logic-not-delete-value: 0 -
效果:调用
mapper.deleteById(id)时,MyBatis-Plus 自动生成UPDATE ... SET deleted = 1;所有selectList、getById等查询自动追加AND deleted = 0条件。
纯 MyBatis 手动实现逻辑删除
若未使用 MyBatis-Plus,可在 XML 映射文件或注解中显式控制逻辑删除行为。
-
定义删除语句(XML 示例):
<update id="logicDeleteById"></update>UPDATE user SET deleted = 1, updated_time = NOW() WHERE id = #{id} AND deleted = 0 -
统一查询过滤(推荐用 SQL 片段):
<sql id="notDeletedWhere">AND deleted = 0</sql><select id="selectAll"></select>SELECT * FROM user WHERE 1=1 <include refid="notDeletedWhere"></include> -
注意事务与缓存:确保更新和查询走同一事务,避免二级缓存返回旧数据;必要时调用
clearCache()或禁用相关缓存。
注意事项与最佳实践
-
索引优化:为逻辑删除字段(如
deleted)加上索引,尤其当表数据量大且频繁查询未删除记录时,避免全表扫描。 - 历史数据归档:长期积累的逻辑删除数据会影响查询性能,建议定期归档到历史表或物理清理(需业务确认无依赖)。
- 接口与日志一致性:删除接口返回成功后,应记录操作日志(含操作人、时间、ID);前端按钮文案建议改为“删除”而非“移除”,避免用户误解为彻底消失。
-
联表查询处理:涉及多表关联时,每个被关联的主表都要加
deleted = 0条件,否则可能查出已被逻辑删除的脏数据。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










