小明的打工日记
Springboot 配置多数据源
小明的打工日记更新了
最近项目有一个这样的需求,一个 Springboot 的单体项目需要配置多个数据源进行使用,即一个项目中需要连接不同的数据库中查询。
我这里使用 Druid 和 MySQL 进行演示
整个项目的结构如下

依赖引用如下
<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>
首先我们在配置文件中注明我们需要连接的数据库以及链接

然后我们就可以配置数据源了
我们首先创建一个 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; } }
到这里我们的双数据源就配置好了可以正常进行使用了

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

两者的配置差不多,这里节省篇幅只展示 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) );


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>
运行结果如下

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