逻辑删除是什么呢?
比如,有一个订单商品,这个订单商品,它有价格,并且在这一年或者一月的时间中销售出去过几次,但是由于该商品不怎么热卖,你要把该商品下架删除,但是我们要在每月或者每年的时间末尾进行一次销售金额月结或者年结,那么就需要该商品这个月或者今年被销售过出去几次,得到多少的收益,进行一次结算,那么此时我们将这个商品删除了,那么不就是得不到这个数据吗。
而这个逻辑删除就是将一个商品伪删除,也就是说不删除该数据,而是为该数据添加一个状态,而这个状态就是决定该商品是否上架或者下架。
使用逻辑删除的好处
- 避免删除数据时造成数据的永久丢失。
- 可以有效地避免高数据的恢复效率。
- 可以更加安全地进行删除操作,确保数据的准确性。
- 可以通过恢复软删除的数据,还原误删的数据,避免误删操作带来的损失。
具体的看实现代码
创建一个数据库为product的数据库
实体类代码
package com.example.mybatisdemo3.domain;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @BelongsProject: mybatisplusdemo
* @BelongsPackage: com.demo.mybatispulso2.domain
* @Author: 云边小屋(My.Tears)
* @CreateTime: 2023-06-19 22:55
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "product")
public class Product {
/**
* 手机编号
*/
private Integer id;
/**
* 手机品牌
*/
private String title;
/**
* 手机价格
*/
private Double price;
/**
* 商品状态
*/
// 配置逻辑删除注解 该注解表示开始的默认值为1 可用状态 一旦被删除就将status自动改为0
@TableLogic(value = "1",delval = "0")
private Integer status;
}
测试代码
package com.example.mybatisdemo3;
import com.example.mybatisdemo3.mapper.ProductMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @BelongsProject: mybatisplusdemo
* @BelongsPackage: com.example.mybatisdemo3
* @Author: 云边小屋(My.Tears)
* @CreateTime: 2023-06-19 23:04
*/
@SpringBootTest
public class LogicTest {
private ProductMapper productMapper;
@Autowired
public LogicTest(ProductMapper productMapper) {
this.productMapper = productMapper;
}
/**
* 底层SQL拼接 -- >
* ==> Preparing: UPDATE product SET status=0 WHERE id=? AND status=1
* ==> Parameters: 4(Integer)
* <== Updates: 1
* 我们可以看到我们的这条数据并没有被删除
*/
@Test
void testDelete() {
productMapper.deleteById(4);
}
}
测试结果
测试结果中,我们代码是要求删除这条数据,而mybatisplus在我添加这个逻辑删除之后,它并没有替我删除这条数据,而是将这条数据的状态更改为了0
我们再来看看数据库中的是否被删除
再次测试一下,测试查询,看看mybatisplus会怎么查询
/**
* 底层Sql拼接 -- >
* ==> Preparing: SELECT id,title,price,status FROM product WHERE status=1
* ==> Parameters:
* <== Columns: id, title, price, status
* <== Row: 1, 苹果手机, 4500.00, 1
* <== Row: 2, 华为手机, 5500.00, 1
* <== Row: 3, 小米手机, 6500.00, 1
* <== Total: 3
* 我们可以看到这个查询是将 status==1的所有值全部查询出来
*/
@Test
void select(){
// 查询所有的数据
List<Product> products = productMapper.selectList(null);
products.forEach(System.out::println);
}
测试结果
设置逻辑删除的方式还可以通过全局配置来设置
mybatis-plus:
global-config:
# 去除mybatis控制台输出图标
banner: false
db-config:
# 配置逻辑删除字段
logic-delete-field: status
# 配置默认值是什么
logic-not-delete-value: 1
# 配置删除后的值改成什么
logic-delete-value: 0
反之,将数据的删除设置为逻辑删除,可以提供一种更加灵活、高效、安全的删除方式,同时避免本地数据与线上数据不一致,以及避免误删除等问题。