mybatisplus中逻辑删除有什么用
时间: 2024-02-29 22:55:25 浏览: 124
Mybatis-plus中的逻辑删除是指在数据库中不直接删除数据,而是在数据表中新增一个字段(如is_deleted),用于标识数据是否被删除。当执行删除操作时,只是将该字段的值进行修改,而不是将该数据从数据库中直接删除,这样做的好处是能够保留数据的完整性和可追溯性,方便后续的数据分析和处理。
逻辑删除的优点在于:可以减少数据的物理删除,避免误删重要数据,提高系统的可靠性;可以方便地进行数据恢复和审计;可以减轻数据库负担,提高数据库性能等。同时,逻辑删除也可以方便地实现历史数据查询和管理,符合数据保留的合规要求。
在Mybatis-plus中,逻辑删除可以通过注解@TableLogic实现。该注解可以标记在实体类的属性上,表示该属性为逻辑删除字段。同时,还可以通过配置全局逻辑删除属性、自定义逻辑删除 SQL 等方式灵活使用逻辑删除功能。
相关问题
mybatisplus使用逻辑删除
### 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("无匹配项...");
}
```
这样即使全局设置了忽略状态为 “已删除”的条目也能灵活应对特殊情况的需求。
---
mybatisplus查询逻辑删除
标记为已删除的数据在 Mybatisplus 中是不会自动查询出来的,需要在查询时手动添加查询条件。
下面是一个示例 Mybatisplus 代码,其中 `@TableLogic` 注解用于标记逻辑删除字段,`eq` 方法用于添加条件:
```java
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public List<User> getUserList() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", 1).eq("is_deleted", 0); //添加查询条件
List<User> userList = baseMapper.selectList(queryWrapper);
return userList;
}
@Override
public void deleteUser(Long userId) {
User user = new User();
user.setUserId(userId);
user.setIsDeleted(1); //将 is_deleted 字段设置为 1 表示已删除
baseMapper.updateById(user);
}
//...
}
```
注意,`is_deleted` 字段不一定就是这个名字,需要根据实际情况进行调整。
阅读全文
相关推荐















