mybatisPlus怎么实现逻辑删除

发布时间:2022-01-31 15:06:56 作者:iii
来源:亿速云 阅读:340
# MyBatisPlus怎么实现逻辑删除

## 一、什么是逻辑删除

逻辑删除(Logical Delete)是相对于物理删除(Physical Delete)而言的数据库操作方式。在实际业务场景中,我们通常不会真正从数据库中删除数据,而是通过标记字段(如`is_deleted`、`status`等)来标识记录是否被"删除"。

### 逻辑删除 vs 物理删除
| 对比项       | 逻辑删除                     | 物理删除             |
|--------------|----------------------------|---------------------|
| 数据存储     | 保留在数据库中              | 从数据库彻底移除    |
| 实现方式     | 更新标记字段                | DELETE语句          |
| 恢复难度     | 容易(修改标记即可)        | 困难(需从备份恢复)|
| 查询复杂度   | 需要额外过滤条件            | 无需特殊处理        |
| 适用场景     | 需要数据追溯的业务          | 敏感数据彻底清除    |

## 二、MyBatisPlus实现逻辑删除

MyBatisPlus提供了开箱即用的逻辑删除功能,只需简单配置即可实现。

### 1. 数据库准备
首先需要在表中添加逻辑删除标志字段:
```sql
ALTER TABLE user ADD COLUMN is_deleted TINYINT(1) DEFAULT 0 COMMENT '逻辑删除标志(0-未删除,1-已删除)';

2. 实体类配置

在实体类对应字段上添加@TableLogic注解:

@Data
@TableName("user")
public class User {
    private Long id;
    private String name;
    
    @TableLogic
    private Integer isDeleted;
}

3. 全局配置(可选)

application.yml中配置全局逻辑删除规则:

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

4. 使用示例

执行删除操作时,MyBatisPlus会自动转换为更新操作:

// 实际执行:UPDATE user SET is_deleted=1 WHERE id=1
userMapper.deleteById(1L);

查询时会自动添加未删除条件:

// 实际执行:SELECT * FROM user WHERE is_deleted=0
userMapper.selectList(null);

三、高级配置与注意事项

1. 自定义SQL处理

如果需要手动编写SQL,可以使用@SqlParser注解或XML方式:

<select id="selectAllIncludeDeleted" resultType="User">
    SELECT * FROM user
</select>

2. 多租户场景下的处理

结合@InterceptorIgnore注解可跳过逻辑删除过滤:

@InterceptorIgnore(tenantLine = "true", logicDelete = "true")
List<User> selectAll();

3. 与乐观锁的兼容性

逻辑删除与@Version乐观锁注解可以同时使用:

@Version
private Integer version;
@TableLogic
private Integer isDeleted;

4. 性能优化建议

  1. 为逻辑删除字段建立索引
  2. 定期归档已删除数据
  3. 复杂查询考虑使用@SqlParser过滤

四、常见问题解决方案

Q1: 如何查询包含已删除的数据?

// 方案1:使用SQL注入器
public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT * FROM user")
    List<User> selectAllWithDeleted();
}

// 方案2:使用Wrapper手动覆盖
new QueryWrapper<User>().apply("is_deleted=1 OR is_deleted=0");

Q2: 逻辑删除字段类型必须为数值吗?

不是,MyBatisPlus支持多种类型:

@TableLogic
private Boolean isDeleted;  // 使用Boolean类型

@TableLogic
private String delFlag;    // 使用字符串类型

Q3: 如何实现多条件逻辑删除?

通过自定义SQL或继承AbstractMethod实现:

public int deleteByCondition(@Param("ew") Wrapper<User> wrapper);

五、最佳实践建议

  1. 命名规范:建议使用deleted/is_deleted等通用字段名
  2. 审计字段:配合@TableField(fill = FieldFill.INSERT)实现操作记录
  3. 数据归档:建议6个月以上的删除数据移入历史表
  4. 权限控制:严格限制物理删除操作的访问权限

结语

MyBatisPlus的逻辑删除功能通过简单的注解配置,极大简化了开发工作量。在实际项目中,建议结合业务场景合理使用,并注意定期维护删除数据,以保持数据库性能。对于需要频繁删除操作的场景,可以考虑结合Redis等缓存方案优化系统性能。 “`

注:本文实际约1200字,可根据需要增减内容。建议在实际项目中: 1. 添加具体的性能测试数据 2. 补充与具体数据库(如MySQL/Oracle)的兼容性说明 3. 增加与Spring事务的整合示例

推荐阅读:
  1. mysql中恢复逻辑删除方法
  2. MybatisPlus中的删除和逻辑删除及区别介绍

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

mybatisplus

上一篇:Linux系统如何添加路径到PATH环境变量

下一篇:Linux系统umount命令怎么用

相关阅读

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

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