CraigSD 2025-08-26 22:20 采纳率: 98.7%
浏览 138
已采纳

MyBatis Plus 如何临时忽略逻辑删除?

在使用 MyBatis Plus 进行数据查询时,逻辑删除功能通常通过注解或配置自动生效,但在某些场景下(如数据分析或后台管理需求),需要临时忽略逻辑删除限制,查询出所有数据。因此,一个常见的技术问题是: **“在 MyBatis Plus 中如何临时忽略逻辑删除,查询出被标记为已删除的数据?”** 该问题涉及 MyBatis Plus 的逻辑删除机制、查询构造器(QueryWrapper)的使用方式,以及如何通过参数控制是否忽略逻辑删除字段,是实际开发中常遇到的疑问。
  • 写回答

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;
    }

    当使用 selectListselectById 等方法时,MyBatis Plus 会自动在 SQL 中添加 WHERE deleted = 0 条件。

    2. 临时忽略逻辑删除的几种方式

    在某些业务场景中,我们需要临时绕过逻辑删除的限制,获取所有数据(包括被标记为删除的数据)。以下是几种常见做法:

    1. 方式一:使用 Wrapper 忽略逻辑删除字段
    2. 方式二:通过自定义 SQL 绕过自动过滤
    3. 方式三:使用 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
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 8月26日