最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成Mybatis實(shí)現(xiàn)對(duì)多數(shù)據(jù)源訪問原理

 更新時(shí)間:2023年11月20日 08:55:25   作者:毅航  
本文主要分析討論在SpringBoot應(yīng)用中我們?cè)撊绾闻渲肧qlSessionFactoryBean對(duì)象,進(jìn)而實(shí)現(xiàn)對(duì)多個(gè)不同的數(shù)據(jù)源的操縱,文章通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下

注意?:SpringBoot實(shí)際上連接多數(shù)據(jù)源的方式有很多種,也有很多成熟的技術(shù)選型,本文所提供的思路僅是為了幫助讀者加深SqlSessionFactoryBean的理解和使用。

什么是多數(shù)據(jù)源

在現(xiàn)代軟件架構(gòu)中,多數(shù)據(jù)源指的是應(yīng)用程序配置和連接到多個(gè)數(shù)據(jù)庫實(shí)例的能力。這種架構(gòu)允許應(yīng)用程序根據(jù)不同的業(yè)務(wù)需求、數(shù)據(jù)類型或性能要求,與多個(gè)獨(dú)立的數(shù)據(jù)庫環(huán)境交互。在實(shí)現(xiàn)上,每個(gè)數(shù)據(jù)源都有自己的連接池、事務(wù)管理和數(shù)據(jù)訪問對(duì)象。

上述專業(yè)定義可能有些晦澀難懂,其實(shí)你完全可以將多數(shù)據(jù)源的概念可以類比于一個(gè)大型學(xué)校里有多個(gè)圖書館和圖書管理員的情況。每個(gè)圖書館(數(shù)據(jù)源)由不同的圖書管理員(數(shù)據(jù)庫管理系統(tǒng))負(fù)責(zé),管理著特定類型的書籍(數(shù)據(jù))。

比如,一個(gè)圖書館可能專注于科學(xué)書籍,而另一個(gè)專門存放文學(xué)作品。這樣的安排不僅提高了查找信息的效率——因?yàn)槊總€(gè)管理員都對(duì)自己的領(lǐng)域非常了解,同時(shí)還增強(qiáng)了安全性——因?yàn)榭梢詾椴煌愋偷臄?shù)據(jù)設(shè)置不同級(jí)別的保護(hù)。

隨著學(xué)校(業(yè)務(wù))的發(fā)展,可能需要新的圖書館來容納更多的書籍(數(shù)據(jù)),這時(shí)多圖書館的布局就顯得尤為重要??偠灾?,多數(shù)據(jù)源在軟件應(yīng)用中的作用就像這些圖書館和圖書管理員一樣,確保數(shù)據(jù)的有效管理、安全和高效訪問。"

如上這張圖就反映了應(yīng)用中多數(shù)據(jù)源和單數(shù)據(jù)源之間的區(qū)別。接下來,我們就來分析在SpringBoot應(yīng)用中,如何通過配置SqlSessionFactoryBean來實(shí)現(xiàn)多數(shù)據(jù)源的連接。

環(huán)境搭建

工欲善其事必先利其器,開始動(dòng)手之前我們先來對(duì)構(gòu)建案例所需的環(huán)境進(jìn)行一個(gè)簡(jiǎn)單的介紹。后續(xù)案例所需的關(guān)鍵依賴如下:

  • SpringBoot的構(gòu)建web應(yīng)用的關(guān)鍵依賴:Spring-boot-starter-web
  • SpringBoot整合Mybatis的關(guān)鍵Startermybatis-spring-boot-starter
  • mysqljdbc連接依賴:mysql-connector-java
  • 數(shù)據(jù)連接池druiddruid-spring-boot-starter

項(xiàng)目整體結(jié)構(gòu)如下:

  • dao1:數(shù)據(jù)源1所對(duì)應(yīng)的數(shù)據(jù)Mapper接口;
  • dao2:數(shù)據(jù)源2所對(duì)應(yīng)的數(shù)據(jù)Mapper接口;
  • config: 通過@Configuration標(biāo)注的配置類信息。

除此之外,我們還需要準(zhǔn)備兩個(gè)數(shù)據(jù)源信息,在此筆者準(zhǔn)了如下所示的test_dbtest_db1兩個(gè)數(shù)據(jù)庫,其內(nèi)部均有一張t_user的數(shù)據(jù)表。

