来,我教你怎么优雅删除数据
学习要求
良好的java基础, 熟悉SpringBoot框架,熟悉Mybatis框架
教学目标
了解并掌握MyBatis-Plus 逻辑删除
视频教程
概念
实际开发中,数据删除一般有2种选择:
1:物理删除
物理删除,也称为硬删除,指的是数据直接从数据库中移除,对应的SQL语句:DELETE FROM 表 where 条件,这种删除成功后,数据就无法再恢复啦。
2:逻辑删除
逻辑删除,也称为软删除,数据并没有真正删除,而是通过设置数据状态是否可显示,后续查询进行状态过滤,从而隐藏数据显示以达到删除对应的效果。比如:设置is_delete 数据状态, 0表示正常, 1表示删除。 后续的查询sql 加上 where is_delete = 0 就可以过滤删除的数据。
一般开发选用的是逻辑删除,原因有2方面,一是项目数据非常重要不能随意删除,一是项目运行产生数据一般不会是独立,它可能会通过外键形式与其他数据产生关联,如果贸然删除该数据会引起系统不稳定,甚至异常。
举个例子:比如一个用户注册之后,进行发帖,留言,点评,收藏点赞等一些操作,会在系统相关表留下该用户相关信息,如果用户销户,使用物理删除方式删除该用户数据,那么之前与用户产生关联数据表都出现脏数据啦,这很可能导致系统bug。
局部逻辑删除
MyBatis-Plus支持逻辑删除,分别是:局部逻辑删除,全局逻辑删除
具体实现步骤如下:
步骤1:在employee表添加一个del列,类型是int
步骤2:修改Employee实体类
public class Employee {
//省略其他字段
@TableLogic(value = "1", delval = "0")
private int del;
}
@TableLogic
作用:逻辑删除注解,一般开发不建议硬删除数据(从数据库删除),建议使用软删除(数据不删除仅仅改数据状态,列表时做数据过滤)
核心属性:value, delval
value:表示未删除的数据状态
delval:表示删除之后的数据状态
步骤3:测试
@Test
public void testDelete(){
employeeMapper.deleteById(1L);
}
原先删除语法被转行成更新语法:
UPDATE employee SET del=0 WHERE id=? AND del=1
普通列表查询
@Test
public void testselectById(){
Employee employee = employeeMapper.selectById(1L);
}
执行SQL
SELECT id,name,password,email,age,admin,dept_id FROM employee WHERE id=? and del = 1
上面操作属于局部逻辑删除,针对是Employee对象,如果其他表也需要逻辑删除怎办?可以全局逻辑删除
全局逻辑删除
步骤1:在employee表添加一个del列,类型是int
步骤2:修改Employee实体类
public class Employee {
//省略其他字段
//@TableLogic(value = "1", delval = "0")
//此处不需要配置注解,在全局配置文件直接指定
private int del;
}
步骤3:配置主配置文件:application.yml
mybatis-plus:
global-config:
db-config:
logic-delete-field: del # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
如果是application.properties文件
# 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
mybatis-plus.global-config.db-config.logic-delete-field=del
# 逻辑已删除值(默认为 1)
mybatis-plus.global-config.db-config.logic-delete-value=1
# 逻辑未删除值(默认为 0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0
步骤4:测试
跟之前操作一样。
全局逻辑删除需要注意,必须在所有表上统一加上del字段,要不无法实现。
相关文章
- 结合重复数据删除和Rowhammer的攻击怎么解?
- 大数据对未来市场营销的影响
- 微信聊天记录删除怎么恢复?iOS安卓数据迁移
- 在已有的数据的表中添加自增列
- Mysql怎么删除某表中的一条数据
- 重新装Mysql后原来数据的恢复办法:即一个版本的mysql的data文件夹下的所有的数据,怎么去加载到另一个安装的mysql中
- 数据的价值是提升业务而不仅仅是用户画像
- 面试官:给你几分钟,怎么快速处理完 30 亿条数据??我懵了。。
- 面试官:说下你公司系统怎么设计防重复数据的?架构师必问!
- 105.SQLAlchemy数据的排序
- 大数据产业正处在蓬勃发展的孕育期与机遇期
- 大数据与云计算和物联网之间的关系
- 大数据爆炸时代 企业云存储该怎么玩?
- 大数据时代下 你搞清楚市场营销该怎么做了么
- php的curl获取https加密协议请求返回json数据进行信息获取
- thinkphp5 数据库查询之paginate: 同时获取记录总数和分页数据
- MySQL 处理海量数据时的一些优化查询速度方法
- 重金属行业B2B电商网站平台:打破数据孤立状态,提升行业效益
- Java EE数据持久化框架mybatis练习——获取id值为1的角色信息。
- 基于Apache doris怎么构建数据中台(二)-数据中台建设内容
- SQL将一个数据库中的数据复制到另一个数据库中
- MySQL添加数据时生成长串随机主键id
- fiddler窜改数据rule method匹配技巧一
- U盘不小心格式化了数据怎么恢复教程
- oracle怎么查询重复的数据
- kettle 数据提取效率提升
- U盘数据丢失了怎么免费恢复教程-快速有效
- 怎么使用可视化数据库工具 DBeaver 在账单类型 type 表里添加数据?
- 大数据面试题(五):Hadoop优化核心高频面试题
- 大数据必学语言Scala(十一):基础语法学习 方法参数