小书MybatisPlus第8篇-逻辑删除实现及API细节精讲
时间:2022-07-25
本文章向大家介绍小书MybatisPlus第8篇-逻辑删除实现及API细节精讲,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文为Mybatis Plus系列文章的第8篇,前7篇访问地址如下:
- 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查
- 小书MybatisPlus第2篇-条件构造器的应用及总结
- 小书MybatisPlus第3篇-自定义SQL
- 小书MybatisPlus第4篇-表格分页与下拉分页查询
- 小书MybatisPlus第5篇-Active Record模式精讲
- 小书MybatisPlus第6篇-主键生成策略精讲
- 小书MybatisPlus第7篇-代码生成器的原理精讲及使用方法
一、物理删除与逻辑删除
- 物理删除:指文件存储所用到的磁存储区域被真正的擦除或清零,这样删除的文件是不可以恢复的,物理删除是计算机处理数据时的一个概念。如果在数据库中直接使用delete、drop删除了表数据,如果没有备份的话,数据就很难恢复了。
- 逻辑删除(软删除):逻辑删除就是对要被删除的数据打上一个删除标记,通常使用一个deleted字段标示行记录是不是被删除,比如该数据有一个字段deleted,当其值为0表示未删除,值为1表示删除。那么逻辑删除就是将0变成1。在逻辑上是数据是被删除的,但数据本身是依然存在的。
两者的优劣:
- 物理删除一定程度上删除了“无用”的数据,降低了表的数据量,对性能肯定是有好处的;但是如果没有备份的话,数据很难恢复。也无法对历史数据进行数据分析。
- 逻辑删除恢复的话只要修改ideleted等类似的状态标示字段就可以了,但是表的数据量肯定会比物理删除增加了,并且查询时经常要考虑到deleted字段,对索引都会有影响。
所以一张表的数据是否采用逻辑删除,还要根据数据的重要性、数据量、查询性能以及业务需求等因素综合判断。
二、逻辑删除实现
- 首先为需要逻辑删除的表增加一个deleted字段作为逻辑删除字段,并且设置其默认值为0,如下:
CREATE TABLE `user` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`name` VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
`age` INT(11) NULL DEFAULT NULL COMMENT '年龄',
`email` VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
`deleted` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除标记',
PRIMARY KEY (`id`)
);
- 给数据库表对应的实体类字段上加上@TableLogic注解:
三、API使用方法
3.1.插入一条数据
插入数据的时候,不需要为deleted字段赋值
@Test
public void testInsert() {
User user = new User();
user.setName("字母哥");
user.setAge(18);
int row = userMapper.insert(user);
}
deleted采用默认值0(未删除),新插入的数据都是未删除的数据
3.2.删除一条记录:
执行如下Mybatis Plus API删除操作
userMapper.deleteById(1286797255805796354L);
查看数据库可以发现这条数据仍然存在,只不过逻辑删除字段值被设置为1:
UPDATE user SET deleted=1 WHERE id=? AND deleted=0
3.3.查询一条记录
- 当我们使用MP逻辑删除的功能之后,比如执行查询、修改的方法,MP会为我们自动加上未删除的条件。是不会查到被逻辑删除的记录:
userMapper.selectList(null);
会自动添加过滤条件WHERE deleted=0
SELECT id,name,age,email,deleted
FROM user
WHERE deleted=0
- 当我们查询数据时,查询结果不希望包含逻辑删除字段,可以加如下的注解
@TableLogic
@TableField(select = false)
private Integer deleted;
执行的SQL如下(注意查询结果不包含deleted字段):
SELECT id,name,age,email
FROM user
WHERE deleted=0
四、全局配置参数
通常在一个比较正规的管理项目中,逻辑删除字段不允许随意命名,所有表的逻辑删除字段使用相同的名称(比如:deleted)。我们可以在application.yml中添加全局配置,这样就不需要在每一个实体类上面都添加 @TableLogic注解了:
注意:当全局配置和
@TableLogic
局部配置同时存在,则以实体上注解为准,优先级更高。
#全局逻辑删除字段值
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted
默认情况下,逻辑已删除值为1,逻辑未删除值为0。我们也可以在application.yml中进行修改:
#逻辑已删除值(默认为 1)
#逻辑未删除值(默认为 0)
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
喜欢 (1)or分享 (0)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 迷你版Vue--学习如何造一个Vue轮子
- 如何用R语言绘制生成正态分布图表
- hdu 5143 NPY and arithmetic progression(暴力+思维)
- 正则表达式之简易markdown文件解析器
- 2015.CCF计算机软件能力认证试题第二题
- Codeforces Round #547 (Div. 3)A. Game 23
- Codeforces Round #547 (Div. 3)C. Polycarp Restores Permutation
- 动态规划入门_数塔问题
- Rust所有者被修改了会发生什么?
- 如何编写高质量代码
- 动态规划入门_钱币兑换问题
- Codeforces Round #547 (Div. 3)D. Colored Boots
- JavaScript 性能优化
- 优化循环的方法-循环展开
- 程序性能优化-局部性原理