t_user數(shù)據(jù)表包含nametype兩個(gè)字段信息。

實(shí)戰(zhàn)雙數(shù)據(jù)源配置

在開始之前,我們先來簡(jiǎn)單回顧下SpringBoot集成Mybatis時(shí)在連接單數(shù)據(jù)源時(shí)是如何進(jìn)行配置的:

spring:
  datasource:
    username: root
    password: root
    # allowMultiQueries表示支持執(zhí)行;間隔的多個(gè)sql nullCatalogMeansCurrent=true返回指定庫涉及的表
    jdbc-url: jdbc:mysql://127.0.0.1:3306/test_db?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&tcpKeepAlive=true&autoReconnect=true&allowMultiQueries=true&nullCatalogMeansCurrent=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 使用的連接池的類型
    type: com.alibaba.druid.pool.DruidDataSource

在上述配置文件中,我們主要配置了如下內(nèi)容:

  • 數(shù)據(jù)庫URL (spring.datasource.url): 這是數(shù)據(jù)庫服務(wù)器的地址和數(shù)據(jù)庫名。它通常包含協(xié)議(例如jdbc:mysql:)、主機(jī)地址、端口號(hào)(對(duì)于MySQL,默認(rèn)是3306),以及要連接的數(shù)據(jù)庫名。例如: jdbc:mysql://localhost:3306/test_db
  • 用戶名 (spring.datasource.username): 用于連接數(shù)據(jù)庫的用戶名。
  • 密碼 (spring.datasource.password): 用于連接數(shù)據(jù)庫的密碼。
  • 驅(qū)動(dòng)類名 (spring.datasource.driver-class-name): 這是JDBC驅(qū)動(dòng)的完整類名,它用于告訴Spring Boot應(yīng)用程序使用哪種數(shù)據(jù)庫。例如,對(duì)于MySQL,通常是com.mysql.cj.jdbc.Driver。

當(dāng)我們配置多數(shù)據(jù)源時(shí),配置文件需要做如下的修改:

spring:
# 數(shù)據(jù)源1
  primary:
    username: root
    password: root
    jdbc-url: jdbc:mysql://127.0.0.1:3306/test_db?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&tcpKeepAlive=true&autoReconnect=true&allowMultiQueries=true&nullCatalogMeansCurrent=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 使用的連接池的類型
    type: com.alibaba.druid.pool.DruidDataSource
# 數(shù)據(jù)源2
  slave:
    username: root
    password: root
    jdbc-url: jdbc:mysql://127.0.0.1:3306/test_db1?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&tcpKeepAlive=true&autoReconnect=true&allowMultiQueries=true&nullCatalogMeansCurrent=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
   

此時(shí),我們將之前配置文件中datasource改為了primary 和  slave,這樣SpringBoot 就不再會(huì)為我們?cè)O(shè)定默認(rèn)數(shù)據(jù)庫。與此同時(shí),我們將url改為了jdbc-url。這是因?yàn)?當(dāng)只有單個(gè)數(shù)據(jù)源時(shí),SpringBoot 會(huì)默認(rèn)將url 映射為 jdbc-url 進(jìn)行映射,進(jìn)而保證我們獲得數(shù)據(jù)源的成功注入。

此外,由于我們不再使用SpringBoot的默認(rèn)配置來加載數(shù)據(jù)源,所以需要手動(dòng)設(shè)置的數(shù)據(jù)源的連接地址,如果不進(jìn)行修改,則會(huì)導(dǎo)致項(xiàng)目無法啟動(dòng),進(jìn)而出現(xiàn) jdbcUrl is required with driverClassName 的異常。

處理好配置文件后,我們需要構(gòu)建出DataSourceSqlSessionFactory從而實(shí)現(xiàn)對(duì)SqlSessionFactoryBean的定制化配置,其具體配置如下:

@Configuration
@MapperScan(basePackages = "com.example.dao1", sqlSessionFactoryRef = "sqlSessionFactory1")
public class DataSource1Config {

    @Bean
    @ConfigurationProperties(prefix = "spring.primary")
    public DataSource dataSourcePrimary() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory1() throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSourcePrimary());
        String locationPattern = "classpath*:/mapperPrimary/*.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);
    }
}

