小明的打工日记

Springboot 配置多数据源

小明的打工日记更新了

最近项目有一个这样的需求,一个 Springboot 的单体项目需要配置多个数据源进行使用,即一个项目中需要连接不同的数据库中查询。

我这里使用 Druid 和 MySQL 进行演示

整个项目的结构如下

image.png

依赖引用如下

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MySQL --> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <!-- Druid --> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>

首先我们在配置文件中注明我们需要连接的数据库以及链接

image.png

然后我们就可以配置数据源了

我们首先创建一个 Druid 的 DataSource 然后设置相对应的配置,为了区分,两个数据源分别为本地虚拟机和远程服务器两个

@Configuration public class DataSourceConfig { @Resource private Environment environment; /** * 创建并配置一个名为 localDataBase 的数据源 Bean。 * 根据环境配置(environment properties)来初始化一个 Druid 数据源。 * * @return DataSource 返回配置好的 Druid 数据源实例。 */ @Primary @Bean(name = "localDataBase") public DataSource localDataBase() { // 创建 Druid 数据源实例 DruidDataSource druidDataSource = new DruidDataSource(); // 使用环境变量配置数据源连接信息 druidDataSource.setDriverClassName(environment.getProperty("jdbc1.driverClassName")); druidDataSource.setUrl(environment.getProperty("jdbc1.url")); druidDataSource.setUsername(environment.getProperty("jdbc1.username")); druidDataSource.setPassword(environment.getProperty("jdbc1.password")); return druidDataSource; } /** * 创建并配置一个名为 remoteDataBase 的数据源 Bean。 * 根据环境配置(environment properties)来初始化一个 Druid 数据源。 * * @return DataSource 返回配置好的 Druid 数据源实例。 */ @Bean(name = "remoteDataBase") public DataSource remoteDataBase() { // 新建 数据源2 DruidDataSource druidDataSource = new DruidDataSource(); // 配置数据源2 druidDataSource.setDriverClassName(environment.getProperty("jdbc2.driverClassName")); druidDataSource.setUrl(environment.getProperty("jdbc2.url")); druidDataSource.setUsername(environment.getProperty("jdbc2.username")); druidDataSource.setPassword(environment.getProperty("jdbc2.password")); return druidDataSource; } }

到这里我们的双数据源就配置好了可以正常进行使用了

image.png

但是这样使用并不是很方便,为了方便使用还需要将其与 Mybatis 配置一下

image.png

两者的配置差不多,这里节省篇幅只展示 Local 数据库 的配置代码

@Configuration @MapperScan(basePackages = {"com.example.**.dao.local"}, sqlSessionFactoryRef = "sqlSessionLocalFactory") public class MyBatisLocalConfig { @Resource(name = "localDataBase") private DataSource dataSource; @Bean(name = "sqlSessionLocalFactory") @Primary public SqlSessionFactory sqlSessionLocalFactory() throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/local/*.xml")); return bean.getObject(); } @Bean(name = "sqlSessionLocalTemplate") @Primary public SqlSessionTemplate sqlSessionLocalTemplate() throws Exception { return new SqlSessionTemplate(sqlSessionLocalFactory()); } }

这里配置 扫描 所有模块下的dao包的local包中的所有dao文件,指定 local 下的所有 mapper 通过 localDatabase 进行访问

我们分别在两个数据库中创建数据库表 Emp,存放不同的数据

CREATE TABLE Emp( `id` INT, `username` VARCHAR(128), `salary` DOUBLE, `sex` VARCHAR(16) );

image.pngimage.png

Dao文件已经 Mapper 实现如下(懒得写实体类使用 Map 代替)

/** * 本地员工 Dao */ public interface LocalEmpDao { Map getOneEmp(); }

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.dao.local.LocalEmpDao"> <select id="getOneEmp" resultType="java.util.LinkedHashMap"> SELECT * FROM Emp LIMIT 1; </select> </mapper>

运行结果如下

image.png

如此我们就可以在一个单体项目中连接不同的数据源进行查询

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
小明
内容推荐
day2今天看完了Servlet,明天看HTTP。今天敲了敲坦克大战,想半天也实现不了,非得看课程。头疼。代码要还是敲了记忆才深刻,尤其是自己单独想通逻辑,然后不看视频就单独敲出来才能算初步学会,每天坚持,慢慢来吧
12
day1打卡今天主要看了韩顺平老师javaweb课程的Tomcat和Servlet的一小部分,前面的前端部分以前学过,就大概看了一下笔记复习了一下。今天感觉对tomcat和Servlet的理解有很大的提升,韩老师的课程很适合我。明天继续加油,明天应该看完Servlet差不多,这里自己第一次学就没学明白,明天就学明白Servlet就好,然后再练习一下SQL语句。
15
#自我介绍#大家好,我是一名普通的双非化学专业的学生,以前在教育行业工作,今年25岁,目前在自学Java,一开始学很难理解,学的很慢,后面觉得太慢了就硬着头皮过了一遍,跟着视频敲代码,现在在过第二遍,第二遍感觉好多了,希望自己能够坚持学习,希望今年能够成功转行。加入星球是因为希望借助社群的力量帮助自己更加自律,以及看一看别人是怎么学习编程的,吸取一下别人的经验。兴趣:平时喜欢读书、散步、看电影。短
22
Day 49完成Agent相关高频面试题,后续持续回顾,继续基础面试题
0
Day 1✅ 今天做了:观看万能视频下载器第六、七期视频⏰ 明天计划:实操万能视频下载器📚 今日感悟:
0
作者分享
秽土转生,终于下证了,希望可以给有需要的同学当作一个参考 https://qeul8j6zwe.feishu.cn/wiki/F40ZwxLgmil2UFkQZ9ocHnZJndc?from=from_copylink #软考
4
gitlab 无了?
3
#闲聊# #小明打工记# Day2 今天的主要就是去执行昨天的需求,大体来说和 SQL Father 有点像,但是又杂糅了很多别的东西,还有很多东西要学,其中有一个需求是根据用户输入的时间动态的进行定时任务,找了几个方案但是觉得有一些麻烦,没有太理解其中的原理,已经完成的部分也需要考虑优化的方面,再上两天班就又放假了,开心,看看周末应该有时间整理整理这周学到的东西。
3
#闲聊# #小明打工记# 今天是入职的第一天,办理了入职手续,大家都很友好,上午领导带我们认人办手续,下午安 sql,和领导谈话,一天就这么愉快的过去了。到了下班的时间,那嘴角比ak都难压,抬屁股就走。 第一天没有什么任务,主要就是谈话,临近中午有一个让做一个小demo,其中的一个部分和星球里面的 SQL 之父有点像,应该和代码生成器也有关联?代码生成器还没做具体有什么还不太清楚。 说说今天遇到的问题吧,今天安装了 idea 之后生成了一个 springboot 的模板,但是 resources 里面的 yaml 配置文件不识别了,里面的配置都无效,还没搞清楚是什么情况了,明天上班再研究研究。
13
闲聊 我问一下大佬们,要入职了,我需要提前做一些什么准备吗?
8
下载 APP