滚雪球学MyBatis-Plus(09):乐观锁与性能优化

前言

在上期内容中,我们详细介绍了 MyBatis Plus 的条件构造器。通过使用 QueryWrapperLambdaQueryWrapper,我们学会了如何构建各种复杂的查询条件,并将这些条件应用于服务层和控制层。条件构造器的灵活性和强大功能,使得查询操作变得更加简洁和高效。

本期内容将重点介绍 MyBatis Plus 的乐观锁性能优化技术。乐观锁可以帮助我们在并发环境下保持数据一致性,而性能优化技术则能够显著提高应用程序的运行效率。通过本期内容,你将学会如何实现这些优化技巧,并将其应用到实际项目中。

一、乐观锁

乐观锁是一种在并发环境下处理数据一致性的机制。与悲观锁不同,乐观锁不阻塞其他事务,而是通过版本号或时间戳等机制,在数据提交时进行一致性检查,从而确保数据的一致性。

  1. 配置乐观锁插件

    • MyBatisPlusConfig 类中添加乐观锁插件配置:
      package com.example.mybatisplusdemo.config;import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;@Configuration
      public class MyBatisPlusConfig {@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}
      }
      
  2. 在实体类中添加版本字段

    • User 实体类中添加 version 字段,并使用 @Version 注解标记:
      package com.example.mybatisplusdemo.entity;import com.baomidou.mybatisplus.annotation.TableId;
      import com.baomidou.mybatisplus.annotation.TableName;
      import com.baomidou.mybatisplus.annotation.Version;
      import lombok.Data;@Data
      @TableName("user")
      public class User {@TableIdprivate Long id;private String name;private Integer age;private String email;@Versionprivate Integer version;
      }
      
  3. 测试乐观锁功能

    • UserMapperTest 中编写测试方法,验证乐观锁的效果:
      @Test
      public void testOptimisticLock() {// 查询用户User user = userMapper.selectById(1L);// 修改用户信息user.setAge(user.getAge() + 1);// 模拟另一个线程修改了同一个用户User anotherUser = userMapper.selectById(1L);anotherUser.setAge(anotherUser.getAge() + 1);userMapper.updateById(anotherUser);// 更新用户,期望失败int result = userMapper.updateById(user);assert result == 0;
      }
      
二、性能优化

性能优化是提高应用程序运行效率的重要手段。MyBatis Plus 提供了多种性能优化插件,帮助我们分析和优化 SQL 性能。

  1. 配置性能分析插件

    • MyBatisPlusConfig 类中添加性能分析插件配置:
      import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
      import org.springframework.context.annotation.Profile;@Bean
      @Profile({"dev", "test"}) // 设置 dev 和 test 环境开启
      public PerformanceInterceptor performanceInterceptor() {PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();performanceInterceptor.setMaxTime(1000); // ms,超过此设置的ms则sql不执行performanceInterceptor.setFormat(true);return performanceInterceptor;
      }
      
  2. 使用 SQL 性能分析

    • 启动项目,观察控制台输出的 SQL 语句和执行时间,确保 SQL 性能在预期范围内。
  3. 启用分页优化

    • MyBatis Plus 提供了分页优化功能,能够显著提高大数据量分页查询的性能。默认情况下,该功能是启用的,可以通过以下配置进行调整:
      mybatis-plus:configuration:optimize-mybatis-pagination: true
      
  4. 合理使用缓存

    • 使用 MyBatis 的二级缓存,可以显著提高查询性能。配置二级缓存需要在 Mapper 文件中添加缓存配置:
      <mapper namespace="com.example.mybatisplusdemo.mapper.UserMapper"><cache /><!-- 其他映射配置 -->
      </mapper>
      
  5. 索引优化

    • 确保数据库表中的查询字段都创建了合适的索引,避免全表扫描,提高查询速度。
三、在实际项目中的应用
  1. 在服务层中使用乐观锁

    • UserService 接口中定义方法:

      boolean updateUser(User user);
      
    • UserServiceImpl 类中实现方法:

      @Override
      public boolean updateUser(User user) {return updateById(user);
      }
      
  2. 在控制器中提供更新接口

    • UserController 类中编写接口,接收更新请求并调用服务层方法:
      @PutMapping("/update")
      public boolean updateUser(@RequestBody User user) {return userService.updateUser(user);
      }
      
