[SpringBoot]快速配置多數據源(整合MyBatis)

[SpringBoot]快速配置多數據源(整合MyBatis)

前言

因爲業務需求,須要同時在SpringBoot中配置兩套數據源(鏈接兩個數據庫),要求能作到service層在調用各數據庫表的mapper時可以自動切換數據源,也就是mapper自動訪問正確的數據庫。mysql

本文內容:web

  • 在Springboot+Mybatis項目的基礎上,學習多數據源的快速配置
  • 避免網上某些配置數據源文章的深坑

SpringBoot實戰系列教程回顧:算法

  • SpringCache + Redis實現數據緩存spring

  • [Springboot]發送郵件、重置密碼業務實戰sql

  • [Springboot]整合ElasticSearch實現數據模糊搜索(Logstash同步Mysql數據)

正文

多數據源配置實戰(整合MyBatis)

SpringBoot版本:2.0.6.RELEASE數據庫

項目結構圖(原諒我保護隱私代碼):
[SpringBoot]快速配置多數據源(整合MyBatis)
image.png後端

排除SpringBoot的自動配置類DataSourceAutoConfiguration

首先要在@SpringBootApplication排除該類,由於它會讀取application.properties文件的spring.datasource.*屬性並自動配置單數據源緩存

@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class
})

在application.properties中配置多數據源鏈接信息

你須要鏈接多少個數據庫源,就配置幾個,名字能夠自由命名代替db1,db2安全

# database
db.conn.str = useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useLocalSessionState=true&tinyInt1isBit=false

spring.datasource.db1.jdbc-url=jdbc:mysql://xxxx1:xxxx/xxxxx1?${db.conn.str}
spring.datasource.db1.username=xxxxx
spring.datasource.db1.password=xxxxx
spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.db2.jdbc-url=jdbc:mysql://xxxxx2:xxxx/xxxxx2?${db.conn.str}
spring.datasource.db2.username=xxxxx
spring.datasource.db2.password=xxxxx
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver

注意:這裏請必定將spring.datasource.db1.url改成spring.datasource.db1.jdbc-urlspringboot

官方文檔的解釋是:由於鏈接池的實際類型沒有被公開,因此在您的自定義數據源的元數據中沒有生成密鑰,並且在IDE中沒有完成(由於DataSource接口沒有暴露屬性)。另外,若是您碰巧在類路徑上有Hikari,那麼這個基本設置就不起做用了,由於Hikari沒有url屬性(可是確實有一個jdbcUrl屬性)。在這種狀況下,您必須重寫您的配置以下:

手動建立數據庫配置類

因爲咱們禁掉了自動數據源配置,由於下一步就須要手動將這些數據源建立出來,建立DataSourceConfig類

@Configuration
public class DataSourceConfig {

    @Bean(name = "db1")
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource businessDbDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "db2")
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource newhomeDbDataSource() {
        return DataSourceBuilder.create().build();
    }
}

分別配置不一樣數據源的mybatis的SqlSessionFactory

這樣作可讓咱們的不一樣包名底下的mapper自動使用不一樣的數據源

建立Db1Config:

/**
 * @author yangzhendong01
 */
@Configuration
@MapperScan(basePackages = {"com.xxxxx.webApi.mapper.db1"}, sqlSessionFactoryRef = "sqlSessionFactoryDb1")
public class Db1Config {

    @Autowired
    @Qualifier("db1")
    private DataSource dataSourceDb1;

    @Bean
    public SqlSessionFactory sqlSessionFactoryDb1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSourceDb1);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db1/*.xml"));
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplateDb1() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryDb1());
    }

}

建立Db2Config:

/**
 * @author yangzhendong01
 */
@Configuration
@MapperScan(basePackages = {"com.xxxxx.webApi.mapper.db2"}, sqlSessionFactoryRef = "sqlSessionFactoryDb2")
public class Db2Config {

    @Autowired
    @Qualifier("db2")
    private DataSource dataSourceDb2;

    @Bean
    public SqlSessionFactory sqlSessionFactoryDb2() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSourceDb2);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/*.xml"));
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplateDb2() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryDb2());
    }

}

注意:此步必定要添加mapper.xml文件掃描路徑,不然報錯Invalid bound statement (not found)

factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/xxxxxx/*.xml"));

完成這些配置後,假設咱們有2個Mapper :

mapper.db1.xxxMapper和mapper.db2.xxxMapper

咱們在程序的任何位置使用前者時會自動鏈接db1庫,後者鏈接db2庫。

參考文獻

主要參考:

https://blog.csdn.net/neosmith/article/details/61202084

其餘參考:

http://blog.didispace.com/springbootmultidatasource/

總結

本文在一個Springboot+Mybatis項目的基礎上,學習多數據源的快速配置。

祝你們國慶節假期快樂!

關注我

我目前是一名後端開發工程師。主要關注後端開發,數據安全,邊緣計算等方向。

微信:yangzd1102(請註明來意)

Github:@qqxx6661

我的博客:

  • CSDN:@Rude3Knife
  • 知乎:@Zhendong
  • 簡書:@蠻三刀把刀
  • 掘金:@蠻三刀把刀

原創博客主要內容

  • Java知識點複習全手冊
  • Leetcode算法題解析
  • 劍指offer算法題解析
  • SpringCloud菜鳥入門實戰系列
  • SpringBoot菜鳥入門實戰系列
  • 爬蟲相關技術文章
  • 後端開發相關技術文章

我的公衆號:後端技術漫談

[SpringBoot]快速配置多數據源(整合MyBatis)
公衆號201992.jpg

若是文章對你有幫助,不妨收藏起來並轉發給您的 朋友們~

相關文章
相關標籤/搜索