在使用 MyBatis-Plus 进行查询时,MyBatis-Plus 的逻辑删除功能可以自动将被逻辑删除的数据排除在查询结果之外。但在某些情况下,我们可能需要查询已被逻辑删除的数据。MyBatis-Plus 提供了灵活的方式来实现这一需求,特别是使用 @Select 注解时。
1. 逻辑删除简介
逻辑删除是指通过将记录的某个标志位(如 is_deleted)设为特定值(如 1),来标识该记录已被“删除”,但数据依然保留在数据库中。与之相对的是物理删除,物理删除会直接从数据库中删除记录。
在 MyBatis-Plus 中,逻辑删除通常通过以下方式实现:
- 在实体类字段上标注
@TableLogic注解。 - 配置逻辑删除的值,如
0表示未删除,1表示已删除。
@TableLogic
private Integer isDeleted;
2. 使用 @Select 查询逻辑删除的数据
为了查询已被逻辑删除的数据,通常我们需要绕过 MyBatis-Plus 自动生成的逻辑删除过滤条件。使用 @Select 注解编写自定义 SQL 是一种直接的方法。
示例:
假设我们有一个表 user,包含一个逻辑删除字段 is_deleted,1 表示删除,0 表示未删除。
以下是查询已被逻辑删除数据的示例:
import org.apache.ibatis.annotations.Select;
import com.example.demo.entity.User;
public interface UserMapper {
// 查询已被逻辑删除的数据
@Select("SELECT * FROM user WHERE is_deleted = 1")
List<User> selectDeletedUsers();
}
解释:
@Select注解:这里我们使用@Select注解直接编写 SQL 查询,指定查询is_deleted = 1的数据。这将返回所有标记为已删除的记录。- 绕过 MyBatis-Plus 的逻辑删除机制:通过自定义 SQL 查询,跳过 MyBatis-Plus 自动添加的逻辑删除条件,从而可以查询到逻辑删除的数据。
3. 其他方案:在查询构造器中使用条件
除了 @Select 注解外,还可以在构建查询条件时动态控制逻辑删除条件。例如,在 MyBatis-Plus 的 QueryWrapper 中手动添加逻辑删除字段的判断条件。
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("is_deleted", 1); // 查询已删除的记录
List<User> deletedUsers = userMapper.selectList(queryWrapper);
这种方法适用于程序中动态构建查询的场景。
4. 注意事项
- 权限管理:允许查询逻辑删除数据的操作应加以限制,以确保数据安全。只有具备相应权限的用户应被允许执行此类查询操作。
- 避免误操作:在允许操作逻辑删除数据的同时,应注意避免误恢复或误删除数据。这可以通过加入二次确认、日志记录等机制来增强安全性。
总结
通过使用 @Select 注解自定义 SQL 查询,或在 QueryWrapper 中手动设置条件,您可以在 MyBatis-Plus 中查询到被逻辑删除的数据。为了确保系统的安全性和数据的完整性,建议在操作逻辑删除的数据时加入权限控制和防误操作机制。


