Mybatis實現分包定義資料庫

一懶眾衫小QAQ發表於2022-01-09

Mybatis實現分包定義資料庫

背景

業務需求中需要連線兩個資料庫處理資料,需要用動態資料來源。通過了解mybatis的框架,計劃 使用分包的方式進行資料來源的區分。

原理

前提:

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

1:構建SqlSessionFactory

2:通過SqlSessionFactory 獲取到sqlSession 物件

3:通過sqlSession物件獲取Mapper的動態代理物件

4:通過執行動態代理物件獲取返回值

其實點開sqlSessionFactory就的Configuration物件中的Environment物件繫結了我們的dataSource物件

image-20220109153734333

同樣,我們通過debug發現,動態代理後的mapper物件是同樣持有Configuration物件,繫結我們的連線資訊。

image-20220109154100584

猜想

需要分包實現不同資料來源的話,需要對不同的mapper指定不同的sqlSessionFactroy,檢視mapperScan的註解原始碼,

image-20220109154251372

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

實現

1:定義兩個資料來源

image-20220109154741109

兩個資料來源分別命名位ds01,ds02,這裡採用都是德魯伊的資料庫連線池。為了簡介,詳細配置沒有展示了。

2:定義兩個SqlSessionFactory

定義兩個sqlSessionFactory,分別繫結兩個資料來源。

image-20220109155016108

image-20220109155039476

3:不同包實現繫結不同的sqlSessionFactory

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

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

4:測試

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

擴充:

通過實現

image-20220109160237418

AbstractRoutingDataSource也可以實現動態資料來源。

該類實現DataSource的介面,可以配置對各資料來源在

 @Nullable
    private Map<Object, DataSource> resolvedDataSources;

這個屬性裡面。

讓後通過暴露一個determineCurrentLookupKey 獲取需要使用的資料來源的key。但是需要注意事務的問題。

相關文章