當(dāng)我們期待使用Mybatis操作多數(shù)據(jù)源時(shí),對(duì)于不同的數(shù)據(jù)源,我們都需要定義不同的Mapper接口和XML映射文件,以確保最終生成的Mapper實(shí)現(xiàn)類可以操縱不同的數(shù)據(jù)源信息。所以,其中的dataSourcePrimary就是為了加載dataSourcePrimary指定的數(shù)據(jù)源信息,確保構(gòu)建的數(shù)據(jù)源最終連接到Primary中指定的數(shù)據(jù)庫信息。而在sqlSessionFactory的構(gòu)建中,則主要通過SqlSessionFactoryBean來構(gòu)建出一個(gè)SqlSessionFactory并注入容器,而在這一過程中需要設(shè)定Mapper接口所對(duì)應(yīng)的配置文件。

slave的配置可參考DataSource1Config進(jìn)行配置,在此便不進(jìn)行贅述。接下來,我們來看下最終的效果:

@RestController
@RequestMapping("/data")
@Slf4j
public class DataSourceController {

    @Autowired
    private User1Mapper userMapper;
    @Autowired
    private User2Mapper user2Mapper;

    @GetMapping("/get-user1/{name}")
    public User getUserFromTestDb(@PathVariable("name") String userName) {
        return userMapper.selectUser(userName);
    }

    @GetMapping("/get-user2/{name}")
    public User getUserFromTestDb2(@PathVariable("name") String userName) {
        return user2Mapper.selectUser(userName);
    }

}
  • getUserFromTestDb用于從數(shù)據(jù)源test_db獲取數(shù)據(jù)
  • getUserFromTestDb2用于從數(shù)據(jù)源test_db1獲取數(shù)據(jù)

最終效果如下:

訪問數(shù)據(jù)源1

訪問數(shù)據(jù)源2

總結(jié)

接下來,我們對(duì)上述程序用到的組件進(jìn)行一個(gè)簡(jiǎn)要的總結(jié)和回顧

  • 數(shù)據(jù)源(DataSource)。數(shù)據(jù)源是數(shù)據(jù)庫連接的工廠。在Spring中,DataSource對(duì)象負(fù)責(zé)提供數(shù)據(jù)庫連接。當(dāng)配置多個(gè)數(shù)據(jù)源時(shí),每個(gè)數(shù)據(jù)源都對(duì)應(yīng)不同的數(shù)據(jù)庫連接信息。例如,一個(gè)數(shù)據(jù)源可能連接到數(shù)據(jù)庫test_db,而另一個(gè)連接到數(shù)據(jù)庫test_db1。

  • Mybatis的SqlSessionFactory。SqlSessionFactoryMybatis中的一個(gè)核心組件,它負(fù)責(zé)創(chuàng)建SqlSession。SqlSession提供了執(zhí)行SQL命令、獲取映射器和管理事務(wù)的方法。在配置多個(gè)數(shù)據(jù)源的情況下,每個(gè)數(shù)據(jù)源都需要有對(duì)應(yīng)的SqlSessionFactory,以確保SQL操作能夠針對(duì)正確的數(shù)據(jù)庫執(zhí)行。

  • @MapperScan 注解的使用。該注解用于指定哪些包中的接口應(yīng)該被Mybatis識(shí)別為映射器(Mapper)。在多數(shù)據(jù)源配置中,可以使用不同的@MapperScan注解來指定不同數(shù)據(jù)源的映射器。

更進(jìn)一步,SpringBoot集成Mybatis實(shí)現(xiàn)多數(shù)據(jù)源的基本流程如下:

  • 為每個(gè)數(shù)據(jù)源定義獨(dú)立的配置,包括DataSource、SqlSessionFactory
  • 使用@MapperScan為每個(gè)數(shù)據(jù)源指定Mapper接口的位置。
  • 將配置好的SqlSessionFactory交由SpringBoot容器進(jìn)行管理

這樣,當(dāng)應(yīng)用程序運(yùn)行時(shí),只需要注入不同數(shù)據(jù)源對(duì)應(yīng)的Mapper即可訪問不同的數(shù)據(jù)庫,而無需擔(dān)心數(shù)據(jù)源之間的沖突和干擾。

最后,希望本文對(duì)你對(duì)有助于加深理解SpringBoot集成Mybatis的原理。

