SpringBoot: 基于MyBatis的多数据源配置

502 阅读3分钟


前言


之前在使用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 多数据源配置就算完成了,如果有任何问题,欢迎评论,谢谢.