
前言
之前在使用SpringBoot搭建后臺服務的過程中,一般都是訪問一個數(shù)據(jù)庫,一個數(shù)據(jù)源.這次在新的項目中由于使用的MQTT服務,需要進行鑒權(quán)操作,但是MQTT服務有多個項目使用,所以它的鑒權(quán)數(shù)據(jù)庫在一個單獨的數(shù)據(jù)庫中,這時候我們就需要在SpringBoot配置多數(shù)據(jù)源.
整體來說是比較簡單的,但是對于我這個小白也是折騰了一天多,現(xiàn)在也是很多原理沒有搞懂,這里只能算是記錄一下,方便以后的查找.

配置 application.yml
首先要在 application.yml 中配置兩個數(shù)據(jù)源,這里我就以我工程中為例,主庫的數(shù)據(jù)源叫做main,mqtt數(shù)據(jù)庫叫做mqtt,這里大家可以自定義,不過多敘述了.具體如下所示.
spring:
datasource:
main:
url: jdbc:mysql://************************************
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
mqtt:
url: jdbc:mysql://************************************
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
多數(shù)據(jù)源配置類
新增一個 DataSourceConfig 數(shù)據(jù)源配置類.具體代碼如下所示.
/**
* 數(shù)據(jù)庫多數(shù)據(jù)源配置
*/
@Configuration
public class DataSourceConfig {
// GreenRoom主數(shù)據(jù)庫配置
@Primary
@Bean(name = "mainDataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.main")
public DataSourceProperties mainDataSourceProperties() {
return new DataSourceProperties();
}
// GreenRoom主數(shù)據(jù)庫 數(shù)據(jù)源
@Primary
@Bean(name = "mainDataSource")
public DataSource mainDataSource(@Qualifier("mainDataSourceProperties") DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder().build();
}
// mqtt數(shù)據(jù)庫數(shù)據(jù)源配置
@Bean(name = "mqttDataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.mqtt")
public DataSourceProperties mqttDataSourceProperties() {
return new DataSourceProperties();
}
// mqtt數(shù)據(jù)庫數(shù)據(jù)源
@Bean("mqttDataSource")
public DataSource mqttDataSource(@Qualifier("mqttDataSourceProperties") DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder().build();
}
}
Main和Mqtt數(shù)據(jù)源配置類
上面已經(jīng)把多數(shù)據(jù)源配置類設(shè)置完成了,接下來,我們就要Main和Mqtt數(shù)據(jù)源進行各自單獨的配置了,單獨配置的意義就在于讓Main和Mqtt 去掃描自己的Dao.java和 Dao.xml.
首先我們先看一下,我的項目具體的目錄結(jié)構(gòu),可能不太規(guī)范...大家見諒.

接下來,我們就具體看一下main數(shù)據(jù)源的配置類,這里以我項目中的 GreenRoomDataSourceConfig 為例.
/**
* 主數(shù)據(jù)庫Mapper配置
*/
@Configuration
@MapperScan(basePackages ="com.dong.gen.mapper", sqlSessionTemplateRef = "mainSqlSessionTemplate")
public class GreenRoomDataSourceConfig {
// 主數(shù)據(jù)源 main數(shù)據(jù)源
@Primary
@Bean("mainSqlSessionFactory")
public SqlSessionFactory mainSqlSessionFactory(@Qualifier("mainDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource);
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath*:com/dong/gen/mapper/**/*.xml"));
return sqlSessionFactory.getObject();
}
@Primary
@Bean(name = "mainTransactionManager")
public DataSourceTransactionManager mainTransactionManager(@Qualifier("mainDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Primary
@Bean(name = "mainSqlSessionTemplate")
public SqlSessionTemplate mainSqlSessionTemplate(@Qualifier("mainSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
然后再看一下 MqttDataSourceConfig 這個配置類.
/**
* MQTT數(shù)據(jù)庫Mapper配置
*/
@Configuration
@MapperScan(basePackages ="com.dong.mqtt.mapper", sqlSessionTemplateRef = "mqttSqlSessionTemplate")
public class MqttDataSourceConfig {
// MQTT數(shù)據(jù)源
@Bean("mqttSqlSessionFactory")
public SqlSessionFactory mqttSqlSessionFactory(@Qualifier("mqttDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource);
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath*:com/dong/mqtt/mapper/*.xml"));
return sqlSessionFactory.getObject();
}
@Bean(name = "mqttTransactionManager")
public DataSourceTransactionManager mqttTransactionManager(@Qualifier("mqttDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "mqttSqlSessionTemplate")
public SqlSessionTemplate mqttSqlSessionTemplate(@Qualifier("mqttSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
這兩個文件的核心是掃包的配置代碼,具體如下所示.
@MapperScan(basePackages ="com.dong.gen.mapper", sqlSessionTemplateRef = "mainSqlSessionTemplate")
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath*:com/dong/gen/mapper/**/*.xml"));
@MapperScan(basePackages ="com.dong.mqtt.mapper", sqlSessionTemplateRef = "mqttSqlSessionTemplate")
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath*:com/dong/mqtt/mapper/*.xml"));
結(jié)語
到此,SpringBoot + MyBatis 多數(shù)據(jù)源配置就算完成了,如果有任何問題,歡迎評論,謝謝.
