Mybatis-Plus的分页 乐观锁插件 通用枚举 多数据源

写在前面在这里插入图片描述🛫更多知识总结见Mybatis-Plus专栏
🚕内容总结自尚硅谷杨博超老师的视频
🚒博主对于该知识尚在学习阶段
🚄如果发现存在问题请毫不吝啬的指出
🚀🚀扎哇太枣糕的博客首页🚀🚀

文章目录

  • 分页插件
  • 乐观锁插件
  • 通用枚举类
  • 多数据源

分页插件

  MP中自带了分页插件的功能,只需要在配置类中进行简单的配置即可使用分页的相关功能。分页插件常常与前端的分页显示功能相关,为了在前端美观的显示查询到的数据,通常会使用分页插件,将所有的数据分成许多页一页一页的进行显示,不同页的切换使用按钮来完成
MP的插件配置类

@Configuration
public class MybatisPlusConfiguration {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {// 创建一个MybatisPlus的插件拦截器MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 创建分页的插件对象并设置数据库类型PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认falsepaginationInnerInterceptor.setOverflow(true);// 设置分页的单页最多条数,默认 500 条,-1 不受限制paginationInnerInterceptor.setMaxLimit(500L);// 将这个分页插件添加到拦截器中并返回interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}
}

自定义方法并调用分页
mapper定义方法

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {/*** 通过年龄查询用户信息并分页返回* @param page 传入一个page对象* @param age  年龄* @return 返回一个page对象*/Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);
}

映射文件编写SQL语句

<mapper namespace="com.xiaochen.mapper.UserMapper"><select id="selectPageVo" resultType="com.xiaochen.domain.User">select id,name,age,email from user where age > #{age}</select>
</mapper>

测试方法调用自定义方法

@Autowired
UserMapper mapper;@Test
public void testpage() {// 创建一个page对象,设置当前页是第1页,每页包含3条记录Page<User> page = new Page<>(2, 3);// mapper调用selectPage方法之后将结果返回给上面的page对象// 第二个参数null的话就是查询所有的记录,如果有查询条件的话就传一个wrapper对象mapper.selectPageVo(page, 20);// 当前页的数据System.out.println(page.getRecords());// 当前是第几页System.out.println(page.getCurrent());// 总页数System.out.println(page.getPages());// 每页的记录数System.out.println(page.getSize());// 总记录数System.out.println(page.getTotal());// 是否有下一页System.out.println(page.hasNext());// 是否有上一页System.out.println(page.hasPrevious());
}

乐观锁插件

  要想使用乐观锁插件,首先要知道什么是乐观锁以及乐观锁出现的原因。现实生活中,一个管理系统往往不仅仅只有一个管理员,以修改商品价格为例,如果有两个管理员小李和小王商品的原价为100,老板先是让小李将商品的价格上调50,一段时间后让小王将商品的价格下调20,由于小李有事耽搁,两个人同时登录管理系统获取到商品的价格对其分别进行修改操作。如果小李最后完成操作的话商品最终为150元,如果小王最后完成操作的话商品最终为80元,这样的话就会造成最终的价格不是老板想要的130。
  要想使用代码实现上述案例的话,使用线程来实现的话更加真实(可以模拟两人处理先后的不确定性),但是为了简化操作,设定最后完成操作的是小王,也即是说最后商品的价格为80

@Test
public void happyLockTest() {// 小李查询商品的价格Product productLi = mapper.selectById(1);// 小王查询到商品的价格Product productWang = mapper.selectById(1);// +50productLi.setPrice(productLi.getPrice() + 50);mapper.updateById(productLi);// -20productWang.setPrice(productWang.getPrice() - 20);mapper.updateById(productWang);// 查询最终的商品价格System.out.println("最终价格为:" + mapper.selectById(1).getPrice());
}// 控制台最终打印    ->     最终价格为:80

  有问题就有解决问题的方法,出现这个问题的原因就是两个管理员同时获取到了商品的信息并对他进行了修改,如果可以使用锁限制同一时间只能有一个管理员对数据进行修改操作的话,就可以避免这个问题了,这就是悲观锁。
  不对啊,不是说要讲乐观锁的嘛怎么讲到了悲观锁了?悲观锁将整张表锁住了,阻止其他人对表进行修改操作,这样的话对效率有很大的折损。于是乐观锁应运而生,乐观锁允许任何人任何时候对表中数据进行修改,只不过数据表中要添加一个字段表示数据的当前版本号,数据每经过一次更新版本号就相应加一,数据每次更新的时候都会带上版本号字段作为更新的条件。这样的话就可以避免之前的问题了,两人同时获取到的版本都是0,小李修改之后就会将版本字段值加一也就是1,这时小王修改的时候就会查不到表中版本号为0的数据而无法修改。
  这样的话就会避免修改冲突,但是还是无法得到想要的结果,于是可以对两人的修改结果进行判断,如果更新操作的返回结果不是0的话就说明更新成功,否则就再次获取数据表中的信息(这次就是为了获得最新的版本号)再次进行更新操作
  使用MP中的乐观锁插件,首先需要在配置类中将乐观锁插件添加到拦截器中,然后再在实体类中的版本号字段上使用@Version标志,然后就是和平常一样的操作数据库即可,执行更新操作的时候会自动将当前查询到的版本号当做条件拼接到SQL语句中

