mybatisplus使用逻辑删除
时间: 2025-05-14 19:56:26 浏览: 25
### MyBatis-Plus 逻辑删除的实现方法
#### 配置逻辑删除支持
为了启用 MyBatis-Plus 的逻辑删除功能,需要在项目的配置类中注册 `LogicSqlInjector` 插件。这可以通过创建一个名为 `MybatisPlusConfig` 的配置类并定义如下方法完成:
```java
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.LogicDeleteInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
// 注册逻辑删除插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new LogicDeleteInnerInterceptor());
return interceptor;
}
}
```
此部分代码实现了对逻辑删除的支持[^3]。
---
#### 数据库设计与实体映射
在数据库层面,需为每张表添加一个逻辑删除字段(通常命名为 `deleted`),其默认值为 `0` 表示未删除,而当该字段被更新为 `1` 则表示已被逻辑删除。
对应的实体类也需要标注相应的注解以告知框架哪些字段参与逻辑删除机制:
```java
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
public class UserEntity {
private Long id;
@TableField(value = "name")
private String name;
@TableLogic
private Integer deleted; // 默认值为 0 (未删除),逻辑删除后变为 1
}
```
在此处,`@TableLogic` 注解指定了当前字段是一个逻辑删除标志位[^1]。
---
#### 自动化逻辑删除操作
一旦完成了上述配置,在执行增删查改操作时即可利用 MyBatis-Plus 提供的方法简化流程。例如,要实现一条记录的逻辑删除,只需调用 `BaseMapper.deleteById()` 或者 `removeById()` 方法即可:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private BaseMapper<UserEntity> baseMapper;
public void deleteById(Long userId) {
boolean success = baseMapper.deleteById(userId);
System.out.println("删除成功:" + success); // 如果返回 true,则表明逻辑删除成功
}
}
```
这里需要注意的是,虽然表面上看起来像是物理删除的操作,但实际上它只是将对应记录的 `deleted` 字段由 `0` 修改成了 `1` 而已[^2]。
---
#### 特殊场景下的注意事项
尽管逻辑删除极大地方便了数据管理过程,但在实际应用过程中也存在一些潜在风险。例如有些开发者可能会误用逻辑删除字段去表达其他含义,从而引发混乱。因此建议针对特定业务需求单独设立额外的状态标识列而非滥用通用型逻辑删除标记[^4]。
此外还有一种情况就是当项目早期阶段并未考虑周全而导致现有架构难以调整时,可通过自定义查询条件的方式绕过默认行为限制。具体做法是在构建 QueryWrapper 对象的时候明确指定过滤规则:
```java
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("deleted", 1).eq("id", userId);
List<UserEntity> resultList = baseMapper.selectList(queryWrapper);
if (!resultList.isEmpty()) {
System.out.println("找到符合条件的结果!");
} else {
System.out.println("无匹配项...");
}
```
这样即使全局设置了忽略状态为 “已删除”的条目也能灵活应对特殊情况的需求。
---
阅读全文
相关推荐


















