当前位置: 首页 > news >正文

构建高效持久层:深度解析 MyBatis-Plus(02)

目录

  • 引言
  • 1. 逻辑删除
    • 1.1 概述
    • 1.2 逻辑删除的优势
    • 1.3.为什么使用逻辑删除
    • 1.4 综合案例
  • 2. 乐观锁和悲观锁
    • 2.1.什么是乐观锁和悲观锁
    • 2.2.乐观锁和悲观锁的区别
    • 2.3.综合案例
  • 3. 分页插件
  • 总结

在这里插入图片描述

引言

在现代软件开发中,数据库操作是不可或缺的一环。为了提高系统的性能、安全性以及数据一致性,开发者需要深入了解一些高级的数据库操作技术。本篇博客将深入探讨三个重要的数据库操作技术:逻辑删除、乐观锁和分页插件。通过深度讲解这些技术,读者将能够更好地应对实际项目中的复杂场景。

1. 逻辑删除

1.1 概述

MyBatis-Plus中的逻辑删除(Logical Delete)是在数据库中进行虚拟删除,即实际删除数据时,并不会将数据从数据库中删除,而是通过一个标记来记录其已被删除。这种删除方式称为逻辑删除或软删除。

1.2 逻辑删除的优势

逻辑删除相比物理删除具有以下优势:

数据恢复: 可以方便地通过修改记录的状态来实现数据的恢复,而无需进行繁琐的数据库恢复操作。

历史记录: 可以保留数据删除的历史记录,方便日后审计和分析。

1.3.为什么使用逻辑删除

当我们使用物理删除时,数据将被永久删除,无法恢复。但有些情况下,我们并不希望永久删除数据,比如用户误删除、操作失误等情况,这时逻辑删除就尤为重要。

另外,逻辑删除还可以对应业务层逻辑,将数据状态标志为“已删除”,便于后续查询和统计。同时,逻辑删除还能提高删除操作效率,减少物理删除数据对系统性能的影响。

1.4 综合案例

配置yml

    global-config:db-config:logic-delete-field: state# 全局逻辑删除的实体字段名	logic-delete-value: 1       # 逻辑已删除值(默认为 1)logic-not-delete-value: 0   # 逻辑未删除值(默认为 0)

数据表增加字段state
在这里插入图片描述
实体类添加对应的字段state(与yml的要一致!)

@TableField()private intstate;

此时使用mybatisplus删除就会把state从0变为1,之后查询只会显示未0的
在这里插入图片描述

在这里插入图片描述
id为1的state字段0改为1
在这里插入图片描述
此时id为1已经逻辑删除掉了

2. 乐观锁和悲观锁

2.1.什么是乐观锁和悲观锁

乐观锁( Optimistic Locking )悲观锁是数据库中的两种并发控制机制。

乐观锁假定数据一般情况下不会发生冲突,因此在读取数据时不会对其加锁,而是在写入时先比较数据版本号(比如时间戳)是否相同,再进行操作。如果版本号相同,则表示该数据没有被其他进程修改,可以进行写操作;如果版本号不同,则表示该数据已经被其他进程修改,写操作会失败,需要重新读取数据进行操作。

乐观锁是为了解决并发过程中数据更新冲突的问题,乐观锁能提高并发过程中的程序吞吐量。

悲观锁则假定数据会发生冲突,因此在读取数据时就会对其加锁,防止其他进程同时修改此数据,直到当前进程操作完成并解锁后,其他进程才能再次操作该数据。

2.2.乐观锁和悲观锁的区别

乐观锁悲观锁的区别主要有以下几点:

  1. 加锁时间不同:乐观锁在读取数据时不会对其加锁,而是在写入时进行比较和加锁操作;悲观锁在读取数据时就会对其加锁。
  2. 冲突处理方式不同:乐观锁会在写入时进行比较和冲突检测,如果版本号不一致则操作失败,需要重新读取数据;悲观锁则会阻塞其他进程对该数据的访问,直到当前进程完成操作并解锁。
  3. 适用场景不同:乐观锁适用于并发量比较小、数据量比较大、操作更多为读取的场景;悲观锁适用于并发量比较大、数据量比较小、操作更多为写入的场景。

总的来说,乐观锁适用于并发冲突较少的场景,可以提高系统的并发性;悲观锁适用于并发冲突较多的场景,可以保证数据的一致性和安全性。

2.3.综合案例

