在使用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. 方法一:移除逻辑删除的全局配置或禁用特定实体的逻辑删除
最直接的方式是避免启用逻辑删除功能。可以通过以下两种方法实现:
- 移除全局配置: 在`application.yml`中注释或移除逻辑删除相关的配置项。
- 禁用特定实体: 在实体类中移除`@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;通过上述流程,开发者可以根据实际需求选择最适合的方案。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报