1. 程式人生 > 實用技巧 >Springboot使用mybatis框架配置多資料來源

Springboot使用mybatis框架配置多資料來源

在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指定對應的介面類名稱即可。

測試無問題後,以同樣的方式建立第二個資料來源即可。