MyBatis-Plus 逻辑删除:深度解析与实际应用技巧

在Java开发中,数据删除是一个常见且重要的操作。然而,直接删除数据可能会导致数据丢失,影响数据的完整性。为了解决这个问题,MyBatis-Plus 提供了逻辑删除功能。本文将深入解析 MyBatis-Plus 逻辑删除的原理、实现方式以及实际应用技巧。
一、MyBatis-Plus 逻辑删除原理
MyBatis-Plus 逻辑删除的核心思想是通过在数据库表中添加一个名为 `deleted` 的字段,用于标识数据是否被删除。当删除数据时,并不是真正删除数据,而是将 `deleted` 字段的值设置为 `1`,表示数据被逻辑删除。当查询数据时,可以通过添加相应的条件来过滤掉被逻辑删除的数据。
二、MyBatis-Plus 逻辑删除实现方式
1. 添加 `deleted` 字段
在数据库表中添加一个名为 `deleted` 的字段,字段类型为 `INT`,默认值为 `0`。该字段用于标识数据是否被删除。
```sql
ALTER TABLE `user` ADD COLUMN `deleted` INT(1) DEFAULT '0' COMMENT '逻辑删除标识';
```
2. 修改实体类
在实体类中添加 `deleted` 字段,并指定其注解为 `@TableLogic`。
```java
@TableLogic
public class User {
// ... 其他字段 ...
private Integer deleted; // 逻辑删除标识
}
```
3. 修改 Mapper 接口
在 Mapper 接口中添加 `deleteById` 和 `deleteBatchIds` 方法,用于逻辑删除数据。
```java
@Mapper
public interface UserMapper {
@Update("UPDATE user SET deleted = 1 WHERE id = #{id}")
int deleteById(Long id);
@Update("UPDATE user SET deleted = 1 WHERE id IN")
int deleteBatchIds(@Param("ids") List
}
```
4. 修改 Service 层
在 Service 层中调用 Mapper 接口进行逻辑删除。
```java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void deleteById(Long id) {
userMapper.deleteById(id);
}
public void deleteBatchIds(List
userMapper.deleteBatchIds(ids);
}
}
```
5. 修改 Controller 层
在 Controller 层中添加逻辑删除接口。
```java
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@DeleteMapping("/delete/{id}")
public ResponseEntity> deleteById(@PathVariable Long id) {
userService.deleteById(id);
return ResponseEntity.ok().build();
}
@DeleteMapping("/delete/batch")
public ResponseEntity> deleteBatchIds(@RequestParam List
userService.deleteBatchIds(ids);
return ResponseEntity.ok().build();
}
}
```
三、MyBatis-Plus 逻辑删除实际应用技巧
1. 优化查询性能
在查询数据时,可以通过添加 `WHERE deleted = 0` 条件来过滤掉被逻辑删除的数据,从而提高查询性能。
```java
List
```
2. 恢复被逻辑删除的数据
当需要恢复被逻辑删除的数据时,可以将 `deleted` 字段的值设置为 `0`。
```java
@Update("UPDATE user SET deleted = 0 WHERE id = #{id}")
int restoreById(Long id);
```
3. 清理被逻辑删除的数据
当数据不再需要时,可以将被逻辑删除的数据真正删除,以释放数据库空间。
```java
@Delete("DELETE FROM user WHERE deleted = 1")
int cleanDeletedData();
```
四、总结
MyBatis-Plus 逻辑删除是一种简单、高效的数据删除方式。通过添加 `deleted` 字段,可以在不影响数据完整性的前提下实现数据的逻辑删除。在实际应用中,可以根据需求调整逻辑删除的实现方式,以适应不同的业务场景。






