12. MybatisPlus的逻辑删除

798 阅读3分钟

13. MybatisPlus的逻辑删除

简介: 讲解MybatisPlus 逻辑删除配置

  • 什么是逻辑删除
很多互联网公司在数据库设计规范中都加入了逻辑删除的强制规定,运营人员可以分析和审查数据,也方便将数据沉淀下来用于商业分析
​
比如用户删除了订单,只不过是更新了标记,不会真正的物理删除。
  • 数据量过多,也会采用数据仓库,通过监听应用数据库的数据数据变化,进行迁移到数据仓库

  • MybatisPlus如何使用

    • 数据库增加deleted字段,0是未删除,1表示删除
    • 实体类增加属性配置@TableLogic 或者 在配置文件增加指定
    @TableLogic
    private Integer deleted;
    
    • 配置文件新增配置
    #删除是1
    mybatis-plus.global-config.db-config.logic-delete-value=1
    #未删除是0
    mybatis-plus.global-config.db-config.logic-not-delete-value=0
    ​
    #如果java实体类没加注解@TableLogic,则可以配置这个,推荐这里配置
    mybatis-plus.global-config.db-config.logic-delete-field=deleted
    

     

  • 验证

    • deleteById删除后就是,结果就是更新 字段
    • 查询的时候会自动拼接上deleted=0的检索条件

实践MybatisPlus的逻辑删除

1.在数据表中新建如下sql

CREATE TABLE `banner` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `img` varchar(524) DEFAULT NULL COMMENT '图片',
  `url` varchar(524) DEFAULT NULL COMMENT '跳转地址',
  `weight` int DEFAULT NULL COMMENT '权重',
  `version` int DEFAULT '1' COMMENT '乐观锁',
  `deleted` int DEFAULT '0' COMMENT '0是未删除,1是已经删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

2. 让MybatisPlus知道哪一个字段是逻辑删除的

方式一:在实体类上加 @TableLogic 注解

package com.lzh.xd_shop.model;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.io.Serializable;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh.xd_shop.model
 * @Project:xd_shop
 * @name:BannerDO
 * @Date:2023/4/1 下午3:47
 * @Filename:BannerDO
 * @Description:BannerDO
 * @Version:1.0
 */
@Data
@TableName("banner") // 表名映射,mybatisplus必须加
public class BannerDO implements Serializable{

    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    private String img;
    private String url;
    private Integer weight;

    /**
     * 逻辑删除标识
     */
    @TableLogic
    private Integer deleted;

    /**
     * 乐观锁版本号
     */
    @Version
    private Integer version;
}

方式2:在application.properties 配置

#删除是1
mybatis-plus.global-config.db-config.logic-delete-value=1
#未删除是0
mybatis-plus.global-config.db-config.logic-not-delete-value=0
#如果java实体类没加注解@TableLogic,则可以配置这个,推荐这里配置
mybatis-plus.global-config.db-config.logic-delete-field=deleted

则对应的实体类中字段deleted就不要加@TableLogic注解~

package com.lzh.xd_shop.model;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.io.Serializable;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh.xd_shop.model
 * @Project:xd_shop
 * @name:BannerDO
 * @Date:2023/4/1 下午3:47
 * @Filename:BannerDO
 * @Description:BannerDO
 * @Version:1.0
 */
@Data
@TableName("banner") // 表名映射,mybatisplus必须加
public class BannerDO implements Serializable{

    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    private String img;
    private String url;
    private Integer weight;

    /**
     * 逻辑删除标识
     */
    private Integer deleted;

    /**
     * 乐观锁版本号
     */
    @Version
    private Integer version;
}

3. 编写单元测试

删除之前的数据表id=14的记录

image.png

@Test
@DisplayName("banner-MyBatisPlus逻辑删除的使用")
public void test22() throws Exception {
    int rows = bannerMapper.deleteById(14);
    log.info("受影响的行数:{}",rows);
}

image.png

可以在控制台打印的sql发现,如果配置逻辑删除字段,则会在sql语句中自动拼接AND deleted = 0 数据表里id=14的那条记录deleted字段现在由0更新为1

image.png

设置好逻辑删除字段,根据id查询记录的sql是怎么样的呢 ?

以下是测试用例:根据id查询记录

@Test
@DisplayName("banner-MyBatisPlus逻辑删除后的验证:根据id查询数据")
public void test23() throws Exception {
    BannerDO bannerDO = bannerMapper.selectById(14);
    log.info("bannerDO:{}",bannerDO);
}

在根据id查询记录的时候,sql会默认拼接AND deleted = 0

image.png

好了本期就到这里,mybatisPlus是连载文章,欢迎订阅我的专栏。