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的记录
@Test
@DisplayName("banner-MyBatisPlus逻辑删除的使用")
public void test22() throws Exception {
int rows = bannerMapper.deleteById(14);
log.info("受影响的行数:{}",rows);
}
可以在控制台打印的sql发现,如果配置逻辑删除字段,则会在sql语句中自动拼接AND deleted = 0
数据表里id=14的那条记录deleted字段现在由0更新为1
设置好逻辑删除字段,根据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
好了本期就到这里,mybatisPlus是连载文章,欢迎订阅我的专栏。