// 将乐观锁插件添加到拦截器中
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());// 实体类标注版本号
@Version
private Integer version;// 测试方法,测试两个人最后的修改结果
@Test
public void happyLockTest() {// 小李查询商品的价格Product productLi = mapper.selectById(1);// 小王查询到商品的价格Product productWang = mapper.selectById(1);// +50int result = 0;do {// 更新失败,重新查询并修改productLi = mapper.selectById(1);productLi.setPrice(productLi.getPrice() + 50);result = mapper.updateById(productLi);} while (result == 0);// -20do {// 更新失败,重新查询并修改productWang = mapper.selectById(1);productWang.setPrice(productWang.getPrice() - 20);result = mapper.updateById(productWang);} while (result == 0);// 查询最终的商品价格System.out.println("最终价格为:" + mapper.selectById(1).getPrice());
}// 控制台最终打印    ->     最终价格为:130

通用枚举类

  对于表中拥有固定几个值的一些字段,可以使用枚举类将比较简单的数字或字符存入到数据库表中,然后将这个简单的数字或字符对应着其具体的字符串表示,比如性别0代表女1代表男。这样就会减轻数据库的存储压力,提高用户的使用体验。
  使用MP的通用枚举必须先创建一个枚举类,向外提供属性的getter方法和全参构造器,并使用@EnumValue注解将标识的属性值在数据库中存储

@Getter
@AllArgsConstructor
public enum SexEnum {FEMALE(0, "女"),MALE(1, "男");// 将注解标识的属性值存储到数据库中@EnumValueprivate Integer sex;private String sexName;
}

  然后实体类中修改字段对应属性的类型为枚举类型,然后重写toString方法,方便查询结果显示为数据表中数字或字符对应的具体的字符串表示

// 修改字段对应属性的类型为枚举类型
private SexEnum sex;// 重写toString方法
@Override
public String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", sex=" + sex.getSexName() +", age=" + age +", email='" + email + '\'' +", isDeleted=" + isDeleted +'}';
}

  最后在配置文件中设置通用枚举的包,也就是相当于让你写的枚举类生效

mybatis-plus:# 设置通用枚举的包type-enums-package: com.xiaochen.enums

测试

@Test
public void enumTest() {User user = new User();user.setName("张三");user.setAge(23);user.setSex(SexEnum.FEMALE);mapper.insert(user);User user1 = mapper.selectById(6);System.out.println(user1);
}

测试结果在这里插入图片描述

多数据源

  多数据源就是在一个程序中同时配置多个数据库作为数据源进行操作,适用于多种场景:纯粹多库、 读写分离、 一主多从、 混合模式等。目前我们就来模拟一个纯粹多库的一个场景,配置两个数据库的两张表,通过一个测试用例分别获取两张表的数据,如果获取到说明多库模拟成功

第一步: 导入依赖

<!--mybatis-的场景启动器-->
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version>
</dependency>

第二步: 配置文件配置多数据源

spring:# 配置数据源信息datasource:dynamic:# 设置默认的数据源或者数据源组,当设置的数据源都找不到时使用默认数据源,默认值即为masterprimary: master# 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false匹配不到指定数据源时使用默认数据源strict: falsedatasource:# 主数据源master:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis_plususername: rootpassword: 123456# 从数据源slave_1:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/testusername: rootpassword: 123456

第三步: 照常使用方法测试在两个数据库查询两张表,唯一不同的就是在service的实现类上使用@DS注解,标注service实现类的所有方法都是对指定数据源进行操作的
在这里插入图片描述
测试类及结果
在这里插入图片描述

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

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

