MybatisPlus的逻辑删除

逻辑删除是什么呢?

比如,有一个订单商品,这个订单商品,它有价格,并且在这一年或者一月的时间中销售出去过几次,但是由于该商品不怎么热卖,你要把该商品下架删除,但是我们要在每月或者每年的时间末尾进行一次销售金额月结或者年结,那么就需要该商品这个月或者今年被销售过出去几次,得到多少的收益,进行一次结算,那么此时我们将这个商品删除了,那么不就是得不到这个数据吗。

而这个逻辑删除就是将一个商品伪删除,也就是说不删除该数据,而是为该数据添加一个状态,而这个状态就是决定该商品是否上架或者下架。

使用逻辑删除的好处

  • 避免删除数据时造成数据的永久丢失。
  • 可以有效地避免高数据的恢复效率。
  • 可以更加安全地进行删除操作,确保数据的准确性。
  • 可以通过恢复软删除的数据,还原误删的数据,避免误删操作带来的损失。

具体的看实现代码

创建一个数据库为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

反之,将数据的删除设置为逻辑删除,可以提供一种更加灵活、高效、安全的删除方式,同时避免本地数据与线上数据不一致,以及避免误删除等问题。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值