SpringBoot3.x+MyBatisPlus+druid多数据源配置

1 引言

本章主要介绍SpringBoot3.x多数据源配置,以及在此基础上配置分页拦截,自动填充功等功能,源码链接在文章最后。下面列出几个重要文件进行介绍。

2 项目结构

整体项目结构如下,主要介绍配置文件和配置类。
在这里插入图片描述

3 主要代码

3.1 pom.xml

注意SpringBoot3.x对应依赖为mybatis-plus-spring-boot3-starte和druid-spring-boot-3-starter。

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zeroone</groupId><artifactId>zeroone</artifactId><version>1.0</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!--  为Spring Boot项目提供一系列默认的配置和依赖管理--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.2</version><relativePath/></parent><dependencies><!--  Spring Boot核心依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- Spring Boot单元测试和集成测试的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Spring Boot构建Web应用程序的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mysql驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!-- mybatis-plus核心依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version></dependency><!-- 阿里数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.23</version></dependency></dependencies></project>

3.2 application.yml

server:port: 8080 # 服务器的HTTP端口,默认为8080tomcat:uri-encoding: UTF-8 # tomcat的URI编码accept-count: 1000 # 连接数满后的排队数,默认为100threads:max: 800 # tomcat最大线程数,默认为200min-spare: 100 # Tomcat启动初始化的线程数,默认值10# Spring配置
spring:servlet:multipart:max-file-size: 10MB  # 单个文件大小max-request-size: 20MB # 设置总上传的文件大小# 数据源配置datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverdruid:master: # 主库数据源url: jdbc:mysql://127.0.0.1:33066/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: 123456initialSize: 5 # 初始连接数minIdle: 10 # 最小连接池数量maxActive: 20 # 最大连接池数量maxWait: 60000 # 配置获取连接等待超时的时间connectTimeout: 30000 # 配置连接超时时间socketTimeout: 60000 # 配置网络超时时间timeBetweenEvictionRunsMillis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最小生存的时间,单位是毫秒maxEvictableIdleTimeMillis: 900000 # 配置一个连接在池中最大生存的时间,单位是毫秒slave:  # 从库数据源enabled: true # 从数据源开关/默认关闭url: jdbc:mysql://127.0.0.1:33067/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: 123456validationQuery: SELECT 1 FROM DUAL # 配置检测连接是否有效testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsewebStatFilter:enabled: trueurl-pattern: /*exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'statViewServlet:enabled: trueallow:url-pattern: /druid/* # 设置白名单,不填则允许所有访问login-username: admin  # 控制台管理用户名和密码login-password: 123456filter:stat:enabled: truelog-slow-sql: true # 慢SQL记录slow-sql-millis: 1000merge-sql: truewall:config:multi-statement-allow: true# MyBatis配置
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.3 DBMaster.java

这个是主库配置,注意自动填充功能、拦截器功能、application.yml配置均需要在构建SqlSessionFactory 的时候手动添加进去,否则是不生效的。

