code4f 2025-05-01 04:40 采纳率: 98.1%
浏览 85
已采纳

MyBatisPlus如何实现物理删除而非逻辑删除?

在使用MyBatis-Plus时,如何确保执行的是物理删除而不是逻辑删除? 默认情况下,MyBatis-Plus如果配置了逻辑删除,会优先执行逻辑删除操作。但若要实现物理删除,可以通过以下方式:一是移除逻辑删除的全局配置或针对特定实体禁用逻辑删除;二是使用`removeById`、`removeByMap`等方法时,明确调用`setLogicDelete(false)`关闭逻辑删除功能(适用于自定义BaseMapper场景);三是直接编写XML映射文件或使用@SqlParser注解跳过逻辑删除解析器。例如,在代码中通过`userMapper.deleteById(id)`完成物理删除前,需确认未触发逻辑删除拦截器。如何正确处理这些配置以满足项目需求?
  • 写回答

1条回答 默认 最新

  • 诗语情柔 2025-10-21 17:46
    关注

    1. 理解MyBatis-Plus逻辑删除与物理删除

    在MyBatis-Plus中,默认情况下,如果配置了逻辑删除,执行删除操作时会优先触发逻辑删除。这意味着数据并未真正从数据库中移除,而是通过更新字段(如deleted标志)来标记为已删除。

    要实现物理删除,必须明确跳过逻辑删除机制。以下是一些关键概念:

    • 全局配置: MyBatis-Plus允许在全局配置文件中定义逻辑删除规则。
    • 实体注解: 在实体类中使用`@TableLogic`注解可启用逻辑删除。
    • 拦截器: 逻辑删除功能依赖于SQL解析器拦截器。

    接下来,我们将逐步探讨如何确保执行的是物理删除。

    2. 方法一:移除逻辑删除的全局配置或禁用特定实体的逻辑删除

    最直接的方式是避免启用逻辑删除功能。可以通过以下两种方法实现:

    1. 移除全局配置: 在`application.yml`中注释或移除逻辑删除相关的配置项。
    2. 禁用特定实体: 在实体类中移除`@TableLogic`注解,或者通过`setLogic(false)`方法动态关闭。
    // application.yml
    mybatis-plus:
      global-config:
        db-config:
          # logic-delete-value: 1
          # logic-not-delete-value: 0
    

    注意:如果项目中某些场景需要逻辑删除,而另一些场景需要物理删除,则不建议完全移除全局配置。

    3. 方法二:通过代码设置关闭逻辑删除

    MyBatis-Plus提供了灵活的API支持,在调用删除方法时可以临时关闭逻辑删除功能。例如:

    方法描述
    `removeById`根据主键删除记录。
    `removeByMap`根据条件Map删除记录。
    // 示例代码
    userMapper.delete().setLogicDelete(false).apply("id = {0}", id);
    

    上述代码片段展示了如何通过链式调用`setLogicDelete(false)`来关闭逻辑删除功能。

    4. 方法三:使用XML映射文件或@SqlParser注解跳过逻辑删除解析器

    如果希望更细粒度地控制SQL行为,可以通过自定义XML映射文件或使用`@SqlParser`注解跳过逻辑删除解析器。以下是具体步骤:

    • XML映射文件: 编写自定义的SQL语句,绕过MyBatis-Plus默认的逻辑删除机制。
    • @SqlParser注解: 在Mapper接口方法上添加`@SqlParser(skip=true)`,从而忽略逻辑删除解析。
    @SqlParser(skip=true)
    public int deleteById(Long id);
    

    此方法适用于需要对特定方法进行特殊处理的场景。

    5. 流程图:确保物理删除的操作步骤

    以下流程图总结了确保物理删除的操作逻辑:

    graph TD; A[开始] --> B{是否全局禁用逻辑删除?}; B -- 是 --> C[完成]; B -- 否 --> D{是否针对特定实体禁用?}; D -- 是 --> C; D -- 否 --> E[调用`setLogicDelete(false)`]; E --> C;

    通过上述流程,开发者可以根据实际需求选择最适合的方案。

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

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 5月1日