MyBatis Plus 如何临时忽略逻辑删除?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
Qianwei Cheng 2025-08-26 22:20关注在 MyBatis Plus 中如何临时忽略逻辑删除,查询出被标记为已删除的数据?
在使用 MyBatis Plus 进行数据持久化操作时,逻辑删除是一个常见的功能,用于避免直接从数据库中物理删除数据。通过配置逻辑删除字段,MyBatis Plus 会在查询时自动加上逻辑删除条件(如
deleted = 0),从而屏蔽掉已被标记为删除的数据。但在某些业务场景下,例如数据分析、后台数据恢复或审计需求中,我们希望查询出被逻辑删除的数据。这就引出了一个实际开发中常见的问题:
“在 MyBatis Plus 中如何临时忽略逻辑删除,查询出被标记为已删除的数据?”
1. MyBatis Plus 逻辑删除机制概述
MyBatis Plus 提供了对逻辑删除的内置支持,通常通过以下方式配置:
- 在实体类字段上添加
@TableLogic注解。 - 在全局配置中设置逻辑删除字段及值(如 application.yml)。
例如,以下是一个典型的逻辑删除字段配置:
@Data public class User { private Long id; private String name; @TableLogic private Integer deleted; }当使用
selectList、selectById等方法时,MyBatis Plus 会自动在 SQL 中添加WHERE deleted = 0条件。2. 临时忽略逻辑删除的几种方式
在某些业务场景中,我们需要临时绕过逻辑删除的限制,获取所有数据(包括被标记为删除的数据)。以下是几种常见做法:
- 方式一:使用 Wrapper 忽略逻辑删除字段
- 方式二:通过自定义 SQL 绕过自动过滤
- 方式三:使用 ignoreTenantId 和 ignoreLogicDelete 注解(MyBatis Plus 多租户插件)
3. 使用 QueryWrapper 忽略逻辑删除字段
MyBatis Plus 的查询构造器(QueryWrapper)允许我们显式控制 SQL 的生成。通过调用
.select()方法并指定需要查询的字段,可以绕过自动添加的逻辑删除条件。List<User> userList = userMapper.selectList(new QueryWrapper<User>() .select(User::getId, User::getName, User::getDeleted));该方式适用于字段较少的情况。如果字段较多,可以使用 LambdaQueryWrapper:
List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>() .select(User::getId, User::getName, User::getDeleted));通过显式指定字段,可以避免 MyBatis Plus 自动添加逻辑删除过滤条件。
4. 自定义 SQL 查询忽略逻辑删除
如果希望完全控制 SQL 的生成,可以使用自定义 SQL 语句,例如在 Mapper 接口中定义如下方法:
@Select("SELECT * FROM user") List<User> selectAllIncludingDeleted();这种方式适用于需要频繁查询所有数据的场景,但缺点是失去了 MyBatis Plus 查询构造器的灵活性。
5. 使用 ignoreLogicDelete 注解(MyBatis Plus 多租户插件扩展)
如果你使用了 MyBatis Plus 的多租户插件(如 TenantLineInnerInterceptor),可以结合
@SqlParser注解来控制是否忽略逻辑删除:@SqlParser(filter = true) @Select("SELECT * FROM user") List<User> selectAllIncludingDeleted();此方式适用于复杂项目中需要临时绕过逻辑删除和多租户限制的场景。
6. 总结对比
方式 适用场景 优点 缺点 QueryWrapper 显式字段 字段较少时 无需编写 SQL,保持 ORM 风格 字段多时维护成本高 自定义 SQL 频繁查询所有数据 灵活控制 SQL 失去 QueryWrapper 的便捷性 @SqlParser 注解 结合多租户插件 统一控制逻辑删除与多租户 需引入插件,配置较复杂 7. 流程图:逻辑删除查询控制流程
graph TD A[开始查询] --> B{是否忽略逻辑删除?} B -- 是 --> C[构建无逻辑删除条件的 SQL] B -- 否 --> D[使用默认逻辑删除过滤] C --> E[执行查询并返回结果] D --> E本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 在实体类字段上添加