db2 springboot 整合_[SpringBoot]快速配置多数据源(整合MyBatis)

前言

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

本文内容:

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

避免网上某些配置数据源文章的深坑

SpringBoot实战系列教程回顾:

正文

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

SpringBoot版本:2.0.6.RELEASE

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

image.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=false

spring.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.Driver

spring.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;

@Bean

public SqlSessionFactory sqlSessionFactoryDb1() throws Exception{

SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();

factoryBean.setDataSource(dataSourceDb1);

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

return factoryBean.getObject();

}

@Bean

public 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;

@Bean

public SqlSessionFactory sqlSessionFactoryDb2() throws Exception{

SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();

factoryBean.setDataSource(dataSourceDb2);

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

return factoryBean.getObject();

}

@Bean

public 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菜鸟入门实战系列

爬虫相关技术文章

后端开发相关技术文章

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

公众号201992.jpg

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

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

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

相关文章

pytorch使用GPU炼丹笔记

如何使用GPU训练/测试模型使用单GPU设置设备将数据转换成CUDA张量将模型参数转换成CUDA张量使用指定GPU1.使用CUDA_VISIBLE_DEVICES。1.1 直接在终端或shell脚本中设定:1.2 python代码中设定:2. 使用函数 set_device使用多GPUDP方法DDP方法需要先初始化数…

java解决错误经验_在Java错误进入生产之前的新处理方式

java解决错误经验我们如何认识到解决预生产错误的旧方法还不够,以及我们如何能够改变它 第一次尝试就没有完美的代码,我们所有人都可以证明我们已经通过艰苦的努力学习了。 不管我们使用多少测试周期,代码审查或工具,总有至少一个…

vim 寄存器中的 ^@,^M,^J

首先,ASCII 码表示的字符不都是可打印字符(可显示字符),意味着,其中的控制字符本不是对应某个字形的,所以本没有办法看到他们。那么如果万一某个文件中出现了这些怎么办捏??这里我们…

2019怎么保存低版本_CAD发给客户没字体怎么办?快速打包外部参照、字体、打印样式...

CAD发给客户没字体怎么办?快速打包DWG外部参照、字体、图片、打印样式!有没有遇见过这样的情况:图纸发给客户,外部参照的文件没有一起打包发出去,被老板和客户臭骂一顿。图纸发给审图,没有字体,…

Python正则表达式笔记

正则表达式作用函数函数参数查找函数re.findall()re.search()re.match()re.finditer()re.compile()函数替换函数re.sub(pattern,repl,string,count0,flags0)re.subn()分割函数re.split()模式串字符字符类别表达(匹配单个字符)\d\D\s\S\w\W[a-z][^a-z].多次匹配字符*&#xff1f…

CentOS Linux 下的 vim 无法使用系统剪贴板,怎么解决呢?

