【MyBatis-Plus】逻辑删除、乐观锁、防全表更新和删除实现 MyBatisX插件 高级扩展

文章目录

  • 一、逻辑删除实现
  • 二、乐观锁实现
    • 2.1 悲观锁和乐观锁场景和介绍
    • 2.2 具体技术和方案:
    • 2.3 版本号乐观锁技术的实现流程
    • 2.4 使用mybatis-plus数据使用乐观锁
  • 三、防全表更新和删除实现
  • 三、代码生成器(MyBatisX插件)


一、逻辑删除实现

  • 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
  • 逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录

逻辑删除实现:

  • 数据库 和 实体类 添加逻辑删除字段
    • 数据表添加逻辑删除字段
    • 可以是一个布尔类型、整数类型或枚举类型。
ALTER TABLE USER ADD deleted INT DEFAULT 0 ;  # int 类型 1 逻辑删除 0 未逻辑删除
  • 实体类添加逻辑删除属性
@Data
public class User {private Long id;@TableField(value = "nickname",exist = false)private String name;private Integer age;private String email;// 当前属性对应的列就是逻辑删除的状态字段// 当删除数据时,自动变成修改此列的属性值 默认0未删除 1删除// 查询时,默认只查询 deleted = 0 未删除的数据@TableLogicprivate Integer deleted;
}
  • 指定逻辑删除字段和属性值
    • 单一指定
      • 在实体类属性上创建属性 指定注解@TableLogic
    • 全局指定
      • yml 配置文件 添加 logic-delete-field
        1
        源码中默认值 就设置了未删除0 删除为1,可以保持默认即可。
        1
  • 测试:
    • 逻辑删除:不使用delete语句而是修改语句 update user set deleted=1 where id=#{id}
    • 物理删除:delete from user where id=#{id}
    @Testpublic void delete_test2(){userMapper.deleteById(2);}

Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
1
正常查询 : 默认查询非逻辑删除数据

二、乐观锁实现

2.1 悲观锁和乐观锁场景和介绍

需求前置:并发问题演示
1
使用乐观锁/悲观锁解决:
乐观锁悲观锁是在并发编程中用于处理并发访问资源竞争的两种不同的机制

  • 悲观锁
    • 当A在使用时,上锁了,B尝试使用被拒绝,因为上锁了
    • 只能等A用完后,解锁了,B再次去尝试使用。
  • 乐观锁
    • 当A使用,不会上锁,B可以尝试使用,但被告知已被占用,不能用
    • 区别于悲观锁 -> 乐观锁的B会反复的尝试,直到A使用完毕
  • 这两者都是解决并发数据问题思路,不是具体技术

2.2 具体技术和方案:

乐观锁:

  • 版本号/时间戳
    • 为数据添加一个版本号或时间戳字段,每次更新数据时
    • 比较当前版本号或时间戳与期望值是否一致
    • 若一致则更新成功,否则表示数据已被修改,需要进行冲突处理。
  • CAS(Compare-and-Swap)
  • 无锁数据结构
    • 无锁队列、无锁哈希表等…

悲观锁:

  • 锁机制
    • 互斥锁(Mutex Lock)或读写锁(Read-Write Lock)
  • 数据库锁
    • 数据库层面使用行级锁或表级锁来控制并发访问
  • 信号量

2.3 版本号乐观锁技术的实现流程

  • 每条数据添加一个版本号字段version
  • 取出记录时,获取当前 version
  • 更新时,检查获取版本号是不是数据库当前最新版本号
  • 如果是[证明没有人修改数据], 执行更新, set 数据更新 , version = version+ 1
  • 如果 version 不对[证明有人已经修改了],我们现在的其他记录就是失效数据!就更新失败