四、总结

通过本篇文章,你已经学会了如何在 MyBatis Plus 中配置和使用乐观锁,以确保并发环境下的数据一致性。同时,我们还探讨了多种性能优化技巧,包括性能分析插件、分页优化、缓存配置和索引优化。这些知识点将帮助你在实际项目中编写更高效、更可靠的代码。

下期预告

在下一期内容中,我们将深入探讨 MyBatis Plus 的代码生成器。代码生成器能够自动生成实体类、Mapper 接口和 XML 映射文件,显著提高开发效率。我们将详细介绍代码生成器的配置和使用方法,并通过实例演示如何在项目中应用这些生成的代码。敬请期待!

通过本系列教程的学习,你将系统地掌握 MyBatis Plus 的各项功能,从基础到高级,从理论到实践,全面提升你的开发技能。希望你在学习过程中能够有所收获,并应用到实际项目中。让我们继续这段学习之旅吧!


http://www.ppmy.cn/news/1522726.html

相关文章

基于django的在线音乐网站设计/基于python的音乐播放系统

Django在线音乐网站设计 摘要&#xff1a;计算机网络如果结合使用信息管理系统&#xff0c;能够提高管理员管理的效率&#xff0c;改善服务质量。优秀的在线音乐网站设计能够更有效管理音乐资讯规范&#xff0c;帮助管理者更加有效管理音乐网站&#xff0c;可以帮助提高克服人工…

JavaScript 实用技巧

1. 使用 const 和 let 替代 var 在 ES6 之前&#xff0c;我们通常使用 var 声明变量。但如今&#xff0c;推荐使用 const 和 let&#xff0c;因为它们具有块级作用域&#xff0c;可以避免很多潜在的问题。 const PI 3.14; // 常量&#xff0c;无法重新赋值 let age 25; // …

misc流量分析

一、wireshark语法 1、wireshark过滤语法 &#xff08;1&#xff09;过滤IP地址 ip.srcx.x..x.x 过滤源IP地址 ip.dstx.x.x.x 过滤目的IP ip.addrx.x.x.x 过滤某个IP &#xff08;2&#xff09;过滤端口号 tcp.port80tcp.srcport80 显示TCP的源端口80tcp.dstport80 显示…

【高阶数据结构】B树、B+树、B*树

B树、B树、B*树 1. 常见的搜索结构2. B树概念3. B树的插入分析4. B树的插入实现4.1 B树的节点设计4.2 B树的部分插入实现14.3 B树的查找4.4 B树的部分插入实现24.5 插入key的过程4.7 B树的插入完整代码4.8 B树的简单验证4.9 B树的删除4.10 B树的性能分析 5. B树6. B*树7. 总结8…

gitk无法打开

1、电脑重装&#xff0c;重新安装git工具后&#xff0c;发现无法打开现有的仓库&#xff0c;报错如下&#xff1a; 搜索网上的信息&#xff0c;显示是目录下没有.git文件夹&#xff0c;但是在xshell查看文件夹是存在的。 然后进行测试git log指令发现也无法进行显示。 然后按…

网站安全问题整改

网站安全、政务云、第三方安全检测机构等评测出来的网站web安全问题整改&#xff0c;如果你也正需要做这方面&#xff0c;请联系我吧

一、selenium自动化简介selenium工具集

文章目录 一、简介二、组成部分三、selenium工具集3.1 Selenium IDE3.2 Selenium WebDriver3.3 Selenium Grid3.4 Appium 一、简介 官方网站 Selenium 是支持 web 浏览器自动化的一系列工具和库的综合项目。 它提供了扩展来模拟用户与浏览器的交互&#xff0c;用于扩展浏览器分…

ListBox等控件的SelectedItem,SelectedValue,SelectedValuePath属性详解

引言 初学WPF可能会对诸如ComboBox、ListBox等集合控件的当前选择项的绑定有所疑惑&#xff0c;控件提供了两个可绑定对象&#xff1a;SelectedItem\SelectedValue&#xff0c;同时还有DisplayMemberPath\SelectedValuePath。本节来讲述一下它们的设计意图和用法。 1、Select…

Apache POl的使用(导出报表)

介绍 Apache POl是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 PO! 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。一般情况下&#xff0c;POI都是用于操作 Excel 文件。 Apache POl的应用场景: 银行网银系统导出交…

