世界再美我始终如一 2025-06-29 02:55 采纳率: 98.3%
浏览 1
已采纳

MyBatis Plus如何配置逻辑删除字段?

**问题:如何在MyBatis Plus中配置逻辑删除字段?** 在使用MyBatis Plus进行开发时,为了实现数据的软删除功能,通常需要配置逻辑删除字段。那么,如何正确地在MyBatis Plus中配置逻辑删除字段?具体步骤包括哪些?例如,数据库中字段名为`deleted`,类型为`tinyint`,值为`1`表示已删除,`0`表示未删除,应如何通过注解或全局配置实现自动逻辑删除?同时需要注意哪些常见问题,如SQL中是否自动拼接条件、如何处理已有物理删除语句等?
  • 写回答

1条回答 默认 最新

  • IT小魔王 2025-10-21 22:49
    关注

    一、MyBatis Plus中配置逻辑删除字段的背景与意义

    在实际的企业级应用开发中,数据安全性和可追溯性至关重要。为了防止误删重要数据,通常会采用“软删除”机制,即通过一个字段标识该记录是否被删除,而不是真正从数据库中物理删除。

    MyBatis Plus 提供了对逻辑删除的良好支持,开发者可以通过简单的配置即可实现自动拼接逻辑删除条件,避免手动编写SQL时遗漏相关条件。

    二、逻辑删除字段的基本配置方式

    以字段名 deleted,类型为 TINYINT,值为 1 表示已删除,0 表示未删除为例,我们可以通过以下两种方式进行配置:

    • 方式一:注解方式(单个实体类)
    • @Data
      public class User {
          private Long id;
          private String name;
      
          @TableLogic
          private Integer deleted;
      }
    • 方式二:全局配置(适用于多个实体类)
    • application.yml 中添加如下配置:

      mybatis-plus:
        global-config:
          db-config:
            logic-delete-value: 1
            logic-not-delete-value: 0

    三、逻辑删除的底层原理与执行流程分析

    当启用逻辑删除后,MyBatis Plus 会在查询语句中自动追加类似 WHERE deleted = 0 的条件,同时在执行删除操作时,不会执行 DELETE FROM,而是更新 deleted 字段为 1

    graph TD A[用户调用deleteById] --> B{是否存在@TableLogic注解} B -->|是| C[生成UPDATE语句] B -->|否| D[生成DELETE语句] C --> E[设置deleted=1] D --> F[物理删除]

    四、常见问题与注意事项

    • 1. SQL语句是否会自动拼接条件?
    • 是的,在使用 MyBatis Plus 自带的查询方法(如 selectList, selectById 等)时,框架会自动在SQL末尾加上 AND deleted = 0 条件。

    • 2. 如何处理已有物理删除语句?
    • 如果你之前已经有物理删除的SQL语句(如自定义SQL),则需要手动修改为更新 deleted 字段的操作,否则会导致数据不一致。

    • 3. 是否影响性能?
    • 逻辑删除本质上是在每次查询中增加了一个过滤条件,对性能影响较小。但如果表数据量极大,建议为 deleted 字段建立索引。

    • 4. 查询所有数据(包括已删除)怎么办?strong>
    • 可以使用 withDeleted() 方法绕过逻辑删除限制:

      userMapper.selectList(new QueryWrapper().withDeleted(true));

    五、进阶配置与最佳实践

    配置项说明示例
    logic-delete-field指定逻辑删除字段名(可选)deleted
    logic-delete-value逻辑删除值1
    logic-not-delete-value非删除值0

    此外,也可以结合AOP或拦截器实现更复杂的逻辑删除策略,例如多租户隔离 + 软删除组合使用等。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 6月29日