逻辑删除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 # 标记未删除的值
logic-delete-field: 配置全局逻辑删除字段名(这里是isDelete),这个字段将作为逻辑删除的标记字段,所有涉及逻辑删除的表都需要包含该字段。logic-delete-value: 设置逻辑已删除的值(1),表示当isDelete字段为1时,数据为逻辑删除状态。logic-not-delete-value: 设置逻辑未删除的值(0),表示当isDelete字段为0时,数据为正常状态。
逻辑删除的实现原理
在添加了逻辑删除配置后,MyBatis-Plus 会自动在 SQL 查询中加入 isDelete = 0 的条件。具体来说:
- 查询过滤:当我们执行查询时(例如
selectOne或selectList),MyBatis-Plus 会自动在 SQL 中添加WHERE isDelete = 0的条件,从而过滤掉逻辑删除的记录。这就保证了查询结果中不会包含逻辑删除的数据。 - 更新和删除操作:如果执行删除操作(例如
deleteById),MyBatis-Plus 会将isDelete字段设置为1,而不是物理删除记录,这样记录依然保留在数据库中,只不过在后续查询时不会被选出来。
原理说明
配置了逻辑删除的字段后,MyBatis-Plus 在生成 SQL 语句时,会依据逻辑删除的规则自动添加条件:
- 查询操作:
MyBatis-Plus会在查询条件中自动增加isDelete = 0,实现了逻辑删除的过滤。例如,原本的查询语句:
SELECT * FROM user WHERE userAccount = ? AND userPassword = ?
在启用逻辑删除后,自动转变为:
SELECT * FROM user WHERE userAccount = ? AND userPassword = ? AND isDelete = 0
- 删除操作:当调用
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 的全局配置进行逻辑删除设置,可以简化代码,避免手动添加过滤条件,从而实现数据的软删除,提升系统的安全性和数据管理的灵活性
💬 评论