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。但是需要注意事務的問題。