相关文章

等待的操作过时_不会过时的6种网站seo优化操作

SEO优化一直在变化&#xff0c;百度和谷歌的算法也在不断的迭代更新&#xff0c;所以竞争永远不会停止。今天小编就来给大家分享一下&#xff0c;6种不会过时的网站seo优化操作。1.保持正常优化为网站访客提供高质量的内容、卓越的用户体验和安全性以及卓越的技术网站。这可能需…

java的for循环取出数据只是拿到最后一个_一问SQL优化就无从藏身?那只是你对原理的精髓掌握不深

​曾几何时&#xff0c;我信誓旦旦的认为只要 SQL 写的好&#xff0c;面试过程永不倒。结果在一次又一次的征途中&#xff0c;「最终还是以完败落下帷幕」。结果都源于注重使用而忽略原理&#xff0c;从而不知也不了解「SQL」优化应如何面对。读文的你&#xff0c;如今可有这样…

SpringBoot前后端分离解决跨域问题的三种解决方案

&#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680;** 文章目录&#x1f34a;什么是跨域&#x1f34a;跨域问题的解决策略&#x1f34a;三种解决方法&#x1f34a;什么是跨域 想要知道什么是跨域的话&#xff0c;我们可以通过一个小案例简单了解一下跨…

ant design vue 树形控件_官宣!vue.ant.design 低调上线

点击右上方&#xff0c;关注开源中国OSC头条号&#xff0c;获取最新技术资讯官宣&#xff01;官宣&#xff01;官宣&#xff01;是的&#xff0c;你没看错就是那个 https://vue.ant.design。至此&#xff0c;Ant Design 已经全面覆盖了 React、Angular、Vue 三大前端框架&#…

哪款笔记本电脑好_扫地机器人哪个牌子好?口碑最好的扫地机器人

随着智能家居的普及&#xff0c;让我们的生活变得越来越智能。扫地机器人的出现完美解决了宠物的毛发问题&#xff0c;为自己腾出了大量的时间。扫地机器人绝对能提升你的生活品质&#xff0c;通过机器内建的智能清洁模式、自定义规划区域进行打扫&#xff0c;使用手机APP进行控…

使用mybatisplus的通用枚举实现存储显示相分离

狡兔尚且三窟&#xff0c;多学一招总没错吧&#xff1f; &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680; &#x1f30f; 抛出问题 如果让你实现这么一个功能&#xff1a;将性别使用数字存储到数据库中&#xff0c;但是前端需要获取到的是具体的性…

JDK和JRE的区别?main方法的注意点?强制和自动类型转换?

&#x1f4a1;涉及的知识点速通&#x1f6eb; JDK和JRE傻傻分不清?&#x1f6eb; HelloWorld的输出都经历了啥&#xff1f;&#x1f6eb; Java的三个版本都是啥&#xff1f;&#x1f6eb; 关于main方法你都知道啥&#xff1f;&#x1f6eb; 强制and自动类型转换都是啥?各位小…

安卓10不支持qmc解码_Root神器支持安卓10 面具Magisk v20.4+Magisk Manager v7.5.1

Magisk的功能和xposed框架的功能差不多&#xff0c;也有很多插件可安装&#xff0c;而且自带root&#xff0c;刷入这个Magisk后你的rom同时也就有root了(支持安卓7.0&#xff0c;7.1&#xff0c;8.0&#xff0c;8.1,9,10)这也是目前安装8.1root的普遍方法&#xff0c;因为目前s…

==和equals判等、空串和null串、字符串常用API

&#x1f4a1;涉及的知识点速通&#x1f6eb; 关于变量和常量你都知道啥?&#x1f6eb; &和&&#xff06;、|和||有什么区别&#xff1f;&#x1f6eb; 关于字符串的问题你能答对几道&#xff1f;&#x1fa82; 可以修改一个字符串中的值吗?&#x1fa82; 字符串使用…

俩台电脑怎么设置同一局域网_方法 | 把手机上的照片传到电脑上

我想把手机上的照片/视频传到电脑上怎么办? 什么云盘&#xff0c;手机助手等等全扔到一边去&#xff0c;不用。请让我慢慢道来&#xff1a;现在&#xff0c;人们手机用的越来越多&#xff0c;即使在大街上&#xff0c;到处都是“低头族”。但是&#xff0c;有好多小伙伴问&…

