在使用 MyBatis-Plus 时,逻辑删除是一项常见的需求,它通过标志位来标记数据是否被删除,而不是直接删除数据。MyBatis-Plus 提供了简单的配置来实现这一功能,但在实际使用过程中,可能会遇到一些坑。本文将介绍如何正确配置和使用 MyBatis-Plus 的逻辑删除功能。
步骤 1: 配置全局逻辑删除属性
首先,在 application.yml
中配置 MyBatis-Plus 的全局逻辑删除属性。这样,我们可以在全局范围内配置哪个字段是逻辑删除字段,以及如何判断该字段的值表示数据是否已删除。
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 指定全局逻辑删除字段名
logic-delete-value: 1 # 逻辑已删除值
logic-not-delete-value: 0 # 逻辑未删除值
在这里,我们配置了:
logic-delete-field
:指定逻辑删除的字段名,这里使用的是deleted
。logic-delete-value
:指定逻辑删除的值,通常使用1
来表示已删除。logic-not-delete-value
:指定逻辑未删除的值,通常使用0
来表示未删除。
步骤 2: 在实体类中使用 @TableLogic
注解
在实体类中,使用 MyBatis-Plus 提供的 @TableLogic
注解来标记逻辑删除的字段。这个注解告诉 MyBatis-Plus 该字段是用来表示数据是否被逻辑删除的。
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
@TableId
private Long id;
private String username;
@TableLogic
private Integer deleted; // 逻辑删除字段
}
在上面的代码中,deleted
字段被注解为 @TableLogic
,表示这是一个用于逻辑删除标志的字段。当数据被删除时,这个字段的值会被设置为 1
,而未删除的记录会保持 0
。
步骤 3: 执行逻辑删除
在执行删除操作时,MyBatis-Plus 会自动将 deleted
字段的值更新为 1
,而不是物理删除该条记录。例如,执行逻辑删除操作时:
public void deleteUser(Long userId) {
User user = new User();
user.setId(userId);
user.setDeleted(1); // 逻辑删除
userService.updateById(user);
}
执行上述代码时,MyBatis-Plus 会自动更新 deleted
字段的值为 1
,而不是删除该记录。
步骤 4: 查询数据时注意逻辑删除
当查询数据时,MyBatis-Plus 会自动排除已经被逻辑删除的数据。只需要简单地调用 list()
方法,MyBatis-Plus 会根据 deleted
字段的值自动过滤已删除的数据。
public List<User> getUsers() {
return userService.list();
}
在上面的查询操作中,MyBatis-Plus 会自动过滤掉 deleted
字段为 1
的记录(即已删除的记录)。
步骤 5: 手动覆盖逻辑删除
如果你需要查询已删除的数据或覆盖默认的逻辑删除行为,可以使用 QueryWrapper
手动指定查询条件:
public List<User> getUsersIncludingDeleted() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("deleted", 0); // 查询未删除的记录
return userService.list(queryWrapper);
}
通过 QueryWrapper
,你可以灵活地控制是否需要包含已删除的数据。
小结
- 全局配置:在
application.yml
中配置全局逻辑删除字段及其对应的值。 - 实体类注解:在实体类中使用
@TableLogic
注解标记逻辑删除字段。 - 逻辑删除操作:使用 MyBatis-Plus 自动处理逻辑删除,更新
deleted
字段为1
。 - 查询过滤:MyBatis-Plus 会自动排除已逻辑删除的数据,保证查询结果的准确性。
- 手动查询:通过
QueryWrapper
可以灵活控制是否查询已删除的数据。
通过上述配置和使用,MyBatis-Plus 能够帮助我们实现简洁的逻辑删除功能,避免直接从据库中物理删除数据,确保数据的完整性。如果在使用过程中遇到其他问题,欢迎留言交流!