以上就是SpringBoot集成Mybatis實(shí)現(xiàn)對(duì)多數(shù)據(jù)源訪問原理的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Mybatis多數(shù)據(jù)源訪問的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在Jpa框架下拼接原生sql 并執(zhí)行的操作

    在Jpa框架下拼接原生sql 并執(zhí)行的操作

    這篇文章主要介紹了在Jpa框架下拼接原生sql 并執(zhí)行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Maven中plugins和pluginManagement區(qū)別小結(jié)

    Maven中plugins和pluginManagement區(qū)別小結(jié)

    pluginManagement是表示插件聲明,plugins就是直接引入一個(gè)plugin,本文主要介紹了Maven中plugins和pluginManagement區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • SpringBoot之通過BeanPostProcessor動(dòng)態(tài)注入ID生成器案例詳解

    SpringBoot之通過BeanPostProcessor動(dòng)態(tài)注入ID生成器案例詳解

    這篇文章主要介紹了SpringBoot之通過BeanPostProcessor動(dòng)態(tài)注入ID生成器案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java Map集合使用方法全面梳理

    Java Map集合使用方法全面梳理

    Map是一種依照鍵(key)存儲(chǔ)元素的容器,鍵(key)很像下標(biāo),在List中下標(biāo)是整數(shù)。在Map中鍵(key)可以使任意類型的對(duì)象。Map中不能有重復(fù)的鍵(Key),每個(gè)鍵(key)都有一個(gè)對(duì)應(yīng)的值(value)。一個(gè)鍵(key)和它對(duì)應(yīng)的值構(gòu)成map集合中的一個(gè)元素
    2022-04-04
  • java經(jīng)典問題:連個(gè)字符串互為回環(huán)變位

    java經(jīng)典問題:連個(gè)字符串互為回環(huán)變位

    連個(gè)字符串互為回環(huán)變位經(jīng)常出現(xiàn)在java程序員面試中,這個(gè)是考驗(yàn)程序員的解題思路和方法的最經(jīng)典的一題,小編為大家詳細(xì)分析一下,一起來學(xué)習(xí)吧。
    2017-11-11
  • Java中的ArrayList集合源碼解析

    Java中的ArrayList集合源碼解析

    這篇文章主要介紹了Java中的ArrayList集合源碼解析,ArrayList是一種以數(shù)組實(shí)現(xiàn)的List,與數(shù)組相比,它具有動(dòng)態(tài)擴(kuò)展的能力,因此也可稱之為動(dòng)態(tài)數(shù)組,需要的朋友可以參考下
    2023-12-12
  • 多線程下怎樣保證OkHttpClient的線程安全

    多線程下怎樣保證OkHttpClient的線程安全

    這篇文章主要介紹了多線程下怎樣保證OkHttpClient的線程安全問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Servlet文件的上傳與下載詳解

    Servlet文件的上傳與下載詳解

    很多朋友不清楚在Servlet中怎么上傳下載文件,談到這個(gè)問題,首先需要我們掌握開發(fā)servlet的步驟,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-06-06
  • Java中HashMap里面key為null存放到哪

    Java中HashMap里面key為null存放到哪

    這篇文章主要介紹了Java中HashMap里面key為null存放到哪,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • springsecurity6配置自定義路徑身份認(rèn)證的實(shí)現(xiàn)

    springsecurity6配置自定義路徑身份認(rèn)證的實(shí)現(xiàn)

    本文主要介紹了springsecurity6配置自定義路徑身份認(rèn)證的實(shí)現(xiàn),通過使用自定義的AuthorizationManager和MyService,可以實(shí)現(xiàn)更靈活的訪問控制,感興趣的可以了解一下
    2025-03-03

最新評(píng)論

麻城市| 聂拉木县| 南开区| 虞城县| 张掖市| 云安县| 图木舒克市| 微山县| 南丰县| 阳东县| 五原县| 马关县| 呼伦贝尔市| 武定县| 乌拉特前旗| 库车县| 靖远县| 三门峡市| 鄄城县| 桑日县| 唐河县| 绥滨县| 巩留县| 彰武县| 澄城县| 资源县| 句容市| 类乌齐县| 如东县| 肥城市| 富顺县| 巫溪县| 怀安县| 平泉县| 太谷县| 宁城县| 双江| 黑河市| 桑日县| 邵武市| 鄂温|