package com.zeroone.config.database;import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceBuilder;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;
import java.util.Date;@Configuration
@MapperScan(basePackages = "com.zeroone.mapper.master", sqlSessionTemplateRef = "sqlSessionTemplateMaster")
public class DBMaster {Logger log = LoggerFactory.getLogger(getClass());/*** MyBatis-Plus自动填充功能*/static class MetaObjectHandlerImplMaster implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime", new Date(), metaObject);this.setFieldValByName("updateTime", new Date(), metaObject);this.setFieldValByName("version", Integer.valueOf("0"), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime", new Date(), metaObject);}}/*** MyBatis-Plus拦截器**/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptorMaster() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//添加分页拦截器interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//添加乐观锁拦截器interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}/*** 读取MyBatis-Plus配置**/@Bean@ConfigurationProperties(prefix = "mybatis-plus.global-config")public GlobalConfig globalConfigMaster() {GlobalConfig globalConfig = new GlobalConfig();globalConfig.setMetaObjectHandler(new MetaObjectHandlerImplMaster());return globalConfig;}/*** 读取MyBatis-Plus配置文件**/@Bean@ConfigurationProperties(prefix = "mybatis-plus.configuration")public MybatisConfiguration mybatisConfigurationMaster() {return new MybatisConfiguration();}@Primary@Bean@ConfigurationProperties(prefix = "spring.datasource.druid.master")public DataSource dataSourceMaster() {return DruidDataSourceBuilder.create().build();}@Primary@Beanpublic SqlSessionFactory sqlSessionFactoryMaster() throws Exception {MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();bean.setConfiguration(mybatisConfigurationMaster());bean.setGlobalConfig(globalConfigMaster());//加载MyBatis-Plus配置bean.setDataSource(dataSourceMaster());//加载MyBatis-Plus配置bean.setPlugins(mybatisPlusInterceptorMaster());//加载MyBatis-Plus拦截器bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master/*.xml"));return bean.getObject();}@Primary@Beanpublic SqlSessionTemplate sqlSessionTemplateMaster() throws Exception {return new SqlSessionTemplate(sqlSessionFactoryMaster());}@Primary@Beanpublic DataSourceTransactionManager transactionManagerMaster() {return new DataSourceTransactionManager(dataSourceMaster());}}

3.4 DBSlave.java.java

这个是从库配置,配置方法与主库相同,注意@bean方法的名称不能与主库配置相同。

package com.zeroone.config.database;import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceBuilder;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;
import java.util.Date;@Configuration
@MapperScan(basePackages = "com.zeroone.mapper.slave", sqlSessionTemplateRef = "sqlSessionTemplateSlave")
public class DBSlave {Logger log = LoggerFactory.getLogger(getClass());/*** MyBatis-Plus自动填充功能*/static class MetaObjectHandlerImplSlave implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime", new Date(), metaObject);this.setFieldValByName("updateTime", new Date(), metaObject);this.setFieldValByName("version", Integer.valueOf("0"), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime", new Date(), metaObject);}}/*** MyBatis-Plus拦截器**/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptorSlave() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//添加分页拦截器interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//添加乐观锁拦截器interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}/*** 读取MyBatis-Plus配置**/@Bean@ConfigurationProperties(prefix = "mybatis-plus.global-config")public GlobalConfig globalConfigSlave() {GlobalConfig globalConfig = new GlobalConfig();globalConfig.setMetaObjectHandler(new MetaObjectHandlerImplSlave());return globalConfig;}/*** 读取MyBatis-Plus配置文件**/@Bean@ConfigurationProperties(prefix = "mybatis-plus.configuration")public MybatisConfiguration mybatisConfigurationSlave() {return new MybatisConfiguration();}@Bean@ConfigurationProperties(prefix = "spring.datasource.druid.slave")public DataSource dataSourceSlave() {return DruidDataSourceBuilder.create().build();}@Beanpublic SqlSessionFactory sqlSessionFactorySlave() throws Exception {MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();bean.setConfiguration(mybatisConfigurationSlave());bean.setGlobalConfig(globalConfigSlave());//加载MyBatis-Plus配置bean.setDataSource(dataSourceSlave());//加载MyBatis-Plus配置bean.setPlugins(mybatisPlusInterceptorSlave());//加载MyBatis-Plus拦截器bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/slave/*.xml"));return bean.getObject();}@Beanpublic SqlSessionTemplate sqlSessionTemplateSlave() throws Exception {return new SqlSessionTemplate(sqlSessionFactorySlave());}@Beanpublic DataSourceTransactionManager transactionManagerSlave() {return new DataSourceTransactionManager(dataSourceSlave());}
}

4 测试

启动项目后访问:http://localhost:8080/druid/index.html,账号/密码:admin/123456。可以看到druid监控页面。
在这里插入图片描述

  • 其中有两个数据源,跟我们的配置一致。
    在这里插入图片描述在这里插入图片描述 - 然后随意调用UserController中的接口,并查看sql监控。
    在这里插入图片描述

