springboot配置多個數據源


在我們的實際業務中可能會遇到;在一個項目里面讀取多個數據庫的數據來進行展示,spring對同時配置多個數據源是支持的。

使用到的框架:springboot+mybatis

方法:在配置文件中配置多個數據源,然后通過配置類來獲取數據源以及mapper相關的掃描配置

1.pom.xml

 1 <parent>
 2         <groupId>org.springframework.boot</groupId>
 3         <artifactId>spring-boot-starter-parent</artifactId>
 4         <version>1.5.9.RELEASE</version>
 5         <relativePath/>
 6     </parent>
 7   <dependencies>
 8               <!-- druid數據源驅動 -->
 9             <dependency>
10                <groupId>com.alibaba</groupId>
11                <artifactId>druid-spring-boot-starter</artifactId>
12                <version>1.1.0</version>
13             </dependency>
14               <dependency>
15                 <groupId>mysql</groupId>
16                 <artifactId>mysql-connector-java</artifactId>
17             </dependency>
18             <!--mybatis SpringBoot依賴 -->
19             <dependency>
20             <groupId>org.springframework.boot</groupId>
21             <artifactId>spring-boot-starter-web</artifactId>
22         </dependency>
23         
24         <dependency>
25             <groupId>org.springframework.boot</groupId>
26             <artifactId>spring-boot-starter-tomcat</artifactId>
27             <scope>compile</scope>
28         </dependency>
29         
30         <dependency>
31             <groupId>org.springframework.boot</groupId>
32             <artifactId>spring-boot-starter-test</artifactId>
33         </dependency>
34         
35         <!-- aop依賴 -->
36         <dependency>
37             <groupId>org.springframework.boot</groupId>
38             <artifactId>spring-boot-starter-aop</artifactId>
39         </dependency>
40         
41         <!-- mybatis -->
42         <dependency>
43             <groupId>org.mybatis.spring.boot</groupId>
44             <artifactId>mybatis-spring-boot-starter</artifactId>
45             <version>1.3.1</version>
46         </dependency>
47         
48         <!-- 通用mapper -->
49         <dependency>
50             <groupId>tk.mybatis</groupId>
51             <artifactId>mapper-spring-boot-starter</artifactId>
52             <version>1.1.5</version>
53         </dependency>
54             <!-- druid監控依賴 -->
55             <dependency>
56                 <groupId>com.alibaba</groupId>
57                 <artifactId>druid</artifactId>
58                 <version>1.0.28</version>
59             </dependency>
60   </dependencies>

2.application.yml

 1 spring:
 2   datasource:
 3     type: com.alibaba.druid.pool.DruidDataSource
 4     driverClassName: com.mysql.jdbc.Driver
 5     
 6     url: jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=utf8
 7     username: root
 8     password: 123456
 9     
10     url2: jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf8
11     username2: root
12     password2: 123456

3.DruidDBConfig 連接池相關配置

 1 package com.xbz.common.config;
 2  
 3 import com.alibaba.druid.support.http.StatViewServlet;
 4 import com.alibaba.druid.support.http.WebStatFilter;
 5 import org.slf4j.Logger;
 6 import org.slf4j.LoggerFactory;
 7 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 8 import org.springframework.boot.web.servlet.ServletRegistrationBean;
 9 import org.springframework.context.annotation.Bean;
10 import org.springframework.context.annotation.Configuration;
11  
12 /**
13  * Druid監控
14  */
15 @SuppressWarnings("AlibabaRemoveCommentedCode")
16 @Configuration
17 public class DruidDBConfig {
18     private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class);
19  
20     /**
21      * 注冊ServletRegistrationBean
22      * @return
23      */
24     @Bean
25     public ServletRegistrationBean druidServlet() {
26         ServletRegistrationBean reg = new ServletRegistrationBean();
27         reg.setServlet(new StatViewServlet());
28         reg.addUrlMappings("/druid/*");
29         reg.addInitParameter("allow", ""); //白名單
30         return reg;
31     }
32  
33     /**
34      * 注冊FilterRegistrationBean
35      * @return
36      */
37     @Bean
38     public FilterRegistrationBean filterRegistrationBean() {
39         FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
40         filterRegistrationBean.setFilter(new WebStatFilter());
41         filterRegistrationBean.addUrlPatterns("/*");
42         filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
43         filterRegistrationBean.addInitParameter("profileEnable", "true");
44         filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE");
45         filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION");
46         filterRegistrationBean.addInitParameter("DruidWebStatFilter", "/*");
47         return filterRegistrationBean;
48     }
49 }

4.MasterDbConfig 注意讀取數據庫連接相關的鍵,以及掃描實體、mapper等

 1 package com.xbz.common.config;
 2  
 3 import com.alibaba.druid.pool.DruidDataSource;
 4 import org.apache.ibatis.session.SqlSessionFactory;
 5 import org.mybatis.spring.SqlSessionFactoryBean;
 6 import org.mybatis.spring.annotation.MapperScan;
 7 import org.slf4j.Logger;
 8 import org.slf4j.LoggerFactory;
 9 import org.springframework.beans.factory.annotation.Qualifier;
10 import org.springframework.beans.factory.annotation.Value;
11 import org.springframework.context.annotation.Bean;
12 import org.springframework.context.annotation.Configuration;
13 import org.springframework.context.annotation.Primary;
14 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
15 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
16  
17 import javax.sql.DataSource;
18 import java.sql.SQLException;
19  
20  
21 @Configuration
22 @MapperScan(basePackages  = MasterDbConfig.PACKAGE , sqlSessionFactoryRef = "masterSqlSessionFactory")
23 public class MasterDbConfig {
24     private Logger logger = LoggerFactory.getLogger(MasterDbConfig.class);
25     // 精確到 master 目錄,以便跟其他數據源隔離
26     static final String PACKAGE = "com.xbz.**.dao.master";
27     private static final String MAPPER_LOCATION = "classpath*:mapper/master/*.xml";
28     private static final String DOMAIN_PACKAGE = "com.xbz.**.domain";
29  
30     @Value("${spring.datasource.url}")
31     private String dbUrl;
32  
33     @Value("${spring.datasource.username}")
34     private String username;
35  
36     @Value("${spring.datasource.password}")
37     private String password;
38  
39     @Value("${spring.datasource.driverClassName}")
40     private String driverClassName;
41  
42  
43     @Bean(name="masterDataSource")   //聲明其為Bean實例
44     @Primary  //在同樣的DataSource中,首先使用被標注的DataSource
45     public DataSource masterDataSource() {
46         DruidDataSource datasource = new DruidDataSource();
47  
48         datasource.setUrl(this.dbUrl);
49         datasource.setUsername(username);
50         datasource.setPassword(password);
51         datasource.setDriverClassName(driverClassName);
52  
53         return datasource;
54     }
55  
56     @Bean(name = "masterTransactionManager")
57     @Primary
58     public DataSourceTransactionManager masterTransactionManager() {
59         return new DataSourceTransactionManager(masterDataSource());
60     }
61  
62     @Bean(name = "masterSqlSessionFactory")
63     @Primary
64     public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
65             throws Exception {
66         final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
67         sessionFactory.setDataSource(masterDataSource);
68         sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
69                 .getResources(MasterDbConfig.MAPPER_LOCATION));
70         sessionFactory.setTypeAliasesPackage(DOMAIN_PACKAGE);
71         //mybatis 數據庫字段與實體類屬性駝峰映射配置
72         sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
73         return sessionFactory.getObject();
74     }
75 }

5.ClusterDbConfig 

 1 package com.xbz.common.config;
 2  
 3 import com.alibaba.druid.pool.DruidDataSource;
 4 import org.apache.ibatis.session.SqlSessionFactory;
 5 import org.mybatis.spring.SqlSessionFactoryBean;
 6 import org.mybatis.spring.annotation.MapperScan;
 7 import org.slf4j.Logger;
 8 import org.slf4j.LoggerFactory;
 9 import org.springframework.beans.factory.annotation.Qualifier;
10 import org.springframework.beans.factory.annotation.Value;
11 import org.springframework.context.annotation.Bean;
12 import org.springframework.context.annotation.Configuration;
13 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
14 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
15  
16 import javax.sql.DataSource;
17 import java.sql.SQLException;
18  
19 /**
20  * 從數據源配置
21  * 若需要配置更多數據源 , 直接在yml中添加數據源配置再增加相應的新的數據源配置類即可
22  */
23 @Configuration
24 @MapperScan(basePackages  = ClusterDbConfig.PACKAGE , sqlSessionFactoryRef = "clusterSqlSessionFactory")
25 public class ClusterDbConfig {
26     private Logger logger = LoggerFactory.getLogger(ClusterDbConfig.class);
27     // 精確到 cluster 目錄,以便跟其他數據源隔離
28     static final String PACKAGE = "com.xbz.**.dao.cluster";
29     private static final String MAPPER_LOCATION = "classpath*:mapper/cluster/*.xml";
30     private static final String DOMAIN_PACKAGE = "com.xbz.**.domain";
31  
32     @Value("${spring.datasource.url2}")
33     private String dbUrl;
34  
35     @Value("${spring.datasource.username2}")
36     private String username;
37  
38     @Value("${spring.datasource.password2}")
39     private String password;
40  
41     @Value("${spring.datasource.driverClassName}")
42     private String driverClassName;
43  
44     
45  
46     @Bean(name="clusterDataSource")   //聲明其為Bean實例
47     public DataSource clusterDataSource() {
48         DruidDataSource datasource = new DruidDataSource();
49  
50         datasource.setUrl(this.dbUrl);
51         datasource.setUsername(username);
52         datasource.setPassword(password);
53         datasource.setDriverClassName(driverClassName);
54         return datasource;
55     }
56  
57     @Bean(name = "clusterTransactionManager")
58     public DataSourceTransactionManager clusterTransactionManager() {
59         return new DataSourceTransactionManager(clusterDataSource());
60     }
61  
62     @Bean(name = "clusterSqlSessionFactory")
63     public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("clusterDataSource") DataSource culsterDataSource)
64             throws Exception {
65         final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
66         sessionFactory.setDataSource(culsterDataSource);
67         sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
68                 .getResources(ClusterDbConfig.MAPPER_LOCATION));
69         sessionFactory.setTypeAliasesPackage(DOMAIN_PACKAGE);
70         //mybatis 數據庫字段與實體類屬性駝峰映射配置
71         sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
72         return sessionFactory.getObject();
73     }
74 }

 

 

6.不同的數據源配置不佟的mapper掃描位置,然后需要哪一個數據源就注入哪一個mapper接口即可

 

 這樣獲取的數據就是來自不同的數據源了,這種方法比較簡單。

參考文章:https://blog.csdn.net/qq_38058332/article/details/84325009  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM