亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解SpringBoot Mybatis如何對接多數據源

 更新時間:2023年09月26日 09:10:15   作者:戰(zhàn)斧  
這篇文章主要為大家介紹了SpringBoot Mybatis如何對接多數據源實現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

在我們開發(fā)一些具有綜合功能的項目時,往往會碰到一種情況,需要同時連接多個數據庫,這個時候就需要用到多數據源的設計。而Spring 與 Myabtis 其實做了多數據源的適配,只需少許改動即可對接多數據源。本期我們就貼近實戰(zhàn),以一個單數據源的Demo為例,講述將其改為多數據源項目的過程,希望大家能有所體會

一、數據源的定義

數據源(Data Source)是指數據存儲的地方,大多數情況是指數據庫,不過文件服務器、傳感器、API等也能算數據源,主要是提供了對數據的訪問和操作。數據源中存儲了所有建立數據庫連接的信息。就像通過指定文件名稱可以在文件系統(tǒng)中找到文件一樣,通過提供正確的數據源名稱,你可以找到相應的數據庫連接

二、單數據源配置

因為SpringBoot對數據源有著高度的默認配置,只配置一個數據源時,該數據源會被作為默認,所以對接單數據源其實是非常簡單的。如果你的工程采用的yaml格式配置文件,我們僅需做如下配置:

spring:
  #數據庫連接配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springtest
    username: root
    password: root

如果是采用properties配置文件的也是一樣的:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springtest
spring.datasource.username=root
spring.datasource.password=root

三、如何配置多數據源

1. 工程層級調整

我們以曾經搭建的工程為原始模板,進行對接多數據源的操作。沒看過的可以點此查看: 從零開始,手把手教你搭建Spring Boot后臺工程并說明

因為僅變動數據源,所以我們不改動其他層級,僅僅將 mapper 拆為 mapper1 與 mapper2 兩部分

2. Spring項目配置

然后我們需要在 application.properties 或者 application.yml 中定義多個數據源:

spring:
  #數據庫連接配置
  datasource1:
    driver-class-name: com.mysql.cj.jdbc.Driver
    jdbc-url: jdbc:mysql://127.0.0.1:3306/springtest2
    username: root
    password: root
  datasource2:
    driver-class-name: com.mysql.cj.jdbc.Driver
    jdbc-url: jdbc:mysql://127.0.0.1:3306/springtest
    username: root
    password: root

這里有兩個細節(jié)需要注意:

  • 因為我們決定使用雙數據源,所以把數據源的連接配置改成了datasource1 和 datasource2。而不再保留datasource,這樣SpringBoot就不再會為我們設定默認數據庫
  • 因為我們目前采用的 springBoot2.5.2,默認的連接池為Hikari,該連接池數據源的地址字段為jdbc-url 而非 url。在只有單個數據源時,SpringBoot走默認數據源邏輯為我們把 url 與 jdbc-url 進行映射,保證我們獲得數據源。此時我們自己設置的數據源沒有進行映射處理,就需要保證字段符合Hikari的要求。否則會出現(xiàn) java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName 異常

3. 會話配置

僅有配置文件可不行,接下來,我們需要在代碼中讀取到配置,并建立兩個數據源。如下,每個數據源都有隔離的mapper接口、xml文件、會話工廠及會話模板

第一個數據源 如下(示例):

@Configuration
@MapperScan(basePackages = "com.zhanfu.springboot.demo.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1")
public class DataSource1Config {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource1")
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }
    @Bean
    public SqlSessionFactory sqlSessionFactory1() throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource1());
        String locationPattern = "classpath*:/mapper1/*.xml";
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));
        return sessionFactoryBean.getObject();
    }
    @Bean(name = "sqlSessionTemplate1")
    public SqlSessionTemplate sqlSessionTemplate1(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

配置第二個數據源 DataSource2Config

@Configuration
@MapperScan(basePackages = "com.zhanfu.springboot.demo.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2")
public class DataSource2Config {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource2")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }
    @Bean
    public SqlSessionFactory sqlSessionFactory2() throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource2());
        String locationPattern = "classpath*:/mapper2/*.xml";
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));
        return sessionFactoryBean.getObject();
    }
    @Bean(name = "sqlSessionTemplate2")
    public SqlSessionTemplate sqlSessionTemplate2(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    @Bean(name = "productMapper")
    public ProductMapper mapper2(@Qualifier("sqlSessionTemplate2") SqlSessionTemplate sqlSessionTemplate) throws Exception {
        return sqlSessionTemplate.getMapper(ProductMapper.class);
    }
}