文章目录查看系统当前的 vim 是否支持剪贴板安装 gvim 来支持系统剪贴板gvim 和 vim 的区别SSH 连接远程主机遇到的问题查看系统当前的 vim 是否支持剪贴板 首先查看下系统的 vim 是否支持系统剪贴板,在命令终端输入如下命令: [roothtlwk0001host test…

jwt令牌_jwt-cli:用于解码JSON Web令牌(JWT令牌)的Shell库

jwt令牌当我开始经常需要解码JSON Web令牌时,我感到迫切需要编写允许我快速进行操作的程序。 有很多不错的选项,例如jwt.io ,但是一旦您需要执行此操作,它通常就会变得笨拙。 并且,如果您需要处理多个令牌或进一步处理…

日历对象导哪个包_java.util的的Date类和Calendar类

Datejava.util.Date类的对象用来表示时间和日期,用得最多的是获取系统当前日期和时间,精确到毫秒。Java中有两个Date类,还有一个是java.sql.Date,这个类一般不用,即使在数据库中也不推荐使用。写代码时注意导入的包一定…

Debian Linux 的 vim 如何使用系统剪贴板

以 ubuntu 为例,ubuntu 默认是没有 vim 的,需要自己安装一下: 更新源: apt-get update安装 vim : apt-get install vim此时,系统不支持剪切板,我们使用命令 vim --version|grep clipboard 查…

Python中replace()函数

replace()函数 功能:类似正则表达式的sub()函数,使用新的字符串替换主串中的内容。 函数需要通过字符串来调用,replace(old, new, max)函数参数依次为: old表示主串中要被替换的字符串。new表示新的字符串。max表示替换次数,默…

lombok和maven_Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回

lombok和maven在上一篇有关Lombok库的文章中 ,我描述了一个库,该库有助于处理Java中的样板代码( 是的,我知道这些问题已经在Kotlin中解决了 ,但这是现实生活,我们不能一味地坐下来,一旦出现较新…

上传文件显示进度条_文件上传带进度条进阶-断点续传

说明 1. 把文件按大小1M分割成N份 2. 每次上传时,告诉后台大文件的md5、当前第几份(从0开始)、总共几份 3. 并行上传,前端同时开启5个请求进行传输增加速度 4. 上传失败或出错后,继续上传下一份,把出错的份…

Unix 下的 vim 如何使用系统剪贴板

在 Unix 环境下," 寄存器需要 xterm-clipboard feature 的 VIM 软件才能使用,具有这个 feature 的 VIM 可以安装 vim-gtk(包含gvim和vim),使用 gvim 可以正常调用 " 寄存器。

python中关键字global的简单理解

python用global关键字来标识函数里或类里的全局变量,下面以例子来看看global关键字的作用。 未使用global关键字 a10 #全局变量 def sum(x):a2 #局部变量xa*xreturn x xsum(3) print("a:",a) #10 输出的是全局变量a10 print("x:",x) #6使用…

apache kafka_2018年机器学习趋势与Apache Kafka生态系统相结合

apache kafka在慕尼黑举行的OOP 2018大会上,我介绍了有关使用Apache Kafka生态系统和诸如TensorFlow,DeepLearning4J或H2O之类的深度学习框架构建可扩展,关键任务微服务的演讲的更新版本。 我想分享更新后的幻灯片,并讨论一些有关…

cookies丢失 同域名_后端设置Cookie前端跨域获取丢失问题(基于springboot实现)

1.跨域问题说明:后端域名为A.abc.com,前端域名为B.abc.com。2.后端设置一个cookie发送给前台,domain应该是setDomain(“abc.com”),而不是setDomain(“B.abc.com”)3.另外,还要实现WebMvcConfigurerr配置加入Cors的跨域…

shell脚本--使用for循环逐行访问txt文件

方法1 export text_pathdata/1.txt for line in $(cat $text_path) doecho $line done方法2 export text_pathdata/1.txt for line in cat $text_path doecho $line done

vertx rest 跨域_Vertx编程风格:您的React式Web Companion REST API解释了

vertx rest 跨域Vertx提供了许多在轻量级环境中进行编程的选项,例如node.js。 但是,对于新用户来说,选择采用哪种方法来创建REST API几乎不会造成混淆。 在vertx中进行编程时,可以采用不同的模型。 下面通过易于理解的图表进行说…

输出节点位移_绝对值信号的编码器有哪些信号输出(一、二)

绝对值信号的编码器有哪些信号输出(一、二)之前介绍过很多次拉线位移传感器输出是有两大类的,数字信号输出和模拟量信号输出,而数字信号输出还分为增量型脉冲信号输出和绝对值信号输出,今天就系统的介绍一下绝对值信号…

vim 中的 quickfix 指令

用 quickfix 可以快速修改编译错误。 运行了 make 命令编译之后,如果有编译错误 Vim 会以列表形式把编译错误列出,并使用 quickfix 工具快速帮你定位出错的行。 指令说明cc显示编译错误的详细信息,这些信息显示在状态行里cn下一个编译错误cp前一个编译…