2.4 使用mybatis-plus数据使用乐观锁

  • 添加版本号更新插件,在springboorMain类
    1
    /*** 将 mybatis-plus 插件加入到IOC容器* @return*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){//mybatis-plus的插件集合【将需要的插件加入到这个集合中即可,比如分页插件,乐观锁插件等】MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();//乐观锁【版本号插件】mybatis-plus 会在更新时,每次帮助我们对比版本号字段和增加版本号+1mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mybatisPlusInterceptor;}
  • 数据库添加version字段
ALTER TABLE USER ADD VERSION INT DEFAULT 1 ;  # int 类型 乐观锁字段

1

  • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 仅支持 updateById(id)update(entity, wrapper) 方法
  • 实体类添加version属性
    @Versionprivate Integer version;
  • 测试 正常更新
    //演示乐观锁生效场景@Testpublic void testQuick7(){//步骤1: 先查询,在更新 获取version数据//同时查询两条,但是version唯一,最后更新的失败User user  = userMapper.selectById(5);User user1  = userMapper.selectById(5);user.setAge(20);user1.setAge(30);userMapper.updateById(user);//乐观锁生效,失败!userMapper.updateById(user1);}

先查再改:
1
1

三、防全表更新和删除实现

针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除
在这里插入图片描述

  • 添加防止全表更新和删除拦截器
        // 防止全表删除和更新拦截器mybatisPlusInterceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());

1
### Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of table update operation

三、代码生成器(MyBatisX插件)

1
1

使用mybatisX插件,自动生成sql语句实现

MyBatisX快速代码生成_官方文档

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

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

相关文章

Flink on Yarn安装配置

前言 Apache Flink,作为一个开源的分布式处理引擎,近年来在大数据处理领域崭露头角,其独特的流处理和批处理一体化模型,使得它能够在处理无界和有界数据流时展现出卓越的性能。本文旨在对Flink进行简要的前言性介绍,以…

Oracle登录错误ERROR: ORA-01031: insufficient privileges解决办法

这个问题困扰了我三个星期,我在网上找的解决办法: 1.控制面板->管理工具->计算机管理->系统工具->本地用户和组->ORA_DBA组。 但我电脑上根本找不到。 2.在oracle安装目录下找到oradba.exe运行。 最开始我都不到这个oradba.exe文件在哪…

云计算 3月11号 (NFS远程共享存储及vsftpd配置)

构建NFS远程共享存储 一、NFS介绍 文件系统级别共享(是NAS存储) --------- 已经做好了格式化,可以直接用。 速度慢比如:nfs,sambaNFS NFS:Network File System 网络文件系统,NFS 和其他文件…

(008)Unity StateMachineBehaviour的坑

文章目录 StateMachineBehaviour同名函数的调用问题StateMachineBehaviour 的 OnState*、OnStateMachine* 的区别 StateMachineBehaviour同名函数的调用问题 1.如果脚本中,两个同名的函数都存在,那么两个函数都会被调用;如果只有其中一个同名…

Maven3.6.3安装与配置,IDEA2022.2.3部署Maven操作步骤

1、先确保安装了Java开发环境,并配置了JAVA_HOME环境变量 WinR ,输入cmd,然后输入命令echo %JAVA_HOME%,查看JDK ,接着输入java -version,查看java的版本号 接着系统变量中,配置JAVA_HOME环境变量 2、官网下载MAVEN3.6.3,Maven3.…

3.14

racial a. 种族的 radiation n. 放射,放射物 railway n. 铁路;铁道 rainbow n. 虹,彩虹 raise vt. 使升高; 饲养 random a. 随意的 rank n. 职衔,军衔 rare a. 罕见的,稀有的 rat n. 老鼠 rate n./ v. 率,评…

<JavaEE> 了解网络层协议 -- IP协议

目录 初识IP协议 什么是IP协议? IP协议中的基础概念 IP协议格式 图示 4bit版本号(version) 4bit头部长度(headerlength) 8bit服务类型(TypeOfService) 16bit总长度(total l…

数据结构——循环链表,双向链表,线性表和有序表的合并详解

目录 1.循环链表 1.带尾指针循环链表的合并 代码示例: 2.双向链表 代码示例: 1.双向链表的插入 ​代码示例: 2.双向链表的删除 代码示例: 3.单链表,循环链表,双向链表时间效率的比较 4.顺序表和链…

JVM基础篇

什么是JVM java虚拟机 JVM的功能 1.解释和运行 对字节码文件中的指令,实时的解释成机器码,让计算机执行 2.内存管理 自动为对象、方法等分配内存 自动的垃圾回收机制,回收不再使用的对象(c不会自动回收,相当于降…

腾讯云轻量服务器地域选择教程以及不同地域的区别

腾讯云服务器地域怎么选择?不同地域之间有什么区别?腾讯云哪个地域好?地域选择遵循就近原则,访客距离地域越近网络延迟越低,速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素,地域节点选择…

net/http 框架源码解读

一、Hello World 使用net/http编写一个简单的web服务器, 定义了一个UserHandler的处理函数,通过HandleFunc来将路由和handler进行绑定,最后通过ListenAndServe启动web服务,后面我将handler统称为视图函数 package mainimport "net/htt…

PGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS多路视频融…

uniapp中人脸识别图片并圈起人脸

效果如上,我用的是阿里云的人脸识别。首先,我们先封装一个阿里云的请求js文件 faceRecognition.js import CryptoJS from crypto-js//SignatureNonce随机数字 function signNRandom() {const Rand Math.random()const mineId Math.round(Rand * 1000…

R语言lavaan结构方程模型(SEM)实践技术应用

基于R语言lavaan程序包,通过理论讲解和实际操作相结合的方式,由浅入深地系统介绍结构方程模型的建立、拟合、评估、筛选和结果展示的全过程。我们筛选大量经典案例,这些案例来自Nature、Ecology、Ecological Applications、Journal of Ecolog…

MySQL 数据库 下载地址 国内阿里云站点

mysql安装包下载_开源镜像站-阿里云 以 MySQL 5.7 为例 mysql-MySQL-5.7安装包下载_开源镜像站-阿里云

C#,图论与图算法,输出无向图(Un-directed Graph)全部环(cycle)的算法与源代码

1 无向图(Un-directed Graph)全部环 图算法中需要求解全部的环。 2 方法 使用图着色方法,用唯一的数字标记不同循环的所有顶点。图形遍历完成后,将所有类似的标记数字推送到邻接列表,并相应地打印邻接列表。 3 算法 将边插入到邻接列表中。调用DFS函数,该函数使用着色方…

C# wpf 使用GDI实现截屏

wpf截屏系列 第一章 使用GDI实现截屏(本章) 第二章 使用GDI实现截屏 第三章 使用DockPanel制作截屏框 第四章 实现截屏框热键截屏 第五章 实现截屏框实时截屏 第六章 使用ffmpeg命令行实现录屏 文章目录 wpf截屏系列前言一、导入gdi32方法一、NuGet获取…

解决无法登录到 ArcGIS Server Administrator

目录 问题复现原因分析解决办法 问题复现 今天在访问arcgisserver后台准备设置arcgis api for js请求路径时,登录之后出现500错误。Services Directoryhttp://xxx.xxx.xxx.xxx:6080/arcgis/admin/system/handlers/rest/servicesdirectory 原因分析 我实在两台虚拟机…

【经验分享】Windows10无法通过SSHFS连接服务器

【经验分享】Windows10如何通过SSHFS连接服务器 前言问题分析解决方法 前言 现在很多公司出于成本考虑,不会为每一台电脑都提供高配置,所以需要通过访问云服务器来进行编译等操作。程序员如果配备的是一台windows电脑,那么需要访问linux服务…

vue iview 级联选择器遇到的坑

我们PC项目用到的前端技术栈是vue+iview,最近有个需求,要做个级联选择器,并且是懒加载动态加载后端返回的数据。效果如下: 如下图所示,在我们封装的公共组件form-box.vue里有我们级联选择器: 代码如下: <!--级联选择器--><template v-else-if="item.type…