数据持化技术的发展演变(SQL、JDBC、mybatis)

文章目录1 简单SQL语句1.1 查询1.2 新增1.3 修改1.4 删除1.5 多表查询2 JDBC2.1 什么是JDBC2.2 什么是jar和maven2.3 JDBC的使用2.4 JDBC总结3 mybatis3.1 什么是ORM?为什么是ORM不是JDBC&#xff1f;3.2 mybatis的使用3.3 mybatis总结4 mybatis与jdbc的逻辑相同处环境配置 j…

传统蒙文字体_蒙古要改回使用传统回鹘蒙文,这是种什么文字,蒙古为什么要改回...

喜欢就点关注吧!文字是一个国家的文化象征&#xff0c;也是其书面交流的主要工具&#xff0c;世界上的大多数国家都有自己独特的文字&#xff0c;我们的邻国蒙古也是如此&#xff0c;近日蒙古国实行了一场意义重大的文字改革&#xff0c;据新华社乌兰巴托3月18日报道&#xff0…

三态输出门实验报告注意事项_数电基础知识:各种IO输出的类型

集电极开路(OC)集电极开路输出的结构如图1所示&#xff0c;右边的那个三极管集电极什么都不接&#xff0c;所以叫做集电极开路&#xff1b;左边的三极管为反相之用&#xff0c;使输入为“0”时&#xff0c;输出也为“0”。对于图 1&#xff0c;当左端的输入为“0”时&#xff0…

数据持久化技术——MP

文章目录1 环境搭建1.1 创建一个maven的project1.2 pom.xml文件导入web开发依赖1.3 创建SpringBoot项目的主程序入口2 代码生成器3 配置数据库4 导入前端页面5 开始前端控制器的编码5.1 wrapper构造器mybatis-plus(简称 MP)是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基…

win7无法连接打印机拒绝访问_如何解决局域网无法访问SQL Server 2008 无法连接到(local)...

初次安装使用SQL server 2008时&#xff0c;可能会遇到无法连接到(local)的情况。那么&#xff0c;如何解决此问题&#xff1f;工具/原料: SQL server 2008方法/步骤1. 打开SQL server 配置管理器-->SQL server 网络配置-->实例名的协议(我的实例名为SQLEXPRESS)。2. 将S…

windows进程管理器_任务管理器就能搞定9成的电脑问题?方法在这里!

90% 对于电脑的不满&#xff0c;都逃不出这几个方面&#xff1a;电脑状态无法随时监测、运行卡顿、开机时间长、莫名黑屏、电池关键时刻不扛使(笔记本电池怎么保养&#xff1f;能不能一直插电源充电&#xff1f;可以戳这里→)&#xff0c;很多小伙伴就选择安装第三方软件来解决…

三维网格精简算法java版_ISMAR 2020 | 商汤提出手机端实时单目三维重建系统

导读&#xff1a;商汤研究院和浙江大学CAD&CG国家重点实验室合作研发了一个手机端实时单目三维重建系统Mobile3DRecon。与现有的基于RGBD的在线三维重建或离线生成表面网格的系统不同&#xff0c;该系统结合前端位姿跟踪结果&#xff0c;允许用户使用单目摄像头在线重建场景…

【分类汇总】idea快捷键、idea配置、常用插件

写在前面 千万别看目录很长就感觉本篇博客很絮叨繁琐&#xff0c;里面多是配置的讲解贴了很多的图片方便大家了解&#xff0c;配置成功一次之后就可以一直使用了。 快捷键的使用建议大家先看&#xff0c;后续敲代码的时候刻意的使用快捷键&#xff0c;相信经过两三天的使用就可…

win10设置默认输入法_个性化设置技巧

个性化设置技巧子墨居士前言本次内容主要是win10系统自带的功能&#xff0c;不是用第三方软件优化桌面的情况下&#xff0c;让自己的电脑桌面能更美观、更舒服。系统自身的个性化设置主要是下图中的几个。鼠标右击->个性化设置。 第三方软件的效果会更好&#xff0c;毕竟是专…

什么叫组网_家庭wifi,如何组网最合适

wifi信号通过电磁波在空中传播的&#xff0c;属于微波通信的一种&#xff0c;因为微波本身及发射功率的限制&#xff0c;导致wifi的穿透能力比较差&#xff0c;北方比较厚的承重强&#xff0c;铁门、家具等对都会对wifi信号有较强的削弱作用。穿过的障碍物越多&#xff0c;这种…