深入解析Mybatis-Plus框架:简化Java持久层开发(十三)

news2024/12/23 1:30:48

🍀 前言

博客地址:

  • CSDN:https://blog.csdn.net/powerbiubiu

👋 简介

本章节介绍下Mybatis-Plus框架的逻辑删除功能。

📖 正文

1 逻辑删除介绍

1.1 什么是逻辑删除?

首先我们先来了解下与逻辑删除对应的物理删除。

  • 物理删除:当我们需要将某条数据进行进行删除时,都会执行delete语句,在删除成功后,数据会从我们磁盘上删除,这种就是物理删除
  • 逻辑删除:逻辑删除其实不是真正意义上的删除,而是只执行了一次更新操作。

我们实现逻辑删除时,通常的做法是在数据库表中添加一个字段is_deleted,来标识该条数据的状态,当值为0时,表示未删除,值为1时,表示删除。这样在执行查询语句的时候,就会自动带上where is_deleted = 0条件来过滤掉逻辑删除了的数据。

1.2 为什么要逻辑删除?

逻辑删除的优点:

  • 避免数据永久丢失,方便数据恢复和审计
  • 数据的挖掘价值,针对电商的订单,用户删除但后台不会删除,这样就能通过用户订单来对用户进行分析,推荐商品

逻辑删除的缺点:

  • 在查询时,效率方面会降低,因为使用逻辑删除,查询时会增加条件where is_deleted = 0

Tips:
在实际应用中,根据数据的价值,来决定是否使用逻辑删除,如果数据没有什么价值,可以进行物理删除,不仅节省磁盘空间,还能增加一定的效率。

2 逻辑删除实现

2.1 配置文件

首先在配置文件application.yml中添加Mybatis-plus配置

mybatis-plus:
  # 当mapper接口和mapper接口对应的配置文件在不在同目录下,需要进行绑定
  mapper-locations: classpath*:/mapper/**/*.xml
  global-config:
    db-config:
      # 逻辑删除配置
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
2.2 实体类

修改实体类,在实体类中逻辑删除字段添加@TableLogic注解,让该自动拥有逻辑删除功能

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@TableName("tb_role")
@ApiModel(value = "Role对象", description = "角色表")
public class Role implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty("角色id")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @ApiModelProperty("角色名称")
    private String roleName;

    @ApiModelProperty("角色编码")
    private String roleCode;

    @ApiModelProperty("描述")
    private String description;

    @ApiModelProperty("创建时间")
    private LocalDateTime createTime;

    @ApiModelProperty("更新时间")
    private LocalDateTime updateTime;

    @ApiModelProperty("删除标记(0:可用 1:已删除)")
    @TableLogic
    private Integer isDeleted;
}
2.3 测试逻辑删除

通过删除数据库中id为4的角色,测试一下执行结果

@Test
public void deleteByLogic() {
    int i = roleMapper.deleteById(4L);
    System.out.println("删除结果:" + i);
}

// 删除结果:1

实际执行的SQL

UPDATE tb_role SET is_deleted=1 WHERE id=4 AND is_deleted=0

通过执行的SQL我们可以发现,和之前章节介绍Mapper接口的deleteById方法删除执行的SQL语句是不一样的,添加的逻辑删除功能,现在删除实际执行了update的语句,并且会添加限定条件is_deleted=0,这时候我们在查询一下id为4的记录,看看查询结果

@Test
public void selectById() {
    Role role = roleMapper.selectById(4L);
    System.out.println("查询结果:" + role);
}

// 查询结果:null

实际执行的SQL

SELECT 
	id,role_name,role_code,description,create_time,update_time,is_deleted 
FROM 
	tb_role 
WHERE id=4 
AND is_deleted=0

通过结果看可以发现,id为4的角色查询返回结果为null,并且SQL执行语句也看到了添加了条件is_deleted=0

Tips:
逻辑删除的使用需要进行取舍,不能一味的全部使用逻辑删除,这样会增加无价值数据的堆积,不仅增加磁盘存储的空间,同时使用逻辑删除还增加效率问题。

💖 欢迎关注我的公众号

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1543742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教集成环信新版UIKit组件,快速构建Android应用

前言 环信新版UIKit已重磅发布!目前包含单群聊UIKit、聊天室ChatroomUIKit,本文详细讲解Android端单群聊UIKit的集成教程。 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开发的一款即时通讯 UI 组件库,提供各种组件实现会话列表、聊天界…

redis实战-黑马点评-短信登录

