在我们的实际业务中可能会遇到;在一个项目里面读取多个数据库的数据来进行展示,spring对同时配置多个数据源是支持的。
使用到的框架:springboot+mybatis
方法:在配置文件中配置多个数据源,然后通过配置类来获取数据源以及mapper相关的扫描配置
1.pom.xml
1 <parent>2 <groupId>org.springframework.boot</groupId>3 <artifactId>spring-boot-starter-parent</artifactId>4 <version>1.5.9.RELEASE</version>5 <relativePath/>6 </parent>7 <dependencies>8 <!-- druid数据源驱动 -->9 <dependency> 10 <groupId>com.alibaba</groupId> 11 <artifactId>druid-spring-boot-starter</artifactId> 12 <version>1.1.0</version> 13 </dependency> 14 <dependency> 15 <groupId>mysql</groupId> 16 <artifactId>mysql-connector-java</artifactId> 17 </dependency> 18 <!--mybatis SpringBoot依赖 --> 19 <dependency> 20 <groupId>org.springframework.boot</groupId> 21 <artifactId>spring-boot-starter-web</artifactId> 22 </dependency> 23 24 <dependency> 25 <groupId>org.springframework.boot</groupId> 26 <artifactId>spring-boot-starter-tomcat</artifactId> 27 <scope>compile</scope> 28 </dependency> 29 30 <dependency> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-test</artifactId> 33 </dependency> 34 35 <!-- aop依赖 --> 36 <dependency> 37 <groupId>org.springframework.boot</groupId> 38 <artifactId>spring-boot-starter-aop</artifactId> 39 </dependency> 40 41 <!-- mybatis --> 42 <dependency> 43 <groupId>org.mybatis.spring.boot</groupId> 44 <artifactId>mybatis-spring-boot-starter</artifactId> 45 <version>1.3.1</version> 46 </dependency> 47 48 <!-- 通用mapper --> 49 <dependency> 50 <groupId>tk.mybatis</groupId> 51 <artifactId>mapper-spring-boot-starter</artifactId> 52 <version>1.1.5</version> 53 </dependency> 54 <!-- druid监控依赖 --> 55 <dependency> 56 <groupId>com.alibaba</groupId> 57 <artifactId>druid</artifactId> 58 <version>1.0.28</version> 59 </dependency> 60 </dependencies>
2.application.yml
1 spring:2 datasource:3 type: com.alibaba.druid.pool.DruidDataSource4 driverClassName: com.mysql.jdbc.Driver5 6 url: jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=utf87 username: root8 password: 1234569
10 url2: jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf8
11 username2: root
12 password2: 123456
3.DruidDBConfig 连接池相关配置
1 package com.xbz.common.config;2 3 import com.alibaba.druid.support.http.StatViewServlet;4 import com.alibaba.druid.support.http.WebStatFilter;5 import org.slf4j.Logger;6 import org.slf4j.LoggerFactory;7 import org.springframework.boot.web.servlet.FilterRegistrationBean;8 import org.springframework.boot.web.servlet.ServletRegistrationBean;9 import org.springframework.context.annotation.Bean;
10 import org.springframework.context.annotation.Configuration;
11
12 /**
13 * Druid监控
14 */
15 @SuppressWarnings("AlibabaRemoveCommentedCode")
16 @Configuration
17 public class DruidDBConfig {
18 private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class);
19
20 /**
21 * 注册ServletRegistrationBean
22 * @return
23 */
24 @Bean
25 public ServletRegistrationBean druidServlet() {
26 ServletRegistrationBean reg = new ServletRegistrationBean();
27 reg.setServlet(new StatViewServlet());
28 reg.addUrlMappings("/druid/*");
29 reg.addInitParameter("allow", ""); //白名单
30 return reg;
31 }
32
33 /**
34 * 注册FilterRegistrationBean
35 * @return
36 */
37 @Bean
38 public FilterRegistrationBean filterRegistrationBean() {
39 FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
40 filterRegistrationBean.setFilter(new WebStatFilter());
41 filterRegistrationBean.addUrlPatterns("/*");
42 filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
43 filterRegistrationBean.addInitParameter("profileEnable", "true");
44 filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE");
45 filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION");
46 filterRegistrationBean.addInitParameter("DruidWebStatFilter", "/*");
47 return filterRegistrationBean;
48 }
49 }
4.MasterDbConfig 注意读取数据库连接相关的键,以及扫描实体、mapper等
1 package com.xbz.common.config;2 3 import com.alibaba.druid.pool.DruidDataSource;4 import org.apache.ibatis.session.SqlSessionFactory;5 import org.mybatis.spring.SqlSessionFactoryBean;6 import org.mybatis.spring.annotation.MapperScan;7 import org.slf4j.Logger;8 import org.slf4j.LoggerFactory;9 import org.springframework.beans.factory.annotation.Qualifier;
10 import org.springframework.beans.factory.annotation.Value;
11 import org.springframework.context.annotation.Bean;
12 import org.springframework.context.annotation.Configuration;
13 import org.springframework.context.annotation.Primary;
14 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
15 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
16
17 import javax.sql.DataSource;
18 import java.sql.SQLException;
19
20
21 @Configuration
22 @MapperScan(basePackages = MasterDbConfig.PACKAGE , sqlSessionFactoryRef = "masterSqlSessionFactory")
23 public class MasterDbConfig {
24 private Logger logger = LoggerFactory.getLogger(MasterDbConfig.class);
25 // 精确到 master 目录,以便跟其他数据源隔离
26 static final String PACKAGE = "com.xbz.**.dao.master";
27 private static final String MAPPER_LOCATION = "classpath*:mapper/master/*.xml";
28 private static final String DOMAIN_PACKAGE = "com.xbz.**.domain";
29
30 @Value("${spring.datasource.url}")
31 private String dbUrl;
32
33 @Value("${spring.datasource.username}")
34 private String username;
35
36 @Value("${spring.datasource.password}")
37 private String password;
38
39 @Value("${spring.datasource.driverClassName}")
40 private String driverClassName;
41
42
43 @Bean(name="masterDataSource") //声明其为Bean实例
44 @Primary //在同样的DataSource中,首先使用被标注的DataSource
45 public DataSource masterDataSource() {
46 DruidDataSource datasource = new DruidDataSource();
47
48 datasource.setUrl(this.dbUrl);
49 datasource.setUsername(username);
50 datasource.setPassword(password);
51 datasource.setDriverClassName(driverClassName);
52
53 return datasource;
54 }
55
56 @Bean(name = "masterTransactionManager")
57 @Primary
58 public DataSourceTransactionManager masterTransactionManager() {
59 return new DataSourceTransactionManager(masterDataSource());
60 }
61
62 @Bean(name = "masterSqlSessionFactory")
63 @Primary
64 public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
65 throws Exception {
66 final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
67 sessionFactory.setDataSource(masterDataSource);
68 sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
69 .getResources(MasterDbConfig.MAPPER_LOCATION));
70 sessionFactory.setTypeAliasesPackage(DOMAIN_PACKAGE);
71 //mybatis 数据库字段与实体类属性驼峰映射配置
72 sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
73 return sessionFactory.getObject();
74 }
75 }
5.ClusterDbConfig
1 package com.xbz.common.config;2 3 import com.alibaba.druid.pool.DruidDataSource;4 import org.apache.ibatis.session.SqlSessionFactory;5 import org.mybatis.spring.SqlSessionFactoryBean;6 import org.mybatis.spring.annotation.MapperScan;7 import org.slf4j.Logger;8 import org.slf4j.LoggerFactory;9 import org.springframework.beans.factory.annotation.Qualifier;
10 import org.springframework.beans.factory.annotation.Value;
11 import org.springframework.context.annotation.Bean;
12 import org.springframework.context.annotation.Configuration;
13 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
14 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
15
16 import javax.sql.DataSource;
17 import java.sql.SQLException;
18
19 /**
20 * 从数据源配置
21 * 若需要配置更多数据源 , 直接在yml中添加数据源配置再增加相应的新的数据源配置类即可
22 */
23 @Configuration
24 @MapperScan(basePackages = ClusterDbConfig.PACKAGE , sqlSessionFactoryRef = "clusterSqlSessionFactory")
25 public class ClusterDbConfig {
26 private Logger logger = LoggerFactory.getLogger(ClusterDbConfig.class);
27 // 精确到 cluster 目录,以便跟其他数据源隔离
28 static final String PACKAGE = "com.xbz.**.dao.cluster";
29 private static final String MAPPER_LOCATION = "classpath*:mapper/cluster/*.xml";
30 private static final String DOMAIN_PACKAGE = "com.xbz.**.domain";
31
32 @Value("${spring.datasource.url2}")
33 private String dbUrl;
34
35 @Value("${spring.datasource.username2}")
36 private String username;
37
38 @Value("${spring.datasource.password2}")
39 private String password;
40
41 @Value("${spring.datasource.driverClassName}")
42 private String driverClassName;
43
44
45
46 @Bean(name="clusterDataSource") //声明其为Bean实例
47 public DataSource clusterDataSource() {
48 DruidDataSource datasource = new DruidDataSource();
49
50 datasource.setUrl(this.dbUrl);
51 datasource.setUsername(username);
52 datasource.setPassword(password);
53 datasource.setDriverClassName(driverClassName);
54 return datasource;
55 }
56
57 @Bean(name = "clusterTransactionManager")
58 public DataSourceTransactionManager clusterTransactionManager() {
59 return new DataSourceTransactionManager(clusterDataSource());
60 }
61
62 @Bean(name = "clusterSqlSessionFactory")
63 public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("clusterDataSource") DataSource culsterDataSource)
64 throws Exception {
65 final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
66 sessionFactory.setDataSource(culsterDataSource);
67 sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
68 .getResources(ClusterDbConfig.MAPPER_LOCATION));
69 sessionFactory.setTypeAliasesPackage(DOMAIN_PACKAGE);
70 //mybatis 数据库字段与实体类属性驼峰映射配置
71 sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
72 return sessionFactory.getObject();
73 }
74 }
6.不同的数据源配置不佟的mapper扫描位置,然后需要哪一个数据源就注入哪一个mapper接口即可
这样获取的数据就是来自不同的数据源了,这种方法比较简单。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934368.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
Umi-OCR_文字识别工具 免安装使用教程(附下载安装包)!永久免费,开源离线OCR识别软件下载
软件介绍
在外面日常工作汇中,我们经常需要将图片、截图中的文字转换为可编辑文本。Umi-OCR应运而生——这是一款完全开源免费的离线OCR识别工具,无需联网即可本地完成高精度文字识别,保护你的数据隐私同时确保高效…
常量指针 和 指针常量
常量指针 和 指针常量Posted on
2025-10-10 19:52
steve.z
阅读(0)
评论(0) 收藏
举报如何牢记 “常量指针” 和 “指针常量” 的区别?🧩 一、先看词序规律:「前修后主」
在汉语里:前面的词修饰后面的词。比…
PyTorch 神经网络工具箱完全指南 - 详解
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
Apache POI:Java操控Office文档的利器
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
【汇总】OPPO r9m 分区名、分区功能
一、分区名、分区功能编号
分区名
英文说明
中文说明
备注、示例0preloaderfastboot 底层系统初始化程序分区
比 u-boot 更底层1pgpt2recovery系统救援工具、维护手机类似电脑PE系统3para4reserve15reserve26reserve37…
完整教程:LVDS系列30:Xilinx 7系 ADC LVDS接口参考设计(一)
完整教程:LVDS系列30:Xilinx 7系 ADC LVDS接口参考设计(一)2025-10-10 19:48
tlnshuju
阅读(0)
评论(0) 收藏
举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !import…
【JAVA】从入门到放弃-01-HelloWorld - 指南
【JAVA】从入门到放弃-01-HelloWorld - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…
2025表面瑕疵检测厂家TOP5推荐:表面瑕疵检测,薄膜瑕疵检测,瑕疵检测设备,瑕疵在线检测,铝箔瑕疵在线检测,外观瑕疵检测机,薄膜瑕疵检测仪,陶瓷膜瑕疵检测各种类型检测,精准高效的质量守护
在当今制造业高质量发展的背景下,表面瑕疵检测已成为保障产品质量的关键环节。随着人工智能和机器视觉技术的快速发展,表面瑕疵检测设备在精度、速度和智能化程度方面都实现了质的飞跃。这类设备通过对产品表面的划痕…
表格识别:不仅能识别文字,更能理解表格的结构和逻辑关系,实现输出可编辑、可分析的结构化数据
在日常工作和商业运营中,表格以其结构化的方式,承载着海量的关键信息——从财务报表、医疗处方到物流单据和调查问卷。然而,这些信息一旦被打印或扫描成图片,就变成了“数据孤岛”,无法被计算机直接理解和处理。传…
docker容器的三大核心技术UnionFS(下) - 指南
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
深入解析:如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘tokenizers’ 问题
深入解析:如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘tokenizers’ 问题pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…
P13274 [NOI2025] 三目运算符
P13274 [NOI2025] 三目运算符
提供一个不同的线段树实现。根据题目我们知道,\(s_i\) 变换后的值仅与 \(s_{i-2},s_{i-1},s_i\) 有关。考虑这三个数的 \(2^3\) 种取值,我们发现只有 101 和 110 会使 \(s_i\) 发生变化…
Microsoft Office不小心卸载或重装系统后,如何重新安装 ... - sherlock
下载安装刚买电脑时自带的office版本。安装包已整理好并上传到网盘了
夸克网盘安装完成后,打开任意Word登录激活账户,即可安装完成使用
HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包) - 实践
HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importa…
使用JaCoCo进行代码覆盖率分析
使用JaCoCo进行代码覆盖率分析
一、背景说明
1、下载jacoco
https://www.jacoco.org/jacoco/2、解压缩后的两个关键文件jacocoagent.jar - 用于运行时收集覆盖率数据jacococli.jar - 用于操作覆盖率数据二、流程命令及…
计算机视觉专家入选德国国家科学院
本文介绍了计算机视觉专家Michael J. Black因其在3D人体建模领域的突破性研究入选德国国家科学院,详细阐述了他的研究成果包括开发逼真3D虚拟形象、从图像视频估计人体形状和运动的方法,以及他在计算机视觉领域获得的…
2025 年工程管理软件/软件系统/软件App/软件平台/工程管理软件和验房系统公司/企业推荐榜:数字化转型下的实用选型指南
在工程行业数字化转型加速推进的背景下,传统管理模式面临进度滞后、成本失控、协同不畅等多重挑战,工程管理软件已从可选工具成为提升项目效率的核心支撑。2025 年工程管理软件市场规模持续扩大,但厂商技术实力与服…
【Java学习】【Java基础】--第1篇:入门Java和对面向对象的理解
一、浅谈为何学习Java
24年本科毕业,从事电气工程师的岗位至今,工作内容愈发让自己觉得无聊。工作中接触到web开发的同事,便对此感兴趣。在学习过程中也验证了这个点,抛开之后是否能靠学这个转行不谈,投入到学习编…