使用数据版本(Version)记录机制实现乐观锁,这是乐观锁最常用的一种实现方式。
在这里插入图片描述
在表中添加一个version字段,默认值为1
在这里插入图片描述
实体类上添加@Version注解

@Versionprivate Integer version;

导入插件

package com.yuan.ttx.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;// Spring Boot 方式
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mybatisPlusInterceptor;}
}

然后Controller中
在这里插入图片描述
这个是可行的,先查询在修改,然后version+1+1
在这里插入图片描述
上面代码就被乐观锁锁住了,对同一个对象操作,查询后没修改,又查询,再修改,此时Version没有进行+1,任然是2然后最后的结果是第一个成功,第二个不成功

3. 分页插件

在类中添加下面代码
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());

package com.yuan.ttx.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;// Spring Boot 方式
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());return mybatisPlusInterceptor;}
}

使用

@RequestMapping("/sel")public Object sel(Long p){Page<Book> page1 = new Page<>(p,5);Page<Book> res = iBookService.page(page1);return res.getRecords();}

第二页的数据
在这里插入图片描述

在这里插入图片描述

用QueryWrapper带条件查询分页

 @RequestMapping("/sel")public Object sel(Long p,String name){QueryWrapper<Book> wrapper = new QueryWrapper<>();wrapper.like(StringUtils.isNotEmpty(name),"bookname",name);Page<Book> page1 = new Page<>(p,5);Page<Book> res = iBookService.page(page1,wrapper);return res.getRecords();}

在这里插入图片描述

总结

通过本篇博客的学习,读者深入了解了逻辑删除、乐观锁和分页插件这三个高级数据库操作技术。逻辑删除为数据的保留和恢复提供了便捷的方式,乐观锁解决了高并发场景下的数据一致性问题,而分页插件使得处理大数据集合更为高效。在实际项目中,灵活运用这些技术将使系统更加稳健、高效。

相关文章:

构建高效持久层:深度解析 MyBatis-Plus(02)

目录 引言1. 逻辑删除1.1 概述1.2 逻辑删除的优势1.3.为什么使用逻辑删除1.4 综合案例 2. 乐观锁和悲观锁2.1.什么是乐观锁和悲观锁2.2.乐观锁和悲观锁的区别2.3.综合案例 3. 分页插件总结 引言 在现代软件开发中&#xff0c;数据库操作是不可或缺的一环。为了提高系统的性能、…...

Gitlab仓库推送到Gitee仓库的一种思路

文章目录 Gitlab仓库推送到Gitee仓库的一种思路1、创建Gitee的ssh公钥&#xff08;默认已有Gitlab的ssh公钥&#xff09;2、添加Gitlab远程仓库地址3、添加Gitee远程仓库地址4、拉取Gitlab远程仓库指定分支到本地仓库指定分支&#xff08;以test分支为例&#xff09;5、推送本地…...

快速能访问服务器的文件

1、背景 访问ubuntu上的文件 2、方法 python3 -m http.server 8081 --directory /home/ NAS 共享访问协议 — NFS、SMB、FTP、WebDAV 各有何优势&#xff1f;http://1 Ubuntu 搭建文件服务器&#xff08;Nginx&#xff09;...

Diary26-Vue综合案例1-书籍购物车

Vue综合案例1-书籍购物车 案例要求: 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…...

【EasyExcel实践】万能导出,一个接口导出多张表以及任意字段(可指定字段顺序)-简化升级版

文章目录 前言正文一、项目简介二、核心代码2.1 pom.xml 依赖配置2.2 ExcelHeadMapFactory2.3 ExcelDataLinkedHashMap2.4 自定义注解 ExcelExportBean2.5 自定义注解 ExcelColumnTitle2.6 建造器接口 Builder2.7 表格工具类 ExcelUtils2.8 GsonUtil2.9 模版类 ExportDynamicCo…...

解决 Hive 外部表分隔符问题的实用指南

简介&#xff1a; 在使用 Hive 外部表时&#xff0c;分隔符设置不当可能导致数据导入和查询过程中的问题。本文将详细介绍如何解决在 Hive 外部表中正确设置分隔符的步骤。 问题描述&#xff1a; 在使用Hive外部表时&#xff0c;可能会遇到分隔符问题。这主要是因为Hive在读…...

一文学会 Apache Zeppelin

