32位数据源中没有mysql_[SpringBoot实战]快速配置多数据源(整合MyBatis)

389db6213e36529f29284b7cd64ff445.png

前言

由于业务需求,需要同时在SpringBoot中配置两套数据源(连接两个数据库),要求能做到service层在调用各数据库表的mapper时能够自动切换数据源,也就是mapper自动访问正确的数据库。

本文内容:

  • 在Springboot+Mybatis项目的基础上,学习多数据源的快速配置
  • 避免网上某些配置数据源文章的深坑

SpringBoot实战系列教程回顾:

[Springboot]SpringCache + Redis实现数据缓存

[Springboot]发送邮件、重置密码业务实战

[Springboot]整合ElasticSearch实现数据模糊搜索(Logstash同步Mysql数据)

正文

多数据源配置实战(整合MyBatis)

SpringBoot版本:2.0.6.RELEASE

项目结构图(原谅我保护隐私代码):

69f5e0dec197767e2201b2b3c5e87502.png

排除SpringBoot的自动配置类DataSourceAutoConfiguration

首先要在@SpringBootApplication排除该类,因为它会读取application.properties文件的spring.datasource.*属性并自动配置单数据源

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class
})

在application.properties中配置多数据源连接信息

你需要连接多少个数据库源,就配置几个,名字可以自由命名代替db1,db2

# database
db.conn.str = useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useLocalSessionState=true&tinyInt1isBit=falsespring.datasource.db1.jdbc-url=jdbc:mysql://xxxx1:xxxx/xxxxx1?${db.conn.str}
spring.datasource.db1.username=xxxxx
spring.datasource.db1.password=xxxxx
spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driverspring.datasource.db2.jdbc-url=jdbc:mysql://xxxxx2:xxxx/xxxxx2?${db.conn.str}
spring.datasource.db2.username=xxxxx
spring.datasource.db2.password=xxxxx
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver

注意:这里请一定将spring.datasource.db1.url改为spring.datasource.db1.jdbc-url

官方文档的解释是:因为连接池的实际类型没有被公开,所以在您的自定义数据源的元数据中没有生成密钥,而且在IDE中没有完成(因为DataSource接口没有暴露属性)。另外,如果您碰巧在类路径上有Hikari,那么这个基本设置就不起作用了,因为Hikari没有url属性(但是确实有一个jdbcUrl属性)。在这种情况下,您必须重写您的配置如下:

手动创建数据库配置类

由于我们禁掉了自动数据源配置,因些下一步就需要手动将这些数据源创建出来,创建DataSourceConfig类

@Configuration
public class DataSourceConfig {@Bean(name = "db1")@ConfigurationProperties(prefix = "spring.datasource.db1")public DataSource businessDbDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "db2")@ConfigurationProperties(prefix = "spring.datasource.db2")public DataSource newhomeDbDataSource() {return DataSourceBuilder.create().build();}
}

分别配置不同数据源的mybatis的SqlSessionFactory

这样做可以让我们的不同包名底下的mapper自动使用不同的数据源

创建Db1Config:

/*** @author yangzhendong01*/
@Configuration
@MapperScan(basePackages = {"com.xxxxx.webApi.mapper.db1"}, sqlSessionFactoryRef = "sqlSessionFactoryDb1")
public class Db1Config {@Autowired@Qualifier("db1")private DataSource dataSourceDb1;@Beanpublic SqlSessionFactory sqlSessionFactoryDb1() throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSourceDb1);factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db1/*.xml"));return factoryBean.getObject();}@Beanpublic SqlSessionTemplate sqlSessionTemplateDb1() throws Exception {return new SqlSessionTemplate(sqlSessionFactoryDb1());}}

创建Db2Config:

/*** @author yangzhendong01*/
@Configuration
@MapperScan(basePackages = {"com.xxxxx.webApi.mapper.db2"}, sqlSessionFactoryRef = "sqlSessionFactoryDb2")
public class Db2Config {@Autowired@Qualifier("db2")private DataSource dataSourceDb2;@Beanpublic SqlSessionFactory sqlSessionFactoryDb2() throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSourceDb2);factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/*.xml"));return factoryBean.getObject();}@Beanpublic SqlSessionTemplate sqlSessionTemplateDb2() throws Exception {return new SqlSessionTemplate(sqlSessionFactoryDb2());}}

注意:此步一定要添加mapper.xml文件扫描路径,否则报错Invalid bound statement (not found)

factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/xxxxxx/*.xml"));

完成这些配置后,假设我们有2个Mapper mapper.db1.xxxMapper和mapper.db2.xxxMapper,我们在程序的任何位置使用前者时会自动连接db1库,后者连接db2库。

参考文献

主要参考:

https://blog.csdn.net/neosmith/article/details/61202084

其他参考:

http://blog.didispace.com/springbootmultidatasource/

总结

本文在一个Springboot+Mybatis项目的基础上,学习多数据源的快速配置。

祝大家国庆节假期快乐!

关注我

我目前是一名后端开发工程师。主要关注后端开发,数据安全,边缘计算等方向。

微信:yangzd1102(请注明来意)

Github:@qqxx6661

个人博客:

  • CSDN:@Rude3Knife
  • 知乎:@Zhendong
  • 简书:@蛮三刀把刀
  • 掘金:@蛮三刀把刀

原创博客主要内容

  • Java知识点复习全手册
  • Leetcode算法题解析
  • 剑指offer算法题解析
  • SpringCloud菜鸟入门实战系列
  • SpringBoot菜鸟入门实战系列
  • 爬虫相关技术文章
  • 后端开发相关技术文章

个人公众号:后端技术漫谈

fd29f6ed71926d366dc5843265f1102d.png

如果文章对你有帮助,不妨收藏起来并转发给您的 朋友们~

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

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

相关文章

考研计算机冷门学校,考研5个冷门的985院校 别随大流,这些几所也是很不错的...

导语:想必大家考研的目的有很多,最主要的就是想去更好的学校提升自己,大部分会肯定是会更倾向于985这类的院校,每年其实除了那些被“挤破头”的985院校,其实还有不少“低调”的985院校是非常值得报考的,下面…

名为 cursor_jinserted 的游标不存在_质量工程师必须了解的测量常识,你不知道怎么行...

01测量器具的分类测量器具是一种具有固定形态、用以复现或提供一个或多个已知量值的器具。按用途的不同量具可分为以下几类:1. 单值量具只能体现一个单一量值的量具。可用来校对和调整其它测量器具或作为标准量与被测量直接进行比较,如量块、角度量块等。…

window.onload事件

!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>window.onload</title><!--window.onload注意点&#xff1a;01.在整个页面中只能存在一次&#xff0c;否则后面会覆盖前面02.页面中所有的内容加载…

bzoj4869

http://www.lydsy.com/JudgeOnline/problem.php?id4869 终于A了。。。参考了下dalao的代码。。。 拓展欧几里得定理&#xff0c;改了几次就不变了&#xff0c;但是用的时候要在快速幂里判是不是要用。 #include<bits/stdc.h> using namespace std; typedef long long ll…

一张图一个表——CSS选择器总结

CSS选择器总结&#xff1a; (这些表是一张图片^_^) 看底部 完整思维导图图片和表格的下载地址&#xff1a;https://download.csdn.net/download/denlnyyr/10597820 &#xff08;我不想选择要积分币下载的&#xff0c;但那里最低必须选择1个积分……&#xff09; 参考文献&…

JavaOne 2012覆盖率

年度Java盛会JavaOne会议于9月30日至10月4日在旧金山举行。 进行了许多有趣的演示&#xff0c;再次证明了健康的Java生态系统。 Java Code Geeks未能参加会议&#xff0c;但是我们的JCG合作伙伴Dustin Marx出席了会议&#xff0c;并且慷慨地提供了有关该事件的完整报道&#x…

native层 安卓_安卓逆向——拼xx协议java层分析

制丨阿星整理丨阿星老铁们大家好&#xff0c;今天小编给大家带来很实用的技巧叫拼xx协议java层分析&#xff0c;有啥不足的地方望大家指点指点&#xff01;首先抓包 反编译这个时间段我们方法剖析一下找到onclick 看他的走向找到方法的地方都是在进行写入 所以我们直接分析结果…

对口高考计算机vf试题,计算机对口升学模拟答案.doc

2013年计算机专业对口高考模拟试题二一、选择题1&#xff0e;计算机硬件系统由( )组成A.CPU和内存 B.控制器和运算器 C.主机和外设 D.CPU、内存和外存2.下列叙述中&#xff0c;正确的说法是( )。A.键盘、鼠标、光笔、数字化仪和扫描仪都是输入设备B.打印机、显示器、数字化仪都…

Java集合框架图

转载于:https://www.cnblogs.com/areyouready/p/6835279.html

JavaScript学习第一天(一)

JavaScript介绍 JavaScript一种直译式脚本语言&#xff0c;是一种动态类型、弱类型、基于原型的语言&#xff0c;内置支持类型。它的解释器被称为JavaScript引擎&#xff0c;为浏览器的一部分&#xff0c;广泛用于客户端的脚本语言&#xff0c;最早是在HTML&#xff08;标准通用…

折半查找的思想及源码_常用排序与查找算法

1 选择排序选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是&#xff1a;第一次从待排序的数据元素中选出最小(或最大)的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻找到最小(大)元素&#xff0c;然后放到已排序的序…

滚动视差?CSS 不在话下

何为滚动视差 视差滚动&#xff08;Parallax Scrolling&#xff09;是指让多层背景以不同的速度移动&#xff0c;形成立体的运动效果&#xff0c;带来非常出色的视觉体验。 作为网页设计的热点趋势&#xff0c;越来越多的网站应用了这项技术。 通常而言&#xff0c;滚动视差在…

计算机图形学试题a卷,计算机图形学复习题及答案

一、选择题1.计算机绘图设备一般使用( )颜色模型。A. RGBB. CMYC. HSVD. HLS2.在透视投影中&#xff0c;主灭点的最多个数是( )A1B2C3D43.多边形填充时&#xff0c;下述论述错误的是( )A 多边形被两条扫描线分割成许多梯形&#xff0c;梯形的底边在扫描线上&#xff0c;腰在多边…

番石榴的弦类

在“ 检查Java中的空&#xff0c;空或仅空白字符串”一文中 &#xff0c;我演示了Java生态系统&#xff08;标准Java&#xff0c; Guava &#xff0c; Apache Commons Lang和Groovy &#xff09;中用于检查字符串是否为空&#xff0c;空或空白的常见方法。仅类似于C&#xff03…

用python做数据分析流程图_使用Pyecharts进行高级数据可视化

欢迎使用Markdown编辑器经管之家&#xff1a;Do the best economic and management education&#xff01;你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语…

Hadoop集群的配置(二)

转自&#xff1a;http://www.cnblogs.com/baiboy/p/4640640.html 摘要: hadoop集群配置系列文档&#xff0c;是笔者在实验室真机环境实验后整理而得。以便随后工作所需&#xff0c;做以知识整理&#xff0c;另则与博客园朋友分享实验成果&#xff0c;因为笔者在学习初期&#x…

允许使用抽象类类型 isearchboxinfo 的对象_Java学习5-设计模式+抽象类/方法

1.设计模式设计模式&#xff1a;一套被反复使用、多数人知晓的&#xff0c;经过分类编目的、代码设计经验的总结&#xff0c;是软件开发人员在软件开发过程中面临的一般问题的解决方案。项目中合理的运用设计模式可以完美的解决很多问题&#xff1b; 每种模式在现实中都有相应的…

初始Windows程序

1.属性 窗体标题 Name 窗体的图标 Icon 背景图片 BackgroundImage 背景颜色 BackColor 最大化按钮 MaxIMonBox 最小化按钮 Minimun 窗体边框样式 FormBorderStyle 窗体初始位置 StartPosition 窗体状态 WindowsState 背景图片拉伸 BackgroundImageLayout 窗体标题 Te…

计算机病毒是以独立的文件形式存在的对吗,计算机病毒以什么形式存在?

自从2113世纪出现第一种病毒以来&#xff0c;对于世界上共有5261种病毒的疾病数量有不同的看法. 无论有1,653种&#xff0c;病毒的数量仍在增加. 根据国外统计&#xff0c;计算机病毒以每周10种的速度增长. 根据我国部的统计&#xff0c;中国计算机病毒以每月4种的速度增长. 有…

HTML基础实例

本节列举了一些简单的HTML例子&#xff0c;帮助大家更感性地认识HTML标签。是不是对一些标签还不熟悉&#xff1f;别担心&#xff0c;后面几个章节会有详细说明&#xff0c;先跑几个例子看看效果吧。 HTML文档相关标签所有HTML文档必须以<!DOCTYPE html>声明开头。 HTM…