mybatisplus中逻辑删除有什么用
时间: 2024-02-29 12:55:25 浏览: 135
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是一个基于MyBatis的代码生成器和持久层框架,它简化了数据操作,其中一个常用的功能就是实现逻辑删除。逻辑删除通常不是通过直接删除记录,而是将一个字段标记为"已删除",比如`is_delete`字段默认值为0表示正常,1表示删除。
在MyBatisPlus中,你可以通过以下步骤来处理逻辑删除:
1. **配置全局通用Mapper**:在全局配置文件(如GlobalConfig.xml)中,设置全局启用逻辑删除功能,例如:
```xml
<insert id="insertOrUpdate" parameterType="com.example.YourEntity">
INSERT INTO your_table (field1, field2) VALUES (#{field1}, #{field2})
ON DUPLICATE KEY UPDATE is_delete = #{isDelete}
</insert>
```
这里`isDelete`通常会默认传入1,如果插入新记录则什么都不做,如果更新已经存在的记录,则将其标记为已删除。
2. **实体类注解**:在你的实体类上添加`@TableLogic`注解,定义删除标志列和删除策略,如软删除:
```java
@TableLogic(
logicField = "is_delete", // 删除标志列名
deleteStrategy = LogicDeleteStrategy.REPLACE, // 删除策略:替换为0(非删除)、1(软删除)
tableName = "your_table_name" // 如果不是默认表名,需要指定
)
private Integer isDelete;
```
3. **CRUD操作**:在业务代码中,当你调用保存或更新方法时,默认会自动处理逻辑删除。如果你不想影响逻辑删除,可以显式地传入`updateEntity.setIsDelete(null)`来禁用该逻辑。
阅读全文
相关推荐















