逻辑删除mybatis-plus配置原理

在数据库设计中,逻辑删除是一种不直接删除数据的方式,而是通过在表中添加一个标记字段(例如 isDelete 字段),来区分数据是否被删除。逻辑删除主要用于在不影响数据完整性的前提下,实现对数据的软删除,以便于后续的数据恢复或历史数据的审计。

MyBatis-Plus 中,逻辑删除功能通过全局配置实现,可以对数据库查询和更新操作进行自动处理。你的配置文件中设置了 isDelete 字段作为逻辑删除标记字段,并指定了两个值:1 表示逻辑删除,0 表示未删除。以下是这个配置的作用和原理:

配置解释

mybatis-plus:

  global-config:

    db-config:

      logic-delete-field: isDelete # 设置逻辑删除的标记字段

      logic-delete-value: 1        # 标记已删除的值

      logic-not-delete-value: 0    # 标记未删除的值
  1. logic-delete-field: 配置全局逻辑删除字段名(这里是 isDelete),这个字段将作为逻辑删除的标记字段,所有涉及逻辑删除的表都需要包含该字段。
  2. logic-delete-value: 设置逻辑已删除的值(1),表示当 isDelete 字段为 1 时,数据为逻辑删除状态。
  3. logic-not-delete-value: 设置逻辑未删除的值(0),表示当 isDelete 字段为 0 时,数据为正常状态。

逻辑删除的实现原理

在添加了逻辑删除配置后,MyBatis-Plus 会自动在 SQL 查询中加入 isDelete = 0 的条件。具体来说:

  • 查询过滤:当我们执行查询时(例如 selectOneselectList),MyBatis-Plus 会自动在 SQL 中添加 WHERE isDelete = 0 的条件,从而过滤掉逻辑删除的记录。这就保证了查询结果中不会包含逻辑删除的数据。
  • 更新和删除操作:如果执行删除操作(例如 deleteById),MyBatis-Plus 会将 isDelete 字段设置为 1,而不是物理删除记录,这样记录依然保留在数据库中,只不过在后续查询时不会被选出来。

原理说明

配置了逻辑删除的字段后,MyBatis-Plus 在生成 SQL 语句时,会依据逻辑删除的规则自动添加条件:

  1. 查询操作MyBatis-Plus 会在查询条件中自动增加 isDelete = 0,实现了逻辑删除的过滤。例如,原本的查询语句:
   SELECT * FROM user WHERE userAccount = ? AND userPassword = ?

在启用逻辑删除后,自动转变为:

   SELECT * FROM user WHERE userAccount = ? AND userPassword = ? AND isDelete = 0
  1. 删除操作:当调用 deleteById 方法时,MyBatis-Plus 并不会直接删除记录,而是生成一条更新语句,将 isDelete 字段设置为 1,标记为逻辑删除。例如,以下物理删除语句:
   DELETE FROM user WHERE id = ?

会被转换为逻辑删除语句:

   UPDATE user SET isDelete = 1 WHERE id = ?

应用示例

// 查询未逻辑删除的用户

QueryWrapper<User> queryWrapper = new QueryWrapper<>();

queryWrapper.eq("userAccount", userAccount);

queryWrapper.eq("userPassword", encryptPassword);

User user = userMapper.selectOne(queryWrapper); // 自动过滤 isDelete = 1 的记录

小结

通过对 MyBatis-Plus 的全局配置进行逻辑删除设置,可以简化代码,避免手动添加过滤条件,从而实现数据的软删除,提升系统的安全性和数据管理的灵活性


项目分区导航:⬅️ 14-业务逻辑 | 15-逻辑删除mybatis-plus配置原理 | ➡️ 16-优化封装