java常用集合方法

目录 一、Iterator接口二、Iterable接口三、Collection接口四、Collection与Iterable关系 一、Iterator接口 Iterator 是一个集合迭代器接口&#xff0c;它提供了以下方法&#xff1a; 判断迭代器中是否还拥有元素&#xff0c;有则返回true&#xff0c;否则返回false boolean …

CTK框架(四): 插件编写

目录 1.生成插件 1.1.环境说明 1.2.服务类&#xff0c;纯虚类&#xff0c;提供接口 1.3.实现插件类&#xff0c;实现纯虚函数 1.4.激活插件&#xff0c;加入ctk框架的生命周期中 1.5.添加资源文件 1.6..pro文件 2.使用此插件 3.总结 1.生成插件 1.1.环境说明 编译ct…

ArcGIS Pro SDK (十二)布局 9 布局元数据与图框

ArcGIS Pro SDK (十二)布局 9 布局元数据与图框 文章目录 ArcGIS Pro SDK (十二)布局 9 布局元数据与图框1 布局元数据1.1 布局元数据2 布局地图框2.1 更改与地图框关联的地图2.2 更改地图框照相机设置2.3 将地图框缩放到单个图层的范围2.4 将地图框范围更改为多个图层中的…

iOS——Block与内存管理

需要内存管理的情况 1、对象类型的auto变量。 2、引用了 __block 修饰符的变量。 三种block类型 全局类型 &#xff08;NSGlobalBlock&#xff09; 如果一个block里面没有访问普通局部变量(也就是说block里面没有访问任何外部变量或者访问的是静态局部变量或者访问的是全局…

初识Linux · 有关gdb

目录 前言&#xff1a; 1 预备知识 2 gdb的使用 前言&#xff1a; 当我们Linux学到了这里的时候&#xff0c;我们大概会有一种感觉是&#xff0c;从VS2022转战Linux&#xff0c;写代码对我们来说是一种重新构建读写代码的一个过程&#xff0c;从文本编辑器&#xff0c;到文…

P1781 宇宙总统

[题目通道](宇宙总统 - 洛谷) #include<bits/stdc.h> using namespace std; int main() {int n,QQ; string w"";string q;cin>>n;for (int i1;i<n;i) {cin>>q;int z q.size();int x w.size();if (z>x||(z>x&&q> w)) {wq;QQ…

Vite + Vue3 +Vant4出现Toast is not a function

今天写前端的时候出现了这个问题搞了我一会 搜集原因: 1:是vant版本的问题&#xff0c;Toast()的方法是vant3版本的写法&#xff0c;而我用的是vant4&#xff0c;vant4中的写法改成了showToast()方法&#xff0c;改正过来 import {showToast} from "vant"; 发现还是…

本地部署AI大模型

mac windows 同理 用到的软件 docker ollama 大家可以到官网下载 在ollama官网选择models&#xff0c;这里面有用到的大模型 我用到的是 qwen2 &#xff0c;这个对中文比较友好 注意&#xff0c;每个模型有不同的参数版本&#xff0c;参数量越大&#xff0c;对电脑配置越高&…

flutter文本输入框使用

在Flutter中&#xff0c;实现输入框一般使用TextField&#xff0c;通过设置它的属性给输入框和内部文字设置不同的样式。 Flutter 输入框实现简单例子 import package:flutter/material.dart;class MyEditPage extends StatelessWidget {const MyEditPage({super.key});overr…

与MySQL邂逅

MySQL安装捏~ 其实每次新学一样东西&#xff0c;安装永远是一个小坎 但是小问题啦 安装MySQL要用root账户&#xff0c;安装后普通用户也可以用捏 要安装MySQL先来看第一步&#xff01; 改bug&#xff01; Centos 卸载不要的环境 先康康有木有捏&#xff1a; mariadb就是…

不小心删除了 Android 手机上的短信?3 步流程恢复误删除的短信以及图片、视频、联系人

不小心删除了 Android 手机上的短信&#xff1f;别担心&#xff0c;Android 版奇客数据恢复工具可以帮助您通过简单的 3 步流程恢复已删除的短信以及图片、视频、联系人等。 如何在 Android 上恢复已删除的短信 不小心删除了 Android 手机上的短信&#xff1f;Android 版奇客数…