温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何分析mybatis plus中的逻辑删除

发布时间:2021-12-09 10:26:03 来源:亿速云 阅读:202 作者:柒染 栏目:大数据
# 如何分析MyBatis Plus中的逻辑删除 ## 一、逻辑删除概述 逻辑删除(Soft Delete)是一种数据删除策略,它通过标记字段(如`is_deleted`)标识记录状态而非物理删除数据。MyBatis Plus作为MyBatis的增强工具,提供了开箱即用的逻辑删除功能,具有以下优势: 1. 保留历史数据便于审计 2. 支持数据恢复操作 3. 避免外键约束问题 ## 二、配置逻辑删除 ### 1. 数据库表设计 需添加状态标记字段,推荐使用: ```sql ALTER TABLE user ADD COLUMN is_deleted TINYINT DEFAULT 0; 

2. 实体类配置

通过注解标识逻辑删除字段:

@Data public class User { @TableLogic private Integer isDeleted; // 1-已删除 0-未删除 } 

3. 全局配置(可选)

application.yml中配置:

mybatis-plus: global-config: db-config: logic-delete-field: isDeleted # 全局逻辑删除字段 logic-delete-value: 1 # 删除值 logic-not-delete-value: 0 # 未删除值 

三、实现原理分析

MyBatis Plus通过以下机制实现逻辑删除:

  1. SQL自动改写

    • 删除操作转为UPDATE语句
    UPDATE user SET is_deleted = 1 WHERE id = ? 
  2. 查询自动过滤: 自动添加未删除条件

    SELECT * FROM user WHERE is_deleted = 0 
  3. Wrapper条件处理: 使用QueryWrapper时自动忽略逻辑删除字段的条件冲突

四、特殊场景处理

1. 查询包含已删除数据

// 方式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); 

2. 多租户场景

需注意条件拼接顺序,建议配置:

@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new TenantLineInnerInterceptor()); interceptor.addInnerInterceptor(new LogicSqlInjector()); return interceptor; } 

五、注意事项

  1. 索引优化:建议为逻辑删除字段添加索引
  2. 唯一约束:需将逻辑删除字段纳入唯一索引
     ALTER TABLE user ADD UNIQUE KEY uk_name (name, is_deleted); 
  3. 性能影响:大数据量查询时注意条件效率

六、总结

MyBatis Plus的逻辑删除功能通过简洁的配置即可实现,但需要注意实际业务中的特殊查询需求和数据一致性保障。建议在复杂场景中结合自定义SQL和拦截器进行扩展。 “`

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI