首页 > 其他分享 >SpringBoot 集成 MybatisPlus 八——插件

SpringBoot 集成 MybatisPlus 八——插件

时间:2023-04-13 23:33:33浏览次数:37  
标签:插件 5.3 MybatisPlus SpringBoot 更新 全表 version 数据

1 Mybatis插件机制

Mybatis插件是对 Executor、StatementHandler、ParameterHandler、ResultSetHandler 这四个接口上的方法进行拦截,利用JDK动态代理机制,为这些接口的实现类创建代理对象,在执行方法时,先去执行代理对象的方法,从而执行自己编写的拦截逻辑。

  • Executor

MyBatis的内部执行器,负责调用StatementHandler操作数据库,并把结果集通过ResultSetHandler进行自动映射。

  • StatementHandler

MyBatis直接调用数据库执行SQL脚本的对象。

  • ParameterHandler

MyBatis实现SQL入参设置的对象。

  • ResultSetHandler

MyBatis把ResultSet集合映射成POJO的接口对象。

2 MybatisPlus常用插件

MybatisPlus依据Mybatis插件机制,为我们提供了更多工作中常用的插件。

常用插件,以下插件均实现了 InnerInterceptor 接口:

自动分页 PaginationInnerInterceptor

防止全表更新与删除 BlockAttackInnerInterceptor

乐观锁 OptimisticLockerInnerInterceptor

3 分页插件

在之前使用 mapper模式 及 ActiveRecord 模式进行分页查询时,都使用了配置类中配置分页插件的方式,实现分页查询功能。

SpringBoot 集成 MybatisPlus 八——插件_字段

首先根据查询条件,查询出所有符合条件的记录总数;

==>  Preparing: SELECT COUNT(*) AS total FROM user WHERE (remark LIKE ?)

==> Parameters: %老师%(String)

<==    Columns: total

<==        Row: 5

<==      Total: 1

然后根据开发人员在程序中设置的分页条件,在 SQL 语句末尾使用 limit 语句实现分页查询。

==>  Preparing: SELECT id,username,gendar,remark FROM user WHERE (remark LIKE ?) LIMIT ?,?

==> Parameters: %老师%(String), 2(Long), 2(Long)

<==    Columns: id, username, gendar, remark

<==        Row: 10, 张三, 女, 体育老师

<==        Row: 11, 刘能, 男, 演讲老师

<==      Total: 2

4 防止全表更新与删除插件

插件的作用:

分析删除和更新语句,防止因误操作而对全表进行更新或删除制作。

在配置类或启动类中,配置防止全表更新及删除插件。

SpringBoot 集成 MybatisPlus 八——插件_乐观锁_02

创建测试方法验证效果,删除全表所有记录:

SpringBoot 集成 MybatisPlus 八——插件_数据_03

程序执行后报错如下,全表删除失败:

SpringBoot 集成 MybatisPlus 八——插件_数据_04

5 乐观锁插件

5.1 什么是锁

我们在对数据库中的数据进行修改时,为了避免被多人同时修改,最佳的处理办法是对该条数据进行加锁从而防止被并行访问。

5.2 锁的分类

SpringBoot 集成 MybatisPlus 八——插件_乐观锁_05

  • 悲观锁

悲观锁是对数据被外界修改持保守态度。在整个数据处理过程当中,将数据处于锁定状态。通常依靠数据库提供的锁机制。

A/B用户同时访问数据表同一条记录时,如果A先到,数据将被锁定,A访问结束后B才能访问数据并进行相应操作。

  • 乐观锁

在访问数据时,并不会进行限制,只有在数据进行提交更新时,才会正式对数据的冲突进行检测,如果冲突,就会返回异常信息。

A/B用户同时访问数据表同一条记录时,不会锁定数据,如果A先提交修改后,B再进行提交,此时会对数据进行冲突检测,如果B提交的修改比当前最新数据老,则不允许提交。

5.3 MybatisPlus乐观锁插件

5.3.1 实现方式

从数据库取出记录时,获取当前数据的版本;

执行更新时,会对原来读取的版本与数据当前版本进行比较,如果一致就执行更新;

更新成功后,数据版本号增加。

5.3.2 设置乐观锁

在配置类中添加乐观锁

SpringBoot 集成 MybatisPlus 八——插件_字段_06

5.3.3 修改数据表

因乐观锁中使用了版本即 version 字段,需要修改数据表,在其中添加 version 字段,并设置默认值0:

SpringBoot 集成 MybatisPlus 八——插件_字段_07

5.3.4 修改实体类

在实体类中,增加 version字段,并使用注解 @Version 修饰:

SpringBoot 集成 MybatisPlus 八——插件_乐观锁_08

5.3.5 乐观锁测试

在修改数据时,需要设置version值,该值需要与数据库中version字段值一致才能更新成功。

SpringBoot 集成 MybatisPlus 八——插件_数据_09

执行后在控制台可以看到输出如下内容

==>  Preparing: UPDATE user SET username=?, version=? WHERE id=? AND version=?

==> Parameters: 赵敏(String), 1(Integer), 12(Integer), 0(Integer)

<==    Updates: 1

数据更新成功后,version值自增。

SpringBoot 集成 MybatisPlus 八——插件_乐观锁_10

需要注意的是:

如果不对version进行显示设置时,该值默认为0,当数据库中version字段大于0时,将会更新失败;

如果对version字段的设置,与数据库中对应记录的version字段数值不一致,都会更新失败。

SpringBoot 集成 MybatisPlus 八——插件_字段_11

标签:插件,5.3,MybatisPlus,SpringBoot,更新,全表,version,数据
From: https://blog.51cto.com/u_113754/6188711

相关文章

  • MyBatisPlus解决逻辑删除与唯一索引的兼容问题
    需求背景比如有张用户表,在插入或者更新数据的时候,我们需要用户名称(username),不能重复。我们首先考虑的是给该字段创建唯一索引createuniqueindexuni_usernameonuser(username)似乎这样就可以了,然而事情并没有那么简单。因为我们表中的数据在删除的时候不会真的的删......
  • java 处理常量字符串过长 & springboot 项目读取 resouces 文件夹下的文件内容
    长字符串起因项目里面有一长串的加密字符串(最长的万多个字符),需要拼接作为参数发送给第三方。如果我们使用枚举定义的话,idea编译的时候就会出现编译报错Error:java:常量字符串过长解决想法网上还有一个说法,说是编译器问题,修改idea工具的编译为eclipse即可......
  • SpringBoot 自定义对象映射器的使用
    SpringBoot底层默认使用Jackson进行Java实体对象与Json之间的转换,有时转换的效果并不是我们所期望的,需要进行额外的处理工作,有经验的小伙伴们,肯定遇到过下面两种典型的情况:当对象的属性是日期类型时,转换成json后的结果并不是我们想要的效果,还需要我们额外进行显示格式......
  • Edge浏览器安装广告屏蔽插件的方法
    很多小伙伴在使用电脑的时候都不喜欢被广告及弹窗所打扰,尤其是当我们在浏览网站时,经常会被各种视频广告或是弹窗广告所打扰,有时浏览器本身的设置并不能完全隔绝所有广告,这个时候我们就需要在自己的edge浏览器中安装一个屏蔽广告的插件,AdGuard插件就是一个非常好用的广告屏蔽插件,它......
  • springboot学习之四(整和mybatis)
    springboot整和mybatis    1.mapper文件开发 2.纯注解开发    https://www.cnblogs.com/fps2tao/p/13821490.html ......
  • springboot学习之三(整个redis)
     springboot整合redis1.依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2.配置#Redis配置spring.r......
  • Vue之插件的使用
    目录作用使用定义全局变量作用vue的插件的作用就是为了增强Vue,比如router,比如Vuex本质就是包含install方法的一个对象,install的第一个参数是vue,第二个及之后的参数是使用都要传递的数据,插件对象中的install方法会被vue自动调用。使用在Vue项目的src目录中创建目录plugi......
  • 老冯笔记MyBatisPlus&lombok
    1.MyBatis-Plus介绍参考资料官方指南:https://baomidou.com/pages/24112f/#特性官方配置:https://baomidou.com/pages/56bac0/GitHub:https://github.com/baomidou/mybatis-plus特点只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。只需简单配置,即可快速进行......
  • Springboot-HelloWorld
    1.引入依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version></parent><dependencies>......
  • springboot 整合 webservice服务
    目录webservice百科创建一个springboot项目并导入相关依赖编写webservice接口编写实现类发布webservice浏览器访问postman调用在前一段时间用到了webservice服务,今天整理了一下,记录下来。webservice百科WebService是一个平台独立的,低耦合的,自包含的、基于可......