1. 程式人生 > >springboot使用mybatis如何配置多資料來源

springboot使用mybatis如何配置多資料來源

本篇部落格提供一個工程想連線多個數據庫進行業務查詢,在原先的單個數據庫上進行配置實現多個數據庫的使用,對於springboot以及mybatis不在此進行展開介紹,只需要把程式碼按照步驟一步步貼上進你的專案,調整一下就能實現;

簡單介紹單個數據源配置

pom檔案匯入依賴

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>

預設情況下,如果在application.yml或application.property中指定了spring.datasource.*的相關配置引數,Spring Boot就會使用該配置建立一個DataSource。Spring Boot會自動為我們配置好一個DataSource,就會自動配置一個記憶體資料庫的DataSource。
然後會自動建立使用該DataSource的SqlSessionFactoryBean以及SqlSessionTemplate。會自動掃描你的Mappers,連線到SqlSessionTemplate,並註冊到Spring上下文中。

spring:
 datasource:
      primary:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/database?useUnicode=true&amp;characterEncoding=utf-8
        username: root
        password: admin
        max-idle: 10
        max-wait: 10000
        min-idle: 5
        initial-size: 5
        validation-query: SELECT  1
mybatis
mapperLocations: classpath*:xxx/**/*Dao.xml

多個數據源配置

在application.yml或application.property中指定多個數據源

spring:
 datasource:
      primary:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/database?useUnicode=true&amp;characterEncoding=utf-8
        username: root
        password: admin
        max-idle: 10
        max-wait: 10000
        min-idle: 5
        initial-size: 5
        validation-query: SELECT 1
        
      source:
        driver-class-name: com.mysql.jdbc.Driver
        url: mysql://localhost:3306/database2?useUnicode=true&amp;characterEncoding=utf-8
        username: root
        password: admin
        max-idle: 10
        max-wait: 10000
        min-idle: 5
        initial-size: 5
        validation-query: SELECT 1

建立主配置類

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 


import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.xxx",sqlSessionFactoryRef = "primarySqlSessionFactory")//basePackages是掃描@Mapper所在的包路徑
public class PrimaryDataSourceConfig {
	@Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties("spring.datasource.primary") //配置檔案中對應的配置項
    public DataSource masterDataSource(){
        return DataSourceBuilder.create().build();
    }
	@Primary
    @Bean(name = "primarySqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/**/*Dao.xml"));//設定要掃描mapper介面對應的xml介面檔案
        return sessionFactoryBean.getObject();
    }
}

建立第二個資料來源配置類

import source.apache.ibatis.session.SqlSessionFactory;
import source.mybatis.spring.SqlSessionFactoryBean;
import source.mybatis.spring.annotation.MapperScan;
import source.springframework.beans.factory.annotation.Qualifier;
import source.springframework.boot.context.properties.ConfigurationProperties;
import source.springframework.boot.jdbc.DataSourceBuilder;
import source.springframework.context.annotation.Bean;
import source.springframework.context.annotation.Configuration;
import source.springframework.context.annotation.Primary;
import source.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.xxx",sqlSessionFactoryRef = "sourceSqlSessionFactory")//basePackages是掃描@Mapper所在的包路徑
public class SourceDataSourceConfig {
   @Bean(name = "sourceDataSource")
   @ConfigurationProperties("spring.datasource.source")//配置檔案中對應的配置項
   public DataSource masterDataSource(){
       return DataSourceBuilder.create().build();
   }

   @Bean(name = "sourceSqlSessionFactory")
   public SqlSessionFactory sqlSessionFactory(@Qualifier("sourceDataSource") DataSource dataSource) throws Exception {
       SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
       sessionFactoryBean.setDataSource(dataSource);
       sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
               .getResources("classpath*:xxx/**/*Dao.xml"));//設定要掃描mapper介面對應的xml介面檔案
       return sessionFactoryBean.getObject();
   }
}

修改啟動類

在啟動類上新增該註解,用於遮蔽spingboot啟動myBatisAutoConfig預設配置;使用exclude啟動時,載入自己配置的多資料來源;
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})

提示注意:

  1. 注意@Primary是將該資料來源設定為主資料來源;

  2. @MapperScan(basePackages = “com.xxx”,sqlSessionFactoryRef = “sourceSqlSessionFactory”)
    basePackages是掃描@Mapper所在的包路徑

  3. sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
    .getResources(“classpath*:xxx/**/*Dao.xml”));//設定要掃描mapper介面對應的xml接