5 源码

Gitee代码链接

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Android Telephony总结

1、Telephony 业务介绍 Android telephony涉及较多模块 1.1、STK业务介绍 1.1.1、STK域选 1.1.2、是否支持STK Telephon STK-CSDN博客 1.1.3、STK应用的安装卸载 1.2、SS补充业务 1.3、通话业务 1.3.1、紧急号码 ECC 号码总结_ecc号码-CSDN博客 1.4、SMS 1.4.1 短信发送方式…

Datawhale X 李宏毅苹果书 AI夏令营-深度学习入门task3:实践方法论

在应用机器学习算法时&#xff0c;实践方法论能够帮助我们更好地训练模型。 1.模型偏差 模型偏差可能会影响模型训练。举个例子&#xff0c;假设模型过于简单&#xff0c;即使找到的最好的函数也不能满足需求。这种情况就是想要在大海里面捞针&#xff08;一个损失低的函数&am…

数学建模强化宝典(9)遗传算法

前言 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型&#xff0c;它通过模拟自然进化过程来搜索最优解。遗传算法最早由美国的John Holland于20世纪70年代提出&#xff0c;并逐渐成为解决复…

Spring6学习笔记2:容器IoC

文章目录 3 容器&#xff1a;IoC3.1 IoC容器3.1.2 依赖注入3.1.3 IoC容器在Spring的实现 3.2 基于XML管理Bean3.2.1 搭建子模块spring6-ioc-xml3.2.2 实验一&#xff1a;获取bean①方式一&#xff1a;根据id获取②方式二&#xff1a;根据类型获取③方式三&#xff1a;根据id和类…

探索英文字体设计的奥秘,解读风格与实用技巧

英文字体设计是一门融合了艺术与技术的学科。字体不仅仅是文本的视觉表现&#xff0c;更是传递情感、信息和品牌个性的媒介。从印刷时代到数字时代&#xff0c;英文字体的设计和应用发生了巨大的变化&#xff0c;而现代字体设计师则肩负着为视觉传达赋予新生命的使命。本文将深…

记:子线程实现QTcpSocket读写的问题

最近在改进考勤系统客户端多线程实现时遇到了线程异步和野指针问题 client&#xff1a;多线程实现ui界面显示&#xff08;主线程&#xff09;、人脸检测&#xff08;检测线程&#xff09;、socket网络通信&#xff08;通信线程)三个任务。 主线程&#xff1a; TimerEvent实时…

CTF---密码学知识点总结

✨Ascall编码&#xff1a;在 ctf 比赛中&#xff0c;flag 的标志一般是以 Ascall 码的形式存在&#xff0c;其对应的码值为102&#xff0c;108&#xff0c;97&#xff0c;103&#xff08;其中{的码值是123&#xff09;&#xff01; ✨Unicode编码&#xff1a;又名万国码&#…

kubeadm方式升级k8s集群

一、注意事项 升级前最好备份所有组件及数据&#xff0c;例如etcd 不要跨两个大版本进行升级&#xff0c;可能会存在版本bug&#xff0c;如&#xff1a; 1.19.4–>1.20.4 可以 1.19.4–>1.21.4 不可以 跨多个版本的可以逐个版本进行升级。 二、查看当前版本 [rootk8s…

如何远程连接其他电脑?两种常用方法!

在过去&#xff0c;远程控制仅限于那些擅长计算机专业技术的少数人。然而&#xff0c;随着科学技术的不断发展&#xff0c;越来越多的人可以通过各种远程控制软件实现对其他电脑的远程操作。如今&#xff0c;对于普通电脑用户来说&#xff0c;使用自己的电脑远程控制另一台电脑…

22AP10 SS524 平替 海思HI3521DV200 可提供开发资料

22AP10 是针对多路高清/超高清&#xff08;1080p/4M/5M/4K&#xff09;DVR 产品应用开发的新一代专 业 SoC 芯片。22AP10 集成了 ARM Cortex-A7 四核处理器和性能强大的图像分析工具 推理引擎&#xff0c;支持多种智能算法应用。同时&#xff0c;22AP10 还集成了多路 MIPI …