实现登录功能: 发送手机验证码: public Result sendCode(String phone, HttpSession session) {//获取手机号,校验手机号//如果不符合,返回错误信息if (!RegexUtils.isPhoneInvalid(phone)){//判断手机号是否有效return Result.fa…

MCGS学习——运行策略与脚本程序

语法讲解 运行策略:脚本的编程环境启动策略:在进入运行环境后首先运行的策略,只运行一次,一般完成系统初始化的处理循环策略:按照用户指定的周期时间,循环执行策略块内的内容,通常用来完成流程…

pytorch中tensor类型转换的几个函数

目录 IntTensor转FloatTensor FloatTensor转IntTensor Tensor类型变为python的常规类型 IntTensor转FloatTensor .float函数: FloatTensor转IntTensor .int函数 Tensor类型变为python的常规类型 item函数

业务问题:分析最近1周的用户行为转化

1.数据集 2.问题分析 数据部分截图样例: 其中,“行为类型”列中的值有4种,对应4种用户行为,分别是:用户对商品进行浏览、收藏、加购、购买行为。 业务场景: 地点是:公司淘宝店铺 时间范围是&a…

利泰大健康邀您莅临2024第七届燕窝及天然滋补品博览会

2024第七届世界燕窝及天然滋补品博览会 2024年8月7-9日| 上海新国际博览中心 同期举办:第三届世界滋补产业生态大会暨交流晚宴/颁奖典礼 2024第九届酵素、益生产品博览会 2024上海国际月子健康博览会 展会介绍 世界燕窝及天然滋补品展览会暨世界滋补产业生态发…

必备基础01-TypeScript

一、TypeScript W3C、菜鸟、b站都有教程 这里不多说,只是写一下基础,能看懂即可 内容来源于W3Cschool,本章整合只为以后更好查询 1.概述 TypeScript是用于应用程序规模开发的JavaScript。 TypeScript是强类型,面向对象的编译…

JavaWeb后端——HTTP协议/Tomcat

HTTP HTTP协议:无状态,对事务处理没有记忆能力。每次请求-响应都是独立的。后一次请求不会记录前一次请求数据。缺点:多次请求之间不能共享数据,优点:速度快。 HTTP协议请求报文: HTTP协议响应报文&#x…

防火墙是什么?谈谈部署Web防火墙重要性

如今,多云环境、API安全功能扩展、合作伙伴集成即时可用、可用性和可视化增强以及提高自动化程度已经成为基本要求。伴随企业应用架构的迁移,在用户端,需要在部署环境不断扩展但人员技能有限的情况下,保护数量日益增长的应用安全。…

python能做什么

python能做什么 Web开发:Python具有许多流行的Web框架,如Django和Flask,使得它成为Web开发的首选语言。它简洁、易于学习、且拥有丰富的生态系统,能够快速构建高性能的Web应用。 数据科学和机器学习:Python在数据科学…

信息系统项目管理(第四版)(高级项目管理)考试重点整理 第15章 项目风险管理(四)

博主2023年11月通过了信息系统项目管理的考试,考试过程中发现考试的内容全部是教材中的内容,非常符合我学习的思路,因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家,希望更多的人能够通过考试&a…

附近最小 单调队列 滑动窗口 蓝桥杯

q[t]i 的执行过程如下: 首先,t 的值会先自增 1。然后,新值 i 被赋给 q[t],即元素 i 被插入到数组 q 的下标为 t 的位置上。 q[t]i 的执行过程如下: 首先,i 的值被赋给 q[t],即元素 i 被插入到数…

如果碰到这样的项目,即使月薪过万也要尝试一下!2024中国创投圈重点关注项目,2024新蓝海创业项目推荐

同学小龙可以说是我们这帮人中的人生赢家了。从一个普通的大专生,自己升本成功考上了本科生。毕业在合肥磨砺了一年后,当上了采购经理,月入过万。这样的生活可以说已经是大多数人的巅峰了,但是前一段时间小龙却和家里闹了矛盾。 原…

【Leetcode】top 100 二叉树

基础知识补充 完全二叉树:顺序存储(数组) 非根节点的父节点序号floor((i-1)/2) 序号i的左孩子节点序号2*i1 右孩子节点序号2*i2 一般二叉树:链式存储 结构:left指针指向左子节点,right指针指向右子节点&am…

【OpenModelica】2 交互式使用OpenModelica-下篇

2 交互式使用OpenModelica-下篇 文章目录 2 交互式使用OpenModelica-下篇一、 Trying the system and cd Commands二、 Modelica Library and DCMotor Model三、The val() function四、Clear All Models五、VanDerPol Model and Parametric Plot六、Using Chinese or Japanese …

序列化文件与反序列化文件回顾

对要序列化的文件需要实现Serializable接口,这个接口是一个标签,虽然没有任何抽象方法。 常量serialVersionUID 设置为一个任意值,保证在Student类改变时,原先存在的student可读 实现序列化和反序列化的Test类中代码 package co…

磁钢如何空运?

航空运输具有一定的特殊性,为了保证安全,无论是人还是货物在乘机前都需要做安全检查。如果你乘机时携带了磁性材料,比如钕铁硼强磁,或者客户着急要货希望厂家发货走空运,这时候我们能不能将磁体带上飞机呢?…

JVM(二)——垃圾回收

三、垃圾回收 1、如何判断对象可以回收 1)引用计数法 定义: 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是…

UFS DMA介绍

一. Linux DMA简介 我们知道DMA是Direct Memory Access, 不需要CPU的参与,也可以直接访问内存中的数据。 CPU 虚拟地址:内核空间由于有MMU内存管理,正常使用的是虚拟地址 CPU物理地址:virtual memory system (TLB, page tables,…

vscode中导入#include “opencv2/opencv.hpp“

鼠标放到上面 点击快速修复 1.img.cpp // 图片的读取和显示 // 导入opencv头文件 #include "opencv2/opencv.hpp" #include <iostream>int main(int argc, char** argv) {// 读取图片&#xff0c;mat是matrix的缩写&#xff0c;是一个矩阵&#xff0c;类似与n…