【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 未删除的数据
    @TableLogic
    private 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}
    @Test
    public 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
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //mybatis-plus的插件集合【将需要的插件加入到这个集合中即可,比如分页插件,乐观锁插件等】
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //乐观锁【版本号插件】mybatis-plus 会在更新时,每次帮助我们对比版本号字段和增加版本号+1
        mybatisPlusInterceptor.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属性
    @Version
    private Integer version;
  • 测试 正常更新
    //演示乐观锁生效场景
    @Test
    public 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快速代码生成_官方文档

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】F-logic DataCube3 任意文件上传漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

【管理咨询宝藏42】某大型银行风险预警体系规划报告

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏42】某大型银行风险预警体系规划报告 【格式】PDF版本 【关键词】战略规划、预警体系、管理咨询 【文件核心观点】 - 华信银行的风险预警在五个…

任务栏通知区域

在 Windows 操作系统中,任务栏底部右侧的区域被称为 "System Tray" 或者 "Notification Area" Notification Area - Win32 apps | Microsoft Learn The notification area provides notifications and status. Well-designed programs use the …

【Stable Diffusion】入门-03:图生图基本步骤+参数解读

目录 1 图生图原理2 基本步骤2.1 导入图片2.2 书写提示词2.3 参数调整 3 随机种子的含义4 拓展应用 1 图生图原理 当提示词不足以表达你的想法,或者你希望以一个更为简单清晰的方式传递一些要求的时候,可以给AI输入一张图片,此时图片和文字是…

动态规划:4种遍历方向图解+Python实现

前言 动态规划类题型在遍历过程中,根据状态转移函数的不同,代码实现时遍历的方向也会有所差异。总的来说,一共可以总结为下图四种模式: 红色五角星表示当前要计算的状态值;白底箭头代表哪些状态要提前算出来&#xf…

opengl程序错误,无法定位程序输入点 glewGetErrorString@4 于动态链接库

使用mingw编译器编译运行opengl程序,编译通过运行时崩溃 怀疑是之前的mingw版本编译的glew库版本不对,又重新编译一遍,还是这个错误 之后检查环境变量配置,发现有两个glew的路径,一个是msvc版的,另一个是m…

【python】flask框架的生命周期,多种查询参数的获取方式

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

裸金属租赁的意义

裸金属,这个名词听起来好“硬核”,如果对于一个新手来讲,怎么也不会将这个概念和IT行业、计算机、服务器等内容进行关联,它可能更应该是工业领域的一种产品或者物质,可真正关联到其实际概念恰恰与当前的主流行业如&…

【数据挖掘】练习2:数据管理1

课后作业2&#xff1a;数据管理1 一&#xff1a;上机实验1 # 读入数据 data("CO2") # 查看数据集CO2中的变量名称&#xff0c;并将变量Treatment的名称更改为Treat names(CO2) names(CO2)[names(CO2) "Treatment"] <- "Treat" names(CO2)…

锦意绵长,丽彩婚典

锦江丽笙酒店亮相婚博会 演绎沪上多彩浪漫情怀 &#xff08;中国上海&#xff0c;2024年3月18日&#xff09;3月16日至17日&#xff0c;2024年上海春季婚博会在上海世博展览馆举办。此次婚庆行业盛会上&#xff0c;锦江丽笙酒店旗下8家酒店联袂登场&#xff0c;凭借深厚的品牌…

软考-计算机组成系统

1.1计算机系统基础知识 1.1.1计算机系统硬件基本组成 计算机系统是由硬件和软件组成的&#xff0c;它们协同工作来运行程序。计算机的基本硬件系统由运算器、控制器、存储器、输入设备和输出设备5大部件组成。运算器、控制器等部件被集成在一起统称为中央处理单元(Central Pr…

监控微信的软件,什么软件可以监控微信聊天记录

有的老板会在后台发文&#xff1a; “能监控聊天记录么&#xff1f;” “聊天记录删除了能找回么” “监控聊天记录的安装包有吗” ...... 可见很多老板对员工的工作时的工作状态都不太放心。 针对监控微信这个事情&#xff0c;我们应该理性分析看待。 首先&#xff0c;需…

vue项目跳转html页面

1. 把html页面以及相关文件放到public文件夹下&#xff08;目的和index.html同级&#xff09; 2.在vue项目中正常写跳转事件&#xff0c;只是路径写法需要注意

在AI创业热潮下,如何抓住AI赚钱机会,实现人生逆袭

随着人工智能技术的迅猛发展,AI创业热潮正席卷全球。这不仅为科技领域的专业人士提供了无限的商机,也为普通人开辟了全新的赚钱途径。本文将为您揭示在AI创业热潮下,普通人如何抓住AI赚钱机会,实现人生逆袭,同时探讨哪些行业适合应用AI技术。 一、普通人如何抓住AI赚钱机…

【新手】win10安装nodejs V16.9.0详细教程

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

软件工程-第3章 软件需求与软件需求规约

3.1 需求与需求的获取 需求发现技术&#xff1a;自悟、交谈、观察、小组会、提炼。 3.2 需求规约SRS及其格式 3.3 本章小结

杉德支付配合调查 - 数字藏品服务

最近&#xff0c;数字收藏品平台淘派发布了一则公告&#xff0c;宣布支付通道杉德已暂停接口服务&#xff0c;以配合调查。 近期发现多个异常账户&#xff0c;涉嫌盗取他人信息和银行卡&#xff0c;利用平台从事非法交易。淘派已第一时间报警&#xff0c;协助警方追回资金(回执…

arcgis 点连接到面(以地级市图层为例)

地级市图层进行“点到面”的连接&#xff0c;并输出 在点击地级市图层&#xff0c;右击——连接和关联——连接 选择基于空间位置的另一图层数据&#xff0c;文件选择上面输出并添加的图层文件&#xff0c;进行“点到面”的连接&#xff0c;可依据新需求选择平均值&#xff0c…

状压dp·

定义&#xff1a; 状压 dp 又叫集合动态规划。是以结合信息为状态的特殊的动态规划的问题。主要有传统集合动态规划和基于连通性状态压缩的动态规划 状压dp 设计一个整型可变参数status&#xff0c;利用status的位信息&#xff0c;来表示&#xff1a; 某个样本是否还能使用…

特约撰稿 | 巴比馒头CIO周伟:2024的趋势判断与CI0的创变提升

我们将聚焦产品研发和生产运营管控&#xff0c;将市场需求与产品研发、生产过程数字化运营管控相结合&#xff0c;并持续优化。 文&#xff5c;巴比馒头CIO 周伟 排版&#xff5c;陶旖 审核&#xff5c;马向阳 全文共 3500 字&#xff0c;建议预留 15 分钟不被打扰的时间&a…