说明
实际生产中的数据,一般不采用物理删除,而采用逻辑删除,也就是将一条记录的状态
改为已删除
。
逻辑删除,本质上是更新操作。
MyBatis Plus 框架,提供了逻辑删除
功能。在配置了逻辑删除
后,增删改查和统计等功能,都会使用逻辑删除字段来做相应的处理。比如,查询时会只查出未删除的数据。
使用方法
全局配置
推荐在配置文件(application.yml)中,统一配置逻辑删除的字段
和删除/未删除
状态对应的值
。
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除的实体字段名
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
实体类
在实体类中,添加删除字段 deleted
.
package com.example.web.entity;
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
private Integer deleted;
}
数据库
数据库添加删除字段。
测试类
新增
代码
@Test
public void insert() {
User user = new User();
user.setId(9L);
user.setName("赵一");
user.setAge(25);
user.setEmail("zhaoyi@example.com");
userMapper.insert(user);
}
注意
MySQL的deleted字段配置了默认值:0,则新增的数据会自动填充默认值。
如果MySQL没有配置默认值,则新增时,deleted
字段为 NULL
。
官方推荐:在数据库定义默认值。
- 配置了默认值 0,新增
- 没配置默认值,新增
删除
@Test
public void deleteById() {
userMapper.deleteById(9);
}
逻辑删除,将 deleted
字段的值改为 1
。
数据库中的数据还在,deleted的值更新了。
查询
按照 id 查询和查询全部数据,查出来的都是逻辑未删除的数据。已删除的数据是不会被查询出来的。
@Test
public void selectById() {
User user = userMapper.selectById(9);
log.info("user:{}", user);
}
@Test
void selectList() {
List<User> users = userMapper.selectList(null);
log.info("users:{}", users);
}
查询已经删除的数据,查询结果是不存在的。
在查询的SQL语句中,已经自动拼接了(deleted=0),确保数据是未被删除的。
查询全部数据,查询出来的,也是没有删除的数据。
分页查询
分页查询,也是查询出未逻辑删除的数据。
/**
* 分页查询用户列表。
* <br>
* 查询条件:查询第1页的数据,每页10条数据。
*/
@Test
void selectPage() {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
IPage<User> pageQuery = new Page<>(1, 10);
IPage<User> page = userMapper.selectPage(pageQuery, wrapper);
log.info("当前页码:{}", page.getCurrent());
log.info("每 1 页的数据量:{}", page.getSize());
log.info("总数据量:{}", page.getTotal());
log.info("总页数:{}", page.getPages());
log.info("数据列表:{}", page.getRecords());
}
统计
@Test
void count() {
Long count = userMapper.selectCount(null);
log.info("count:{}", count);
}
更新
更新数据的时候,同样会进行数据是否已经删除的判断;已经删除的数据,就不会更新了。
@Test
public void updateById() {
User user = new User();
user.setId(9L);
user.setAge(50);
user.setEmail("zhaoyi50@example.com");
userMapper.updateById(user);
}