4. 事務管理器

為兩個數據源分別配置自己的事務管理器,如果你的項目里通篇沒有方法級別的事務(一個SQL就是一個事務),那不設置這個也不影響,否則還是建議加上。

@Configuration
public class TransactionManagerConfig {
    @Autowired
    private DataSource dataSource1;
    @Autowired
    private DataSource dataSource2;
    @Bean
    public PlatformTransactionManager txManager1() {
        return new DataSourceTransactionManager(dataSource1);
    }
    @Bean
    public PlatformTransactionManager txManager2() {
        return new DataSourceTransactionManager(dataSource2);
    }
}

四、驗證

我們把兩張表拆進兩個庫中,以兩個庫模擬兩個數據源,使得程序可以同時連接兩個庫

瀏覽器輸入 http://127.0.0.1:8080/user/findall 查詢接口成功

再在瀏覽器輸入 http://127.0.0.1:8080/product/findall 查詢第二個庫的數據亦成功返回

這樣我們就完成了一個工程同時連接兩個數據源。

總結

經過上述的操作,我們已經成功把項目對接了多數據源。當然,方案肯定不止這一種,后續(xù)圍繞該問題,我們還會講解其他方式。但不論是什么方式,主旨都是加深大家對SpringBoot 和 Mybatis的理解,我們曾經梳理過全流程,但只是蜻蜓點水帶大家看一遍大體輪廓,并不足以讓你精通,后面本專欄將繼續(xù)深入講解,更多關于SpringBoot Mybatis對接多數據源的資料請關注腳本之家其它相關文章!

相關文章

  • springboot整合xxl-job的實現(xiàn)示例

    springboot整合xxl-job的實現(xiàn)示例

    本文主要介紹了springboot整合xxl-job的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • SpringLDAP連接LDAPS證書報錯問題及解決

    SpringLDAP連接LDAPS證書報錯問題及解決

    這篇文章主要介紹了SpringLDAP連接LDAPS證書報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • IDEA2020如何打開Run Dashboard的方法步驟

    IDEA2020如何打開Run Dashboard的方法步驟

    這篇文章主要介紹了IDEA2020如何打開Run Dashboard的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Spring?MVC基于注解的使用之JSON數據處理的方法

    Spring?MVC基于注解的使用之JSON數據處理的方法

    這篇文章主要介紹了Spring?MVC基于注解的使用JSON數據處理,json是一種輕量級的數據交換格式,是一種理想的數據交互語言,它易于閱讀和編寫,同時也易于機器解析和生成,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • Java Synchronized鎖升級原理及過程剖析

    Java Synchronized鎖升級原理及過程剖析

    這篇文章主要為大家詳細介紹一下Java中Synchronized鎖升級原理及過程,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習學習
    2022-08-08
  • Java(enum)枚舉用法詳解

    Java(enum)枚舉用法詳解

    本篇文章主要介紹了Java 枚舉用法詳解,枚舉的好處:可以將常量組織起來,統(tǒng)一進行管理。有興趣的可以一起來了解一下。
    2016-11-11
  • SparkStreaming-Kafka通過指定偏移量獲取數據實現(xiàn)

    SparkStreaming-Kafka通過指定偏移量獲取數據實現(xiàn)

    這篇文章主要為大家介紹了SparkStreaming-Kafka通過指定偏移量獲取數據,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Java8中對于LocalDateTime的序列化和反序列化問題

    Java8中對于LocalDateTime的序列化和反序列化問題

    這篇文章主要介紹了Java8中對于LocalDateTime的序列化和反序列化問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • SpringBoot中動態(tài)數據源是實現(xiàn)與用途

    SpringBoot中動態(tài)數據源是實現(xiàn)與用途

    這篇文章主要是來和大家討論一下SpringBoot中動態(tài)數據源是實現(xiàn)與用途,文中的示例代碼簡潔易懂,具有一定的學習價值,感興趣的可以了解一下
    2023-08-08
  • 使用Assembly打包和部署SpringBoot工程方式

    使用Assembly打包和部署SpringBoot工程方式

    文章介紹了SpringBoot項目的兩種部署方式:Docker容器部署和FatJar直接部署,FatJar部署存在配置文件隱藏和啟動腳本復雜的問題,而Assembly打包方式可以解決這些問題,使得SpringBoot能夠加載jar外的配置文件并提供服務化的啟動腳本
    2024-12-12

最新評論