SpringBoot: 基于MyBatis的多數(shù)據(jù)源配置


前言


之前在使用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ù)源配置就算完成了,如果有任何問題,歡迎評論,謝謝.


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容