04 MyBatisPlus之逻辑删除+锁+防全表更新/删除+代码生成插件

这篇具有很好参考价值的文章主要介绍了04 MyBatisPlus之逻辑删除+锁+防全表更新/删除+代码生成插件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 逻辑删除

1. 1 什么是逻辑删除 , 以及逻辑删除和物理删除的区别?

逻辑删除,可以方便地实现对数据库记录的逻辑删除而不是物理删除。逻辑删除是指通过更改记录的状态或添加标记字段来模拟删除操作,从而保留了删除前的数据,便于后续的数据分析和恢复。

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

1.2 逻辑删除实现:

1.2.1 数据库和实体类添加逻辑删除字段

1.2.1.1 表添加逻辑删除字段,可以是一个布尔类型、整数类型或枚举类型。用来指示是否已经逻辑删除
ALTER TABLE USER ADD deleted INT DEFAULT 0 ;  # int 类型 1 逻辑删除 0 未逻辑删除
1.2.1.2 实体类添加逻辑删除属性,属性之上增加逻辑删除注解

实体类中指定逻辑删除字段的方法
a. 单一指定

@Data
public class User {

   // @TableId
    private Integer id;
    private String username;
    private Integer age;
     @TableLogic
    // 注解之下的属性就是判断是否已经逻辑删除的状态字段
    //当删除数据时,语句自动变更为修改该列的值。默认0 未删除 1 已删除
    //查询数据时,默认只查询逻辑删除字段为0(未删除)的数据
    private Integer deleted;
}

b. 全局指定

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  1. 演示逻辑删除操作
//逻辑删除
@Test
public void testQuick5(){
    //逻辑删除
    userMapper.deleteById(5);
}

执行效果:

   JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@5871a482] will not be managed by Spring
==> Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
==> Parameters: 5(Integer)
<==    Updates: 1
  1. 测试查询数据
@Test
public void testQuick6(){
    //正常查询.默认查询非逻辑删除数据
    userMapper.selectList(null);
}

//SELECT id,name,age,email,deleted FROM user WHERE deleted=0

2 乐观锁

对数据库的并发操作可能导致一些问题:
04 MyBatisPlus之逻辑删除+锁+防全表更新/删除+代码生成插件,MyBatisPlus,spring boot

**解决思路: **

  • 悲观锁:

悲观锁的基本思想是,在整个数据访问过程中,将共享资源锁定,以确保其他线程或进程不能同时访问和修改该资源。悲观锁的核心思想是"先保护,再修改"。在悲观锁的应用中,线程在访问共享资源之前会获取到锁,并在整个操作过程中保持锁的状态,阻塞其他线程的访问。只有当前线程完成操作后,才会释放锁,让其他线程继续操作资源。这种锁机制可以确保资源独占性和数据的一致性,但是在高并发环境下,悲观锁的效率相对较低。

  • 乐观锁:

乐观锁的基本思想是,认为并发冲突的概率较低,因此不需要提前加锁,而是在数据更新阶段进行冲突检测和处理。乐观锁的核心思想是"先修改,后校验"。在乐观锁的应用中,线程在读取共享资源时不会加锁,而是记录特定的版本信息。当线程准备更新资源时,会先检查该资源的版本信息是否与之前读取的版本信息一致,如果一致则执行更新操作,否则说明有其他线程修改了该资源,需要进行相应的冲突处理。乐观锁通过避免加锁操作,提高了系统的并发性能和吞吐量,但是在并发冲突较为频繁的情况下,乐观锁会导致较多的冲突处理和重试操作。

理解点: 悲观锁和乐观锁是两种解决并发数据问题的思路,不是具体技术!!!

具体技术和方案:

  1. 乐观锁实现方案和技术:
    • 版本号/时间戳:为数据添加一个版本号或时间戳字段,每次更新数据时,比较当前版本号或时间戳与期望值是否一致,若一致则更新成功,否则表示数据已被修改,需要进行冲突处理。
    • CAS(Compare-and-Swap):使用原子操作比较当前值与旧值是否一致,若一致则进行更新操作,否则重新尝试。
    • 无锁数据结构:采用无锁数据结构,如无锁队列、无锁哈希表等,通过使用原子操作实现并发安全。
  2. 悲观锁实现方案和技术:
    • 锁机制:使用传统的锁机制,如互斥锁(Mutex Lock)或读写锁(Read-Write Lock)来保证对共享资源的独占访问。
    • 数据库锁:在数据库层面使用行级锁或表级锁来控制并发访问。
    • 信号量(Semaphore):使用信号量来限制对资源的并发访问。

介绍版本号乐观锁技术的实现流程:

  • 每条数据添加一个版本号字段version
  • 取出记录时,获取当前 version
  • 更新时,检查获取版本号是不是数据库当前最新版本号
  • 如果是[证明没有人修改数据], 执行更新, set 数据更新 , version = version+ 1
  • 如果 version 不对[证明有人已经修改了],我们现在的其他记录就是失效数据!就更新失败
3.2.2 使用mybatis-plus数据使用乐观锁
  1. 添加乐观锁拦截器
package com.sunplanter.Main
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    //将乐观锁拦截器加入大拦截器中,今后每次项目运行都会自动初始化大拦截器
    //MP会在每次更新都对比新旧版本号
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
    return interceptor;
}
  1. 实体类的乐观锁字段添加@Version注解 , 数据库添加version字段
ALTER TABLE USER ADD VERSION INT DEFAULT 1 ;  # int 类型 乐观锁字段
      - 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
      - 仅支持 `updateById(id)``update(entity, wrapper)` 方法
@Version
private Integer version;
  1. 每次更新前先查询 , 以获取旧的version,待稍后修改时对比新的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);
}

