mybatisplus逻辑删除方法
时间: 2025-01-29 10:17:07 浏览: 74
### MyBatisPlus 逻辑删除方法使用教程
#### 一、配置逻辑删除规则
为了启用逻辑删除功能,需先在项目中定义全局配置或实体类级别的逻辑删除字段。通常情况下,会在 `application.yml` 或者通过 Java 配置类来设置全局的逻辑删除参数[^1]。
对于大多数应用而言,可以如下方式指定:
```yaml
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1 # 被标记为已删除的数据值
logic-not-delete-value: 0 # 正常数据对应的未被删除状态值
```
如果希望针对特定表单独设定,则可以在相应的 Entity 类上添加注解 `@TableLogic` 和 `@Version` 等属性来进行细粒度控制。
#### 二、编写Entity实体类并加入逻辑删除支持
假设有一个名为 User 的用户信息表,其中包含一个用于表示记录是否已被逻辑删除的状态列 deleted。此时可在对应实体类中声明该字段,并为其加上适当注释以便理解其作用范围。
```java
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("users") // 映射到数据库中的 users 表
public class User {
private Long id;
@TableField(value="deleted", fill = FieldFill.INSERT)
private Integer deleted; // 默认值设为 0 (false),即代表此条目尚未被物理移除
}
```
注意这里设置了默认插入时填充字段 `deleted=0`,意味着新创建的对象不会被认为是已经删除过的对象。
#### 三、实现Service层接口及其具体实现
接下来就是服务层的设计部分了。一般会继承自 BaseMapper 接口所提供的基本 CRUD 功能之外再扩展一些额外的服务函数。比如下面的例子展示了如何基于上述 Users 实体构建 UserServiceImpl 类。
```java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
public boolean removeById(Long userId){
return super.removeById(userId);
}
}
```
当调用 `removeById()` 方法时,默认行为并不是真正意义上从数据库里彻底清除这条记录;而是将其 `deleted` 字段更新成之前所配置好的 “已删除”的标志位(如这里的 '1'),从而实现了所谓的软删机制。
#### 四、测试逻辑删除效果
最后一步便是验证整个流程能否正常工作了。可以通过单元测试的方式模拟实际场景下的操作过程,确保一切按预期运行良好[^2]。
```java
@Test
void testLogicalDeletion() throws Exception{
userService.removeById(4L);
List<User> userListAfterDeletion = userService.list();
Optional<User> maybeDeletedUser = userListAfterDeletion.stream()
.filter(user -> Objects.equals(user.getId(), 4L))
.findFirst();
assertTrue(maybeDeletedUser.isPresent());
assertEquals(Integer.valueOf(1), maybeDeletedUser.get().getDeleted());
}
```
以上代码片段说明即使 ID 为 4 的用户已经被 "删除",它仍然存在于查询结果集中,只不过它的 `deleted` 属性变更为 1,这正是逻辑删除的核心思想所在——保留历史痕迹的同时不影响现有业务逻辑。
阅读全文
相关推荐


















