# 如何分析MyBatis Plus中的逻辑删除 ## 一、逻辑删除概述 逻辑删除(Soft Delete)是一种数据删除策略,它通过标记字段(如`is_deleted`)标识记录状态而非物理删除数据。MyBatis Plus作为MyBatis的增强工具,提供了开箱即用的逻辑删除功能,具有以下优势: 1. 保留历史数据便于审计 2. 支持数据恢复操作 3. 避免外键约束问题 ## 二、配置逻辑删除 ### 1. 数据库表设计 需添加状态标记字段,推荐使用: ```sql ALTER TABLE user ADD COLUMN is_deleted TINYINT DEFAULT 0;
通过注解标识逻辑删除字段:
@Data public class User { @TableLogic private Integer isDeleted; // 1-已删除 0-未删除 }
在application.yml
中配置:
mybatis-plus: global-config: db-config: logic-delete-field: isDeleted # 全局逻辑删除字段 logic-delete-value: 1 # 删除值 logic-not-delete-value: 0 # 未删除值
MyBatis Plus通过以下机制实现逻辑删除:
SQL自动改写:
UPDATE user SET is_deleted = 1 WHERE id = ?
查询自动过滤: 自动添加未删除条件
SELECT * FROM user WHERE is_deleted = 0
Wrapper条件处理: 使用QueryWrapper
时自动忽略逻辑删除字段的条件冲突
// 方式1:使用@SqlParser注解 @SqlParser(filter = true) public List<User> selectAll() { return userMapper.selectList(null); } // 方式2:手动构造wrapper QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.isNull("is_deleted").or().eq("is_deleted", 0);
需注意条件拼接顺序,建议配置:
@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new TenantLineInnerInterceptor()); interceptor.addInnerInterceptor(new LogicSqlInjector()); return interceptor; }
ALTER TABLE user ADD UNIQUE KEY uk_name (name, is_deleted);
MyBatis Plus的逻辑删除功能通过简洁的配置即可实现,但需要注意实际业务中的特殊查询需求和数据一致性保障。建议在复杂场景中结合自定义SQL和拦截器进行扩展。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。