Mybatis實現分包定義數據庫的原理與過程

前言

業務需求中需要連接兩個數據庫處理數據,需要用動態數據源。通過瞭解mybatis的框架,計劃 使用分包的方式進行數據源的區分。

原理

前提:

我們使用mybatis都會有四個步驟

1:構建SqlSessionFactory

2:通過SqlSessionFactory 獲取到sqlSession 對象

3:通過sqlSession對象獲取Mapper的動態代理對象

4:通過執行動態代理對象獲取返回值

其實點開sqlSessionFactory就的Configuration對象中的Environment對象綁定瞭我們的dataSource對象

同樣,我們通過debug發現,動態代理後的mapper對象是同樣持有Configuration對象,綁定我們的連接信息。

猜想

需要分包實現不同數據源的話,需要對不同的mapper指定不同的sqlSessionFactroy,查看mapperScan的註解源碼,

通過理解註釋,我們是可以指定maper動態代理對象的sqlSessionFactory對象的。然後結果basePackages就可以對不同的包使用不同的sqlSessionFactory從而實現不同包使用不同的數據源。

實現

1:定義兩個數據源

兩個數據源分別命名位ds01,ds02,這裡采用都是德魯伊的數據庫連接池。為瞭簡介,詳細配置沒有展示瞭。

2:定義兩個SqlSessionFactory

定義兩個sqlSessionFactory,分別綁定兩個數據源。

3:不同包實現綁定不同的sqlSessionFactory

通過@MapperScan指定掃描的包,通知指定SqlSessionFactory

@MapperScan(basePackages = "com.lenven.demo.dao.ds02",sqlSessionFactoryRef = "salveSqlSessionFactory")
@MapperScan(basePackages = "com.lenven.demo.dao.ds01",sqlSessionFactoryRef = "masterSqlSessionFactory")

4:測試

對兩個不同的包的mapper測試,都可以正確查詢出數據

拓展:

通過實現

AbstractRoutingDataSource也可以實現動態數據源。

該類實現DataSource的接口,可以配置對各數據源在

 @Nullable
    private Map<Object, DataSource> resolvedDataSources;

這個屬性裡面。

讓後通過暴露一個determineCurrentLookupKey 獲取需要使用的數據源的key。但是需要註意事務的問題。

總結

到此這篇關於Mybatis實現分包定義數據庫的原理與過程的文章就介紹到這瞭,更多相關Mybatis分包定義數據庫內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: