1. 程式人生 > >springboot mybatis 多數據源配置

springboot mybatis 多數據源配置

進行 figure resource path can sca mar pre esc

首先導入mybatis等包,這裏就不多說。

下面是配置多數據源和mybatis,每個數據源對應一套mybatis模板

數據源1:

 1 package com.aaaaaaa.config.datasource;
 2 
 3 import javax.sql.DataSource;
 4 
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.mybatis.spring.SqlSessionFactoryBean;
 7 import org.mybatis.spring.SqlSessionTemplate;
8 import org.mybatis.spring.annotation.MapperScan; 9 import org.springframework.beans.factory.annotation.Qualifier; 10 import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 11 import org.springframework.boot.context.properties.ConfigurationProperties; 12 import org.springframework.context.annotation.Bean;
13 import org.springframework.context.annotation.Configuration; 14 import org.springframework.context.annotation.Primary; 15 import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 16 import org.springframework.jdbc.datasource.DataSourceTransactionManager; 17 18 /** 19 *
20 * @desc 支持多數據源配置,復制一份代碼修改所有appdb即可<br> 21 * 以該數據源為主數據源。只能設置@Primary到一份數據源作為主數據源 22 * @author josnow 23 * @date 2018年1月12日 下午9:58:18 24 * @version 1.0.0 25 */ 26 @Configuration 27 @MapperScan(basePackages = "com.aaaaaaa.mapper.appdb", sqlSessionTemplateRef = "appdbSqlSessionTemplate") 28 public class DataSourceConfigappdb { 29 30 @Bean(name = "appdbDataSource") 31 @ConfigurationProperties(prefix = "spring.datasource.appdb") 32 @Primary 33 public DataSource testDataSource() { 34 return DataSourceBuilder.create().build(); 35 } 36 37 @Bean(name = "appdbSqlSessionFactory") 38 @Primary 39 public SqlSessionFactory testSqlSessionFactory(@Qualifier("appdbDataSource") DataSource dataSource) 40 throws Exception { 41 SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); 42 bean.setDataSource(dataSource); 43 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/appdb/*.xml")); 44 return bean.getObject(); 45 } 46 47 @Bean(name = "appdbTransactionManager") 48 @Primary 49 public DataSourceTransactionManager testTransactionManager(@Qualifier("appdbDataSource") DataSource dataSource) { 50 return new DataSourceTransactionManager(dataSource); 51 } 52 53 @Bean(name = "appdbSqlSessionTemplate") 54 @Primary 55 public SqlSessionTemplate testSqlSessionTemplate( 56 @Qualifier("appdbSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { 57 return new SqlSessionTemplate(sqlSessionFactory); 58 } 59 60 }

就這樣配置完了第一個數據源和mybatis。

第一個數據源由appdbTransactionManager來管理事務,在使用事務的時候用@Transactional(value = "appdbTransactionManager")註解來表明使用哪個事務管理器。

這裏並未采用分布式事務管理器,分布式事務管理器是個大話題,如果你考慮分布式事務可以自己改造。

下面進行第二個數據源和mybatis的配置

 1 package com.aaaaaaa.config.datasource;
 2 
 3 import javax.sql.DataSource;
 4 
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.mybatis.spring.SqlSessionFactoryBean;
 7 import org.mybatis.spring.SqlSessionTemplate;
 8 import org.mybatis.spring.annotation.MapperScan;
 9 import org.springframework.beans.factory.annotation.Qualifier;
10 import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
11 import org.springframework.boot.context.properties.ConfigurationProperties;
12 import org.springframework.context.annotation.Bean;
13 import org.springframework.context.annotation.Configuration;
14 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
15 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
16 
17 @Configuration
18 @MapperScan(basePackages = "com.aaaaaaa.mapper.testdb", sqlSessionTemplateRef = "testdbSqlSessionTemplate")
19 public class DataSourceConfigtestdb {
20 
21     @Bean(name = "testdbDataSource")
22     @ConfigurationProperties(prefix = "spring.datasource.testdb")
23     public DataSource testDataSource() {
24         return DataSourceBuilder.create().build();
25     }
26 
27     @Bean(name = "testdbSqlSessionFactory")
28     public SqlSessionFactory testSqlSessionFactory(@Qualifier("testdbDataSource") DataSource dataSource)
29             throws Exception {
30         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
31         bean.setDataSource(dataSource);
32         bean.setMapperLocations(
33                 new PathMatchingResourcePatternResolver().getResources("classpath:mapper/testdb/*.xml"));
34         return bean.getObject();
35     }
36 
37     @Bean(name = "testdbTransactionManager")
38     public DataSourceTransactionManager testTransactionManager(@Qualifier("testdbDataSource") DataSource dataSource) {
39         return new DataSourceTransactionManager(dataSource);
40     }
41 
42     @Bean(name = "testdbSqlSessionTemplate")
43     public SqlSessionTemplate testSqlSessionTemplate(
44             @Qualifier("testdbSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
45         return new SqlSessionTemplate(sqlSessionFactory);
46     }
47 
48 }

看一下兩個數據源有哪些不同之處:

1:數據源2其實是由數據源1copy了一份代碼,並將全部appdb改為testdb

2:此外數據源1有@Primary註解,而數據源2沒有@Primary註解。使用@Primary註解是將數據源1作為默認數據源,並且多個數據源必須指定一個默認的數據源,否則會啟動報錯。

mybatis多數據源就是這麽簡單

springboot mybatis 多數據源配置