**问题:如何在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 会在查询语句中自动追加类似
graph TD A[用户调用deleteById] --> B{是否存在@TableLogic注解} B -->|是| C[生成UPDATE语句] B -->|否| D[生成DELETE语句] C --> E[设置deleted=1] D --> F[物理删除]WHERE deleted = 0的条件,同时在执行删除操作时,不会执行DELETE FROM,而是更新deleted字段为1。四、常见问题与注意事项
- 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指定逻辑删除字段名(可选) deletedlogic-delete-value逻辑删除值 1logic-not-delete-value非删除值 0此外,也可以结合AOP或拦截器实现更复杂的逻辑删除策略,例如多租户隔离 + 软删除组合使用等。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报