Zeppelin资料 Zeppelin项目信息 Zeppelin官网 http://zeppelin.apache.org/Zeppelin源码地址 https://github.com/apache/zeppelinZeppelin JIRA: https://issues.apache.org/jira/projects/ZEPPELIN/summaryZeppelin文档 Flink on Zeppelin 文档集中地 https://www.yuque.co…...

ROS学习笔记(七)---参数服务器

ROS学习笔记文章目录 01. ROS学习笔记(一)—Linux安装VScode 02. ROS学习笔记(二)—使用 VScode 开发 ROS 的Python程序&#xff08;简例&#xff09; 03. ROS学习笔记(三)—好用的终端Terminator 04. ROS学习笔记(四)—使用 VScode 启动launch文件运行多个节点 05. ROS学习笔…...

【RTOS学习】源码分析(信号量和互斥量 事件组 任务通知)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;信号量和互斥量&#x1f345;创建&#x1f345;Take&#x1f345;Give &#x…...

1316:【例4.6】数的计数(Noip2001) 代码+解析

1316&#xff1a;【例4.6】数的计数(Noip2001) 【题目描述】 我们要求找出具有下列性质数的个数&#xff08;包括输入的自然数n &#xff09;。先输入一个自然数n(n≤1000)&#xff0c;然后对此自然数按照如下方法进行处理&#xff1a;不作任何处理&#xff1b;在它的左边加上一…...

征集倒计时 | 2023年卓越影响力榜单-第四届中国产业创新奖报名即将截止

第四届「ISIG中国产业智能大会」将于2024年3月16日在上海举办。2024 ISIG 以“与科技共赢&#xff0c;与产业共进”为主题&#xff0c;共设立RPA超自动化、 低代码、AIGC大模型、流程挖掘四大主题峰会。届时&#xff0c;大会组委会将颁发2023年度卓越影响力榜单—第四届中国产业…...

vue的语法模板与数据绑定的说明

vue的两大模板语法&#xff1a; 1.插值语法 2.指定语法 插值语法&#xff1a;{{}} 功能&#xff1a;用于解析标签体的内容 写法&#xff1a;{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性 指定语法&#xff1a; 功能:用于解析标签(包括:标签属性、标…...

VueCron使用方法

1&#xff09;什么是vueCron Vue Cron 是基于 Vue.js 的定时任务管理组件&#xff0c;它提供了一种简单易用的方式来设定和管理定时任务。Vue Cron 提供了一个类似于 Linux crontab 的界面&#xff0c;用户可以通过它来创建、编辑和删除定时任务。 2&#xff09;安装依赖及应…...

SpringBlade export-user SQL 注入漏洞复现

0x01 产品简介 SpringBlade 是一个由商业级项目升级优化而来的 SpringCloud 分布式微服务架构、SpringBoot 单体式微服务架构并存的综合型项目。 0x02 漏洞概述 SpringBlade v3.2.0 及之前版本框架后台 export-user 路径存在安全漏洞,攻击者利用该漏洞可通过组件customSqlS…...

结构体的一些补充知识

1、结构体后面分号前面的名字是什么意思。 在C中&#xff0c;结构体的定义格式为&#xff1a; struct <结构体名> {// 成员变量和成员函数 };在这个定义中&#xff0c;<结构体名>就是结构体的名称&#xff0c;而这个名称位于结构体定义的末尾&#xff0c;分号之前…...

20V升26V 600mA升压型LED驱动芯片,PWM调光芯片-AH1160

AH1160是一个功能强大的升压型LED驱动芯片&#xff0c;专为需要精确控制LED亮度的PWM调光应用而设计。它可将20V输入电压升压至26V&#xff0c;同时提供稳定的600mA电流输出&#xff0c;适用于各种LED照明设备。 芯片特点&#xff1a; 1. 输入电压范围&#xff1a;AH1160可在…...

如何在Go中制作HTTP服务器

引言 许多开发人员至少会花一些时间创建服务器,以便在互联网上分发内容。HTTP (Hypertext Transfer Protocol,超文本传输协议)提供了大部分这些内容,无论是请求一张猫的图片还是请求加载你正在阅读的教程。Go标准库为创建HTTP服务器以提供web内容或向这些服务器发出HTTP请求…...

Linux笔记---系统信息

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 1. uname - 显示系统信息 2. hostname - 显示或设置系统主机名 3. top - 显示系统资源使用情况 4. df - 显示磁盘空间使用情…...

最新版android stuido加上namespace