通过EasyExcel设置自定义表头及设置特定单元格样式、颜色

前言 在项目开发中&#xff0c;我们会遇到各种文件导出的开发场景&#xff0c;但是这种情况并都不常用&#xff0c;于是本人将自己工作中所用的代码封装成工具类&#xff0c;旨在记录工具类使用方法和技术分享。 实战代码 导出效果&#xff1a; 1、导入依赖 <dependency&g…

钢铁百科:A633GrE钢板材质、A633GrE力学性能、A633GrE执行标准

A633GrE钢板是一种美标低合金高强度结构钢板&#xff0c;具有多种优异的性能和应用领域。以下是对其材质、执行标准、化学成分、力学性能、交货状态、应用范围、常用规格及总结的详细介绍&#xff1a; 一、A633GrE材质 A633GrE钢板属于美标低合金钢&#xff0c;具有高强度、高…

Leetcode 第 410 场周赛题解

Leetcode 第 410 场周赛题解 Leetcode 第 410 场周赛题解题目1&#xff1a;3248. 矩阵中的蛇思路代码复杂度分析 题目2&#xff1a;3249. 统计好节点的数目思路代码复杂度分析 题目3&#xff1a;3250. 单调数组对的数目 I思路代码复杂度分析 题目4&#xff1a;3251. 单调数组对…

nvm list available出现的 Could not retrieve https://nodejs.org/dist/index.json办法解决

好久没有用电脑的nvm list available 命令&#xff0c;今天晚上突然用发现趟趟趟~~ 报错 刚开始报错&#xff1a;是这样滴 Could not retrieve https://nodejs.org/dist/index.json.Get https://nodejs.org/dist/index.json: net/http: TLS handshake timeout方法尝试1&#…

COB超微小间距LED显示屏是什么,它的性价比怎么样,市场大有可为

COB&#xff08;Chip on Board&#xff09;技术最早发源于上世纪60年代&#xff0c;是将LED芯片直接封装在PCB电路板上&#xff0c;并用特种树脂做整体覆盖。COB实现“点” 光源到“面” 光源的转换。点间距有P0.3、P0.4、P0.5、P0.6、P0.7、P0.9、P1.25、P1.538、P1.5625、P1.…

【苍穹外卖】Day4 套餐接口

1 数据设计 /*** 套餐*/ Data Builder NoArgsConstructor AllArgsConstructor public class Setmeal implements Serializable {private static final long serialVersionUID 1L;private Long id;//分类idprivate Long categoryId;//套餐名称private String name;//套餐价格p…

Renesa Version Board开发RT-Thread 之Client(WIFI)和上位机的数据传输

目录 概述 1 系统框架 1.1 模块介绍 1.1 Version-Board 开发板 1.1.1 Vision-Board简介 1.1.2 Vision-Board的资源 1.2 框架介绍 2 上位机App 2.1 UI设计 2.2 代码实现 3 功能测试 3.1 网络连接 3.2 功能测试 概述 本文主要Renesa Version Board开发RT-Thread 之…

与MySQL邂逅

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

ElasticSearch-聚合操作

聚合的分类 aggsMetric Aggregation min, max, avg, sumstats, cardinality Bucket Aggregation terms ordertext -> fielddatarangehistogramtop_hits Pipeline Aggregation min_bucketstats_bucketpercentiles_bucketcumulative_sum 聚合的作用范围 Filter, Post Filter,…

AI智能电销机器人的优势是什么,有什么特点?

机器学习、大数据、深度学习、云计算等的发展和应用&#xff0c;机器人完成复杂专业任务的能力越来越强。智能化机器人时代的到来&#xff0c;进一步拓宽了服务机器人的应用场景和服务模式&#xff0c;人工智能机器人的问世&#xff0c;更使电销机器人进入到了电销行业。我们一…