3.3 防全表更新和删除实现

针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除

添加防止全表更新和删除拦截器

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
  MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
  return interceptor;
}
}

测试全部更新或者删除

@Test
public void testQuick8(){
    User user = new User();
    user.setName("custom_name");
    user.setEmail("xxx@mail.com");
    //Caused by: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of table update operation
    //全局更新,报错
    userService.saveOrUpdate(user,null);
}

3.4 MyBatisX

3.4.1 MyBatisX生成基础项目结构

04 MyBatisPlus之逻辑删除+锁+防全表更新/删除+代码生成插件,MyBatisPlus,spring boot

3.4.1 MyBatisX生成SQL语句

MP能负责生成在xxxmapper接口中根据提示写下SQL语句 , 而后ALT+回车选择MPX生成插件,就可以在xxxMapper.xml中生成SQL代码文章来源地址https://www.toymoban.com/news/detail-807593.html

到了这里,关于04 MyBatisPlus之逻辑删除+锁+防全表更新/删除+代码生成插件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatisPlus代码生成器使用

    无侵入 :只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小 :启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 强大的 CRUD 操作 :内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,

    2024年02月03日
    浏览(57)
  • MybatisPlus 超好用的idea代码生成插件,及使用详解

    文章目录 前言 一、MybatisPlus简介 二、MybatisPlus 代码生成插件 1.插件安装与配置 2.生成代码结构、内容展示 3.表新增字段,重新生成实体类覆盖  总结 新需求来了,又添加了好几张表,总不能手写或者复制之前的代码,再一通修改吧?! 一张表需要添加好几个新字段,往实体

    2024年01月24日
    浏览(41)
  • Java在线代码生成工具,支持JPA、Mybatis、MybatisPlus

    【Java代码生成神器】自动化生成Java实体类、代码、增删改查功能!点击访问 推荐一个自己每天都在用的Java代码生成器!这个网站支持在线生成Java代码,包含完整的ControllerServiceEntityDao代码,完整的增删改查功能! 还可以自定义自己的代码模板、自由配置高级选项,指定

    2024年02月19日
    浏览(42)
  • MybatisPlus------MyBatisX插件:快速生成代码以及快速生成CRUD(十二)

    MyBatisX插件是IDEA插件,如果想要使用它,那么首先需要在IDEA中进行安装。 搜索\\\"MyBatisX\\\",点击Install,之后重启IDEA即可。 之后就可以在Mapper接口中,看到红色小鸟的标识,点击这个红色小鸟,会自动找到对应mapper.xml文件,以及文件中的方法。可以说十分方便。 在mapper.xml文件

    2024年02月04日
    浏览(42)
  • IDEA集成EasyCode插件,快速生成自定义mybatisplus代码

    在idea插件中,搜索EasyCode插件,下载并进行安装。  easyCode插件可以修改作者名称,即生成代码后,注释中自动添加相应作者的姓名。  Type Mapper指的是生成mapper.xml文件中数据库中的字段和java中代码的字段以及生成mybatis数据之间的类型转换。最常见的形式如下,也就是java中的

    2024年02月06日
    浏览(42)
  • EasyCode代码生成插件-模板分享(基于数据表生成MyBatisPlus格式的dao,service,controller和vue组件)

    目录 概述 使用演示 模板代码    实体类pojo   表现层controller 业务层service接口  业务层serviceImpl实现类 持久层dao Vue组件    本片博客用于分享EasyCode的自定义模板(模板在篇末),用于简化开发,免去重复性的工作。 作用: 1.根据数据库表,后端生成基于MyBatisPlus结构下的

    2024年02月10日
    浏览(56)
  • idea 插件 Easy Code 自定义 MybatisPlus 模板一键快速生成所需代码

    之前无意中了解到了 idea 中的 Easy Code 插件,说是能快速生成 entity 、mapper、service、controller 等文件,避免很多简单重复性的创建工作,大大提高 MySQL 增删改查的开发效率。 正好今天要做对 MySQL 的增删改查,想着试试这个插件,没想到,特别好用,但也需要自己定制,所以就

    2023年04月20日
    浏览(52)
  • 【postgresql 基础入门】update命令与delete命令,表达式作为值,带筛选条件的删除,避够清空全表

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 个人主页 :我的主页 管理社区 :开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 已经存储在数据库中的数据,在日常使用过程中,在现实当中一些数据已经发生了变化,相应的我们需

    2024年04月14日
    浏览(42)
  • MyBatisPlus连接SQL Server代码自动生成报com.microsoft.sqlserver.jdbc.SQLServerException: 列名 ‘TABLE_NAME‘ 无效

    列名TABLE_NAME?表单里并没有这个字段,推测是代码生成器在读取输入表单内容的时候自己拼凑了SQL语句,遇到SQL Server的时候语句出了问题。刚好做上一个项目时试过自动生成SQL Server的数据库表单代码,上一次可以正常生成,而偏偏这次出了问题。 首先想到mybatis-plus和mybat

    2024年02月12日
    浏览(46)
  • DAY08_MyBatisPlus——入门案例&标准数据层开发CRUD-Lombok-分页功能&DQL编程控制&DML编程控制&乐观锁&快速开发-代码生成器

    问题导入 MyBatisPlus环境搭建的步骤? 1.1 SpringBoot整合MyBatisPlus入门程序 ①:创建新模块,选择Spring初始化,并配置模块相关基础信息 ②:选择当前模块需要使用的技术集(仅保留JDBC) ③:手动添加MyBatisPlus起步依赖 注意事项1:由于mp并未被收录到idea的系统内置配置,无法直

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包