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&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&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&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})
提示注意:
-
注意@Primary是將該資料來源設定為主資料來源;
-
@MapperScan(basePackages = “com.xxx”,sqlSessionFactoryRef = “sourceSqlSessionFactory”)
basePackages是掃描@Mapper所在的包路徑 -
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(“classpath*:xxx/**/*Dao.xml”));//設定要掃描mapper介面對應的xml接