MyBatis-Plus逻辑删除:实战解析与优化技巧

一、MyBatis-Plus简介
MyBatis-Plus是一款基于MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus内置了多种插件,如分页插件、乐观锁插件、逻辑删除插件等,其中逻辑删除插件在项目中应用较为广泛。
二、MyBatis-Plus逻辑删除原理
1. 数据库层面
在数据库层面,逻辑删除通常是通过在表中添加一个名为`deleted`的列,该列的类型为`BIT`或`TINYINT`,用于标识数据的删除状态。当删除数据时,不是真正从数据库中删除,而是将该列的值设置为`1`,表示数据已被删除。
2. MyBatis-Plus层面
MyBatis-Plus逻辑删除插件通过自定义的SQL语句实现逻辑删除功能。在执行删除操作时,插件会自动将`deleted`列的值设置为`1`,而不是执行真正的删除操作。
三、MyBatis-Plus逻辑删除实战
1. 添加`deleted`列
在数据库表中添加一个名为`deleted`的列,类型为`BIT`或`TINYINT`,用于标识数据的删除状态。
```sql
ALTER TABLE `user` ADD COLUMN `deleted` BIT DEFAULT b'0' COMMENT '逻辑删除';
```
2. 配置MyBatis-Plus逻辑删除插件
在配置文件中添加MyBatis-Plus逻辑删除插件配置。
```java
@Configuration
public class MyBatisPlusConfig {
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setLogicDeleteValue(1);
globalConfig.setLogicNotDeleteValue(0);
globalConfig.setLogicDeleteSql("UPDATE %s SET deleted = 1 WHERE id = #{id} AND deleted = 0");
return globalConfig;
}
@Bean
public SqlInjector sqlInjector() {
return new LogicSqlInjector();
}
}
```
3. 实现逻辑删除
在实体类中添加`@TableLogic`注解,并设置`value`属性为`deleted`列的名称。
```java
@TableLogic
public class User {
private Long id;
private String name;
private Integer age;
private Boolean deleted;
// 省略getter和setter方法
}
```
在Service层中,实现逻辑删除方法。
```java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void deleteById(Long id) {
User user = new User();
user.setId(id);
user.setDeleted(true);
userMapper.updateById(user);
}
}
```
4. 查询逻辑删除数据
在查询数据时,可以通过添加条件`AND deleted = 0`来过滤掉已删除的数据。
```java
public List
return userMapper.selectList(new QueryWrapper
}
```
四、MyBatis-Plus逻辑删除优化技巧
1. 优化查询性能
在查询逻辑删除数据时,可以使用`OR deleted IS NULL`来优化查询性能,避免使用`AND deleted = 0`。
```java
public List
return userMapper.selectList(new QueryWrapper
}
```
2. 优化数据库存储
在数据库层面,可以将`deleted`列的类型改为`TINYINT(1)`,这样在存储数据时可以节省空间。
```sql
ALTER TABLE `user` MODIFY COLUMN `deleted` TINYINT(1) DEFAULT 0 COMMENT '逻辑删除';
```
3. 使用软删除代替硬删除
在项目中,建议使用软删除代替硬删除,即通过逻辑删除来管理数据的删除状态,而不是真正删除数据。这样可以避免数据丢失,方便后续的数据恢复。
五、总结
MyBatis-Plus逻辑删除插件在项目中具有广泛的应用,通过自定义SQL语句实现逻辑删除功能,简化了开发过程。在实际应用中,我们可以根据项目需求对逻辑删除进行优化,提高查询性能和数据库存储效率。






