Spring Boot入門系列(二十三)整合Mybatis實現多數據源配置,可能遇到的坑!
之前介紹了Spring Boot 整合mybatis 使用注解方式配置的方式實現增刪改查以及一些復雜自定義的sql 語句 。想必大家對spring boot 項目中,如何使用mybatis 有了一定的了解。但在很多業(yè)務場景下,我們需要在一個項目中配置多個數據源來實現業(yè)務邏輯,例如:現有電商業(yè)務,商品和庫存數據分別放在不同的數據庫中,這就要求我們的系統(tǒng)架構支持同時配置多個數據源實現相關業(yè)務操作。那么Spring Boot 如何應對這種多數據源的場景呢?其實,在 Spring Boot 項目中配置多數據源十分便捷。接下來就聊一聊 Spring Boot 整合mybatis 實現多數據源的相關配置。

關于整合mybatis 部分,之前已經介紹過,這里直接講 Mybatis 多數據源的配置的配置實現,不清楚的朋友可以看看之前的文章。
一、配置數據庫
首先在系統(tǒng)配置文件中,需要配置多個數據源,即在application.properties 文件中增加如下配置:
# mybatis 多數據源配置# 數據庫1的配置spring.datasource.test1.driver-class-name = com.mysql.jdbc.Driverspring.datasource.test1.jdbc-url = jdbc:mysql://localhost:3306/zwz_test?useUnicode=true&characterEncoding=utf-8&useSSL=falsespring.datasource.test1.username = rootspring.datasource.test1.password = root# 數據庫2的配置spring.datasource.test2.driver-class-name = com.mysql.jdbc.Driverspring.datasource.test2.jdbc-url = jdbc:mysql://localhost:3306/zwz_test2?useUnicode=true&characterEncoding=utf-8&useSSL=falsespring.datasource.test2.username = rootspring.datasource.test2.password = root
注意:
1、這里配置的是兩個一樣的數據庫zwz_test 和zwz_test2。
2、數據庫連接的配置使用jdbc-url , 不是之前的url ,這點需要注意。
二、數據源配置類
1、主數據源配置類
在config 包中,創(chuàng)建 DataSource1Config 類。此類配置主數據源。
package com.weiz.config;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;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.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;public class DataSource1Config {public DataSource testDataSource() {return DataSourceBuilder.create().build();}public SqlSessionFactory testSqlSessionFactory( DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}public DataSourceTransactionManager testTransactionManager( DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}public SqlSessionTemplate testSqlSessionTemplate( SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}}
2、配置其他數據源
在config 包中,創(chuàng)建DataSource2Config 類。此類配置其他普通數據源。
package com.weiz.config;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;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.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;public class DataSource2Config {public DataSource testDataSource() {return DataSourceBuilder.create().build();}public SqlSessionFactory testSqlSessionFactory( DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}public DataSourceTransactionManager testTransactionManager( DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}public SqlSessionTemplate testSqlSessionTemplate( SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}}
示例說明:
DataSource1Config 和 DataSource2Config 即是相關的主數據源配置類和普通數據源配置類。
com.weiz.mapper.test1 為 掃描的mapper的路徑。
可以看到兩個數據源都配置的各自的DataSource、SqlSessionFactory、TransactionManager和SqlSessionTemplate 。
雖然兩個類看著差不多,但是需要特別注意以下幾點:
1、主數據源配置需要加@Primary 注解,其他普通數據源不能加這個注解,否則會報錯,復制的時候小心。
2、各個數據源配置的 basePackages 掃描路徑需要配置正確。配置錯了不會出異常,但是運行的時候,會找錯數據庫。
三、如何使用多數據源
首先,創(chuàng)建com.weiz.mapper.test1 和 com.weiz.mapper.test2 包,將之前的UserMapper ,重名命為User1Mapper 和User2Mapper 復制到相應的包中。
然后,UserServiceImpl 分別注入兩個不同的 Mapper,想操作哪個數據源就使用哪個數據源的 Mapper 進行操作處理。
package com.weiz.service.impl;import com.weiz.mapper.test1.User1Mapper;import com.weiz.mapper.test2.User2Mapper;import com.weiz.pojo.User;import com.weiz.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class UserServiceImpl implements UserService {@Autowiredprivate User1Mapper user1Mapper;@Autowiredprivate User2Mapper user2Mapper;@Overridepublic int saveUser(User user) {user1Mapper.insert(user);return user2Mapper.insert(user);}@Overridepublic int updateUser(User user) {user1Mapper.updateByPrimaryKey(user);return user2Mapper.updateByPrimaryKey(user);}@Overridepublic int deleteUser(String userId) {user1Mapper.deleteByPrimaryKey(userId);return user2Mapper.deleteByPrimaryKey(userId);}@Overridepublic User queryUserById(String userId) {user1Mapper.selectByPrimaryKey(userId);return user2Mapper.selectByPrimaryKey(userId);}}
這里是一個簡單的測試程序,實際項目中是根據實際的業(yè)務,調用不同的mapper 實現的,或者通過注解配置,動態(tài)切換數據源。
四、測試
啟動項目,瀏覽器中輸入如下地址:
http://localhost:8088/mybatis/saveuser ,可以看到兩個數據庫中,都增加了一條用戶信息。
數據庫 zwz_test 中 用戶表sys_user 增加了一條記錄。

