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!
推薦閱讀:
- springboot mybatis調用多個數據源引發的錯誤問題
- 初次體驗MyBatis的註意事項
- SpringBoot整合Mybatis Plus多數據源的實現示例
- 為什麼mybatis中的SqlSession一定要關閉
- Mybatis配置解析看這一篇就夠瞭