每个 Android 模块都有一个命名空间&#xff0c;此命名空间用作其生成的 命名空间由模块的 build.gradle 文件中的 namespace 属性定义&#xff0c;如以下代码段所示。namespace 最初会设为您在创建项目时选择的软件包名称。 Kotlin Groovy android {namespace "com.ex…...

Wireshark基础及捕获技巧

第一章&#xff1a;Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧&#xff1a;过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章&#xff1a;网络协议分析 2.1 网络协议分析&#xff1a;TCP、UDP、ICMP等 2.2 高级协议分析&#xff1a;HTTP…...

终极开源语音AI工具包:Sherpa-Onnx一站式解决方案

终极开源语音AI工具包&#xff1a;Sherpa-Onnx一站式解决方案 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Sup…...

会话搜索服务器实战:从架构设计到生产部署的完整指南

1. 项目概述与核心价值最近在折腾一个挺有意思的玩意儿&#xff0c;叫session_search_server。这名字乍一看有点抽象&#xff0c;但如果你做过聊天机器人、客服系统&#xff0c;或者任何需要处理多轮对话、历史记录查询的应用&#xff0c;那你肯定遇到过类似的痛点&#xff1a;…...

Navicat导入Excel实战:从数据准备到成功入库的完整避坑指南

1. 数据准备&#xff1a;Excel规范整理实战 第一次用Navicat导入Excel时&#xff0c;我对着报错提示整整折腾了两小时。后来才发现&#xff0c;90%的问题都出在数据准备阶段。就像做饭前要洗菜切配&#xff0c;数据导入前也需要做好这些准备工作&#xff1a; 字段命名要像给变量…...

量子机器学习在网络安全中的应用与性能分析

1. 量子机器学习在网络安全中的应用现状量子机器学习&#xff08;Quantum Machine Learning, QML&#xff09;近年来在网络安全领域引起了广泛关注。作为一名长期从事网络安全与量子计算交叉研究的从业者&#xff0c;我见证了这项技术从理论探讨到实际验证的发展历程。量子计算…...

经验小波变换(EWT):从理论基石到信号分解实战

1. 经验小波变换&#xff08;EWT&#xff09;的前世今生 我第一次接触EWT是在处理一段轴承振动信号时。当时用传统EMD方法分解出的IMF分量里&#xff0c;高频噪声和故障特征频率完全混在一起&#xff0c;就像把咖啡和牛奶搅成了拿铁——虽然都是白色液体&#xff0c;但根本分不…...

Qt 委托模式实战:QItemDelegate 赋能 QTableView 单元格交互控件

1. 为什么需要委托模式 在Qt开发中&#xff0c;表格视图(QTableView)是最常用的数据展示控件之一。但很多开发者都遇到过这样的困扰&#xff1a;当我们需要在表格单元格中嵌入交互控件时&#xff0c;直接调用setIndexWidget方法会导致控件始终显示&#xff0c;不仅影响界面美观…...

终极指南:如何使用qmcdump轻松解密QQ音乐加密音频文件

终极指南&#xff1a;如何使用qmcdump轻松解密QQ音乐加密音频文件 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否…...

Tarjan算法:从DFS序到强连通分量的寻路指南(附C++实战与缩点技巧)

1. 从迷宫探索到强连通王国&#xff1a;Tarjan算法的生活隐喻 想象你正在探索一座巨大的迷宫&#xff0c;手里拿着粉笔和记事本。每走到一个新的岔路口&#xff0c;你就在墙上标记数字&#xff08;第一个到的路口标1&#xff0c;第二个标2...&#xff09;&#xff0c;这就是DFS…...

深入STM32F429 LTDC双图层与DMA2D:打造流畅UI界面的性能优化指南

STM32F429 LTDC与DMA2D深度优化&#xff1a;构建60FPS工业级UI的实战指南 在工业HMI和医疗设备等对显示性能要求严苛的场景中&#xff0c;流畅的UI动画和实时数据可视化往往成为系统瓶颈。STM32F429的LTDC控制器配合DMA2D加速器&#xff0c;通过合理的架构设计可实现媲美专业GP…...

Tabletop Simulator备份神器:3分钟学会永久保存你的桌游资产

Tabletop Simulator备份神器&#xff1a;3分钟学会永久保存你的桌游资产 【免费下载链接】tts-backup Backup Tabletop Simulator saves and assets into comprehensive Zip files. 项目地址: https://gitcode.com/gh_mirrors/tt/tts-backup 还在担心辛苦创建的Tabletop…...