Springboot使用mybatis框架配置多資料來源
阿新 • • 發佈:2020-11-23
在springboot專案中,使用單一資料來源時,一個典型的配置如下:
spring.datasource.url=jdbc:mysql://ipaddress:port/dbname?characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true&useOldAliasMetadataBehavior=true
spring.datasource.username=usernane
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
mybatis.mapper-locations=classpath:mapperxml檔案路徑/*.xml
mybatis.config-location=classpath:mybatis-config.xml
在改為使用多資料來源時,需要做的幾個工作如下:
1:修改application.properties檔案:
1.1 由於不同的資料來源對應的mapper介面和xml檔案需要放到不同的路徑下,因此上面配置中的mybatis.mapper-locations需要去掉;
1.2 配置不同資料來源的資料庫連線資訊:
spring.datasource.ds1.url=jdbc:mysql://ip1address:port/dbname?characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true&useOldAliasMetadataBehavior=true
spring.datasource.ds1.username=usernane1
spring.datasource.ds1.password=password1
spring.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.ds2.url=jdbc:mysql://ip2address:port/dbname?characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true&useOldAliasMetadataBehavior=true
spring.datasource.ds2.username=usernane2
spring.datasource.ds2.password=password2
spring.datasource.ds2.driver-class-name=com.mysql.jdbc.Driver
2:定義每個資料來源的DataSource bean、sqlsession factory bean、sql session templatebean和data transaction bean
建立第一個資料來源的JAVA配置類如下:
1 package com.demo.datasources; 2 3 import org.apache.ibatis.session.SqlSessionFactory; 4 import org.mybatis.spring.SqlSessionFactoryBean; 5 import org.mybatis.spring.SqlSessionTemplate; 6 import org.mybatis.spring.annotation.MapperScan; 7 import org.springframework.beans.factory.annotation.Qualifier; 8 import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 9 import org.springframework.boot.context.properties.ConfigurationProperties; 10 import org.springframework.context.annotation.Bean; 11 import org.springframework.context.annotation.Configuration; 12 import org.springframework.context.annotation.Primary; 13 import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 14 import org.springframework.jdbc.datasource.DataSourceTransactionManager; 15 16 import javax.sql.DataSource; 17 18 @Configuration 19 @MapperScan(basePackages = "com.demo.dao1", sqlSessionFactoryRef = "sqlSessionFactory1") 20 public class DataSourceConfigOne { 21 /** 22 * 資料來源1 23 * @return 24 */ 25 @Bean(name = "datasource1") 26 @Primary 27 @ConfigurationProperties(prefix = "spring.datasource.ds1") 28 public DataSource getDataSourceOne(){ 29 return DataSourceBuilder.create().build(); 30 } 31 32 /** 33 * 會話工廠1 34 */ 35 @Bean(name = "sqlSessionFactory1") 36 @Primary 37 public SqlSessionFactory sqlSessionFactory1(@Qualifier("datasource1") DataSource dataSource) throws Exception{ 38 SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); 39 sqlSessionFactoryBean.setDataSource(dataSource); 40 sqlSessionFactoryBean.setMapperLocations( 41 new PathMatchingResourcePatternResolver().getResources("classpath*:com/demo/dao1/*.xml")); 42 return sqlSessionFactoryBean.getObject(); 43 } 44 45 /** 46 * 會話Template1 47 */ 48 @Bean(name = "sqlSessionTemplate1") 49 @Primary 50 public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) throws Exception{ 51 return new SqlSessionTemplate(sqlSessionFactory); 52 } 53 54 /** 55 * 返回資料庫1事務 56 */ 57 @Bean(name = "databaseSessionTransaction1") 58 @Primary 59 public DataSourceTransactionManager transactionManager(@Qualifier("datasource1") DataSource dataSource){ 60 return new DataSourceTransactionManager(dataSource); 61 } 62 }View Code
上面程式碼中可以看出,application.properties中配置的不同資料來源的資料庫連線資訊,是通過@ConfigurationProperties(prefix = "spring.datasource.ds1")註解來為資料來源提供連線資訊。
@MapperScan(basePackages = "com.demo.dao1", sqlSessionFactoryRef = "sqlSessionFactory1")註解則指定了mapper掃描路徑。
會話工廠bean中的:
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:com/demo/dao1/*.xml"));指定了xml的讀取路徑。
最後確保mapper.xml檔案中namespace指定對應的介面類名稱即可。
測試無問題後,以同樣的方式建立第二個資料來源即可。