前言

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

本文内容:

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

SpringBoot实战系列教程回顾:

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

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

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

正文

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

SpringBoot版本:2.0.6.RELEASE

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

排除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菜鸟入门实战系列
  • 爬虫相关技术文章
  • 后端开发相关技术文章

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

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

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

  1. SpringBoot实战教程(4)| 整合Mybatis

    ​MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2 ...

  2. 32位数据源中没有mysql_基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器...

    简介 dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器. 其支持 Jdk 1.7+, SpringBoot 1.4 ...

  3. 十进制12345在32位计算机中的十六进制表示方法

    其实是个挺简单的问题. 12345十六进制表示为0x00003039 说明:在32位计算机中,int为4字节,用二进制表示方法应该有32位,但一个十六进制包含4个二进制位.所以表示出来则是8位.在日常 ...

  4. 如何分别是32位微型计算机,32位微型计算机中的32指的是啥

    "32位"是指计算机2113的字长,5261字长越长,计算机的运算精度就越高.32位处4102理器,计算机中的位1653数指的是CPU一次能处理的最大位数.32位计算机的CPU一次 ...

  5. 32位微型计算机中的32字的是,32位微型计算机中32指的是

    32指的2113是计算机的字长.字长较长的计算机,其计算精度也5261会比较4102高.通常称处理字长为8位数据1653的CPU叫8位CPU,32位CPU就是在同一时间内处理字长为32位的二进制数据. ...

  6. 关于32位系统中int、float、short、double等占多少个字节

    关于32位系统中int.float.short.double等占多少个字节 我用VC编译的,测试了一下,代码如下: #include "iostream" using namesp ...

  7. 32位系统中short、short int、int、long int、long、long long所表示数值的范围

    首先我们先测试下各个类型数据在32位系统中所占的字节数,测试代码如下: int s = sizeof(short);int si = sizeof(short int);int i = sizeof( ...

  8. 创世贴|怎么在64或32位系统中运行16位程序《大富翁》

    创世贴|怎么在64或32位系统中运行16位程序<大富翁> 绪言 大家好!纵观游戏行业的发展,可谓是进步迅猛.百花齐放.游戏是每个人在学习.工作之余休闲娱乐的良药.玩游戏的人从皇宫贵族到社会 ...

  9. 64微型计算机中的32,32位微型计算机中32指的是

    32指的2113是计算机的字长.字长较长的计算机,其计算精度也5261会比较4102高.通常称处理字长为8位数据1653的CPU叫8位CPU,32位CPU就是在同一时间内处理字长为32位的二进制数据. ...

最新文章

  1. 纪念-今天DNN密码破解
  2. 【HDU 2028】Lowest Common Multiple Plus
  3. 兼容ie8 rgba()用法
  4. 【新功能,新插件】-全新来袭,CSDN浏览器助手这一款无广告干净界面插件你值得拥有!
  5. 第二十六节(对象流,File类)
  6. .NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部?
  7. UVa11426——欧拉函数
  8. c语言程序改错例题,C语言程序改错习题
  9. 【redis】redis基础命令,分布式锁,缓存问题学习大集合
  10. 数据结构之基于Java的顺序栈实现
  11. 怎么打开/查看MySQL的SQL记录
  12. thinkphp实现文件上传
  13. Ember Route
  14. 如何用树莓派搭建一台永久运行的个人服务器?
  15. 下载不了代码仓库的代码怎么办?
  16. 苹果蓝牙耳机怎么接电话_除了苹果AirPods,真无线蓝牙耳机到底怎么选?
  17. Linux 往事:一个不会像 GNU 那样大而专业的 OS 是如何成为主流的?
  18. SAP历史库存MB5B的详解(转)
  19. [Python] GDAL/OGR操作矢量数据(shp、GeoJSON)
  20. 为啥是我得癌症?(不管什么行业,请耐心读完)

热门文章

  1. php 递归展现城市信息,PHP 递归兑现层级树状展现数据
  2. layui分页limit不显示_【图片】新手 分页显示不了呀【layui吧】_百度贴吧
  3. 便携式不锈钢管道焊接机器人_304不锈钢管居然可以发黑?
  4. 【APICloud系列|4】APP设计统一图标大小的方法
  5. html 转换xslt,XSLT xsl:template 元素
  6. 宝塔php gd库,宝塔面板安装 EasyImag – 一款最简单图床的安装体验
  7. 支援一波 《面试数十人有感》
  8. 自己整理的css3动画库,附下载链接
  9. Jfinal 文件上传
  10. Android_(游戏)打飞机04:绘画敌机、添加子弹