前言
之前在使用SpringBoot搭建后台服务的过程中,一般都是访问一个数据库,一个数据源.这次在新的项目中由于使用的MQTT服务,需要进行鉴权操作,但是MQTT服务有多个项目使用,所以它的鉴权数据库在一个单独的数据库中,这时候我们就需要在SpringBoot配置多数据源.
整体来说是比较简单的,但是对于我这个小白也是折腾了一天多,现在也是很多原理没有搞懂,这里只能算是记录一下,方便以后的查找.
配置 application.yml
首先要在 application.yml 中配置两个数据源,这里我就以我工程中为例,主库的数据源叫做main,mqtt数据库叫做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
多数据源配置类
新增一个 DataSourceConfig 数据源配置类.具体代码如下所示.
/**
* 数据库多数据源配置
*/
@Configuration
public class DataSourceConfig {
// GreenRoom主数据库配置
@Primary
@Bean(name = "mainDataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.main")
public DataSourceProperties mainDataSourceProperties() {
return new DataSourceProperties();
}
// GreenRoom主数据库 数据源
@Primary
@Bean(name = "mainDataSource")
public DataSource mainDataSource(@Qualifier("mainDataSourceProperties") DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder().build();
}
// mqtt数据库数据源配置
@Bean(name = "mqttDataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.mqtt")
public DataSourceProperties mqttDataSourceProperties() {
return new DataSourceProperties();
}
// mqtt数据库数据源
@Bean("mqttDataSource")
public DataSource mqttDataSource(@Qualifier("mqttDataSourceProperties") DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder().build();
}
}
Main和Mqtt数据源配置类
上面已经把多数据源配置类设置完成了,接下来,我们就要Main和Mqtt数据源进行各自单独的配置了,单独配置的意义就在于让Main和Mqtt 去扫描自己的Dao.java和 Dao.xml.
首先我们先看一下,我的项目具体的目录结构,可能不太规范...大家见谅.
接下来,我们就具体看一下main数据源的配置类,这里以我项目中的 GreenRoomDataSourceConfig 为例.
/**
* 主数据库Mapper配置
*/
@Configuration
@MapperScan(basePackages ="com.dong.gen.mapper", sqlSessionTemplateRef = "mainSqlSessionTemplate")
public class GreenRoomDataSourceConfig {
// 主数据源 main数据源
@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数据库Mapper配置
*/
@Configuration
@MapperScan(basePackages ="com.dong.mqtt.mapper", sqlSessionTemplateRef = "mqttSqlSessionTemplate")
public class MqttDataSourceConfig {
// MQTT数据源
@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"));
结语
到此,SpringBoot + MyBatis 多数据源配置就算完成了,如果有任何问题,欢迎评论,谢谢.