概念
什么是逻辑删除
逻辑删除:假删除。将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。
数据库实现思路:插入数据时,标记为未删除状态;查询、修改时,只获取未删除状态的数据进行操作;删除时则更新删除状态为已删除,则可实现逻辑上删除,物理上任存在数据功能。
参考阿里巴巴开发规范表达逻辑删除的字段名为 is_deleted,1 表示删除,0 表示未删除。
测试案例
1、 在表中添加is_deleted字段,并设置默认值为0,实体类添加逻辑删除字段并添加@TableLogic注解;
@TableLogic
private Integer isDeleted;
1、 在YML中配置全局逻辑删除字段;
mybatis-plus:
global-config:
db-config:
logic-delete-field: is_deleted 全局逻辑删除的实体字段名
logic-delete-value: 1 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 逻辑未删除值(默认为 0)
1、 测试逻辑删除查询;
@Test
public void selectTest() {
// ID 查询
OrderTbl orderTbl = orderTblMapper.selectById(4896);
// 分页查询
Page<Map<String, Object>> mapPage = orderTblMapper.selectMapsPage(new Page<>(1, 10), new LambdaQueryWrapper<>());
}
SQL分析: 查询都自动加上了is_deleted=0
1、 测试逻辑删除插入;
@Test
public void insertTest() {
OrderTbl orderTbl = new OrderTbl().setMoney(100).setUserId("123").setCommodityCode("PHONE");
orderTblMapper.insert(orderTbl);
}
SQL分析:插入时没有插入逻辑删除字段,但是我们数据库配置了自动生成状态0
1、 测试逻辑删除更新;
@Test
public void updateTest() {
// 查询一条记录
OrderTbl orderTbl1 = orderTblMapper.selectById(4896);
orderTbl1.setMoney(100);
// 更新
orderTblMapper.updateById(orderTbl1);
}
SQL分析:更新时,会添加is_deleted=0条件
1、 测试逻辑删除删除;
@Test
public void deleteTest() {
// 删除
orderTblMapper.deleteById(4896);
}
SQL分析:转变为更新,添加SET is_deleted=1,修改删除状态为1
1、 测试逻辑删除XML-SQL;
SQL分析:当我们在XML自定义语句时,无法自动添加逻辑删除,需要自己添加条件
注意事项
1、 只对自动注入的sql起效,XML文件中的SQL无效;
2、 逻辑删除字段支持所有数据类型(推荐使用Integer,Boolean,LocalDateTime);
3、 逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除;
4、 如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示;