數據庫 zwz_test2 中 用戶表sys_user 也增加了一條同樣的記錄。

四、可能會遇到的坑
1、數據庫連接的配置使用jdbc-url , 不是之前的url 。這點需要注意。
2、主數據源配置需要加@Primary 注解,其他普通數據源不能加這個注解,否則會報錯,復制的時候小心。
3、各個數據源配置的 basePackages 掃描路徑需要配置正確。配置錯了不會出異常,但是運行的時候,會找錯數據庫。
4、如果Mybatis使用的是xml 配置版,xml位置需要在每個config顯示位置。
最后
以上,就把Spring Boot整合Mybatis,實現多數據源配置的功能介紹完了。操作看似簡單,其實還是得小心仔細。不然很容易出錯。
此外配置多數據源之后,還涉及到數據源切換的問題,網上有很多種方法,比較流行的就是druid框架實現多數據源切換。這個后面再講吧。
還有,這里沒有使用事務,如果采用事務需要分別配置每個數據源的事務,并采用事務性注解進行統(tǒng)一管理。這里不細說大家自己研究吧。
這個系列課程的完整源碼,也會提供給大家。大家私信我(架構師精進),回復:springboot源碼。獲取這個系列課程的完整源碼。
推薦閱讀:
SpringBoot入門系列(三十一) 實現靜態(tài)文件、配置文件與jar分離
SpringBoot入門系列(三十)Spring Boot項目打包、發(fā)布與部署
SpringBoot入門系列(二十九)如何使用JdbcTemplate操作數據庫?
SpringBoot入門系列(二十八)使用Redis實現分布式Session共享
Spring Boot入門系列(二十一) 如何優(yōu)雅的設計Rest API版本號,實現API版本控制
Spring Boot入門系列(十九)集成mybatis,使用注解實現動態(tài)Sql、參數傳遞等常用操作!
Spring Boot入門系列(十八)mybatis 使用注解實現增刪改查,無需xml文件
Spring Boot入門系列(十七)Mybatis創(chuàng)建自定義mapper 實現多表關聯(lián)查詢!
Spring Boot入門系列(十六)整合pagehelper,一秒實現分頁功能!
Spring Boot入門系列(十五) SpringBoot開發(fā)環(huán)境熱部署的配置
Spring Boot入門系列(十三)統(tǒng)一日志處理!
Spring Boot入門系列(十一)如何整合Mybatis,實現增刪改查【XML 配置版】
Spring Boot入門系列(十)如何使用攔截器,一學就會!
SpringBoot入門系列(三)SpringBoot資源文件屬性配置
SpringBoot入門系列(二)Controller介紹及如何返回json數據
SpringBoot入門系列(一)如何快速創(chuàng)建SpringBoot項

