Java書簽 #使用MyBatis接入多數據源

楔子:當然,世上有很多優秀的女性,我也會被她們吸引。這對男人來說是理所當然的。但目光被吸引和內心被吸引是截然不同的。- 東野圭吾《黎明之街》

今日書簽

在一些應用場景中,可能需要連接多個不同的數據庫,例如連接不同的數據庫服務器或者連接主從數據庫。這段代碼就是為了實現這種多數據源的配置。

具體來說,這個類包含兩個內部靜態類:

  1. MyBatisDataSourceConfiguration4XMei: 這個類配置了第一個數據源,即 “xmei” 數據源。它使用了
    @Primary 注解來指示這是默認的主數據源。這個數據源配置了一個 Druid 數據源,并配置了與該數據源相關的
    SqlSessionFactory、事務管理器(DataSourceTransactionManager)和
    SqlSessionTemplate。@MapperScan 注解用于指示需要掃描哪些包下的 Mapper 接口,并使用特定的
    SqlSessionFactory。它還定義了 Mapper XML 文件的路徑,以及事務管理和 SqlSessionTemplate。
  2. MyBatisDataSourceConfiguration4XWei: 這個類配置了第二個數據源,即 “xwei” 數據源。它沒有使用
    @Primary 注解,因此不是默認的主數據源。它使用了 @Qualifier 注解來指定特定的 Bean
    名稱,用于解決多個數據源的沖突。與第一個數據源類似,它配置了一個 Druid 數據源,并定義了與該數據源相關的
    SqlSessionFactory、事務管理器和 SqlSessionTemplate。

多數據源

使用 Service、Mapper、XML 所在包路徑區分默認數據源 與 第二數據源。
直接看代碼:

/*** 多數據源接入* dataSource4XMei 為 xmei 庫,為默認數據源,正常使用,此處以外無其它配置* dataSource4XWei 為 xwei 庫,為第二數據源,正常使用,此處以外無其它配置*/
@Configuration
public class MyBatisConfiguration {/*** 配置 SpringBoot 默認數據源,一般配置為主數據庫,此為 xmei*/@Configuration@MapperScan(basePackages = {"com.cw.tan.xmei.persistence.*"}, sqlSessionFactoryRef = "sqlSessionFactory4XMei")protected static class MyBatisDataSourceConfiguration4XMei {@Bean@Primary@ConfigurationProperties("spring.datasource.druid.xmei")public DataSource dataSource4XMei() {return DruidDataSourceBuilder.create().build();}@Bean@Primarypublic SqlSessionFactory sqlSessionFactory4XMei(DataSource dataSource4XMei) throws Exception {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource4XMei);sqlSessionFactoryBean.setMapperLocations(this.resolveMapperLocations());return sqlSessionFactoryBean.getObject();}private Resource[] resolveMapperLocations() {ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();List<String> mapperLocations = new ArrayList<>();mapperLocations.add("classpath*:com/cw/tan/xmei/persistence/**/*.xml");List<Resource> resources = new ArrayList();if (!CollectionUtils.isEmpty(mapperLocations)) {for (String mapperLocation : mapperLocations) {try {Resource[] mappers = resourceResolver.getResources(mapperLocation);resources.addAll(Arrays.asList(mappers));} catch (IOException e) {// ignore}}}return resources.toArray(new Resource[resources.size()]);}/*** 配置事務管理*/@Bean@Primarypublic DataSourceTransactionManager transactionManager4XMei(DataSource dataSource4XMei) {return new DataSourceTransactionManager(dataSource4XMei);}@Bean@Primarypublic SqlSessionTemplate sqlSessionTemplate4XMei(SqlSessionFactory sqlSessionFactory4XMei) {return new SqlSessionTemplate(sqlSessionFactory4XMei);}}/*** 配置第二數據源,注意 mapper 掃描路徑和上面的區分開*/@Configuration@MapperScan(basePackages = {"com.cw.tan.xwei.log.mapper","com.cw.tan.xwei.sms.mapper", "com.cw.tan.xwei.job.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory4XWei")protected static class MyBatisDataSourceConfiguration4XWei {@Bean(name = "dataSource4XWei")@ConfigurationProperties("spring.datasource.druid.xwei")public DataSource dataSource4XWei() {return DruidDataSourceBuilder.create().build();}@Bean(name = "sqlSessionFactory4XWei")public SqlSessionFactory sqlSessionFactory4XWei(@Qualifier("dataSource4XWei") DataSource dataSource4XWei) throws Exception {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource4XWei);sqlSessionFactoryBean.setMapperLocations(this.resolveMapperLocations());return sqlSessionFactoryBean.getObject();}private Resource[] resolveMapperLocations() {ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();List<String> mapperLocations = new ArrayList<>();mapperLocations.add("classpath*:com/cw/tan/xwei/log/**/*.xml");mapperLocations.add("classpath*:com/cw/tan/xwei/sms/**/*.xml");mapperLocations.add("classpath*:com/cw/tan/xwei/job/**/*.xml");List<Resource> resources = new ArrayList<>();if (!CollectionUtils.isEmpty(mapperLocations)) {mapperLocations.forEach(mapperLocation -> {try {Resource[] mappers = resourcePatternResolver.getResources(mapperLocation);resources.addAll(Arrays.asList(mappers));} catch (IOException e) {// ignore}});}return resources.toArray(new Resource[resources.size()]);}@Bean(name = "transactionManager4XWei")public DataSourceTransactionManager transactionManager4XWei(@Qualifier("dataSource4XWei") DataSource dataSource4XWei) {return new DataSourceTransactionManager(dataSource4XWei);}@Bean(name = "sqlSessionTemplate4XWei")public SqlSessionTemplate sqlSessionTemplate4XWei(@Qualifier("sqlSessionFactory4XWei") SqlSessionFactory sqlSessionFactory4XWei) {return new SqlSessionTemplate(sqlSessionFactory4XWei);}}
}

注意:上述配置,請確認自己的默認數據源、第二數據源對應Service、DAO文件所在的包路徑,如果路徑指向不對,可能會出現以下異常:
2023-08-17 16:09:33.981 [TID:] [main] WARN AnnotationConfigServletWebServerApplicationContext.refresh():559 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘dataDataSyncController’: Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type ‘com.cw.tan.xwei.job.IDataSyncService’ available: expected single matching bean but found 2: dataSyncServiceImpl,IDataSyncService

總結

這段代碼通過兩個內部靜態類分別配置了兩個不同的數據源(xmei 和 xwei)。每個數據源配置了對應的 Druid 數據源、SqlSessionFactory、事務管理器和 SqlSessionTemplate。這種多數據源配置適用于需要訪問多個不同數據庫的場景,如在一個系統中同時連接多個數據庫來進行不同的操作,比如主數據庫和日志數據庫、數據庫與業務庫數據同步等。

如果還需要擴展更多數據源,則可將上述 第二數據源配置 進行復制粘貼,然后做相應名稱、包路徑的修改即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40638.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Centos 防火墻命令

查看防火墻狀態 systemctl status firewalld.service 或者 firewall-cmd --state 開啟防火墻 單次開啟防火墻 systemctl start firewalld.service 開機自啟動防火墻 systemctl enable firewalld.service 重啟防火墻 systemctl restart firewalld.service 防火墻設置開…

8.15 IO的多路復用

select的TCP客戶端 poll的TCP客戶端

Chart GPT免費可用地址共享資源

GPT4.0&#xff1a; https://gpt4e.ninvfeng.xyz github:https://github.com/ninvfeng/chatgpt4 WeUseAi&#xff1a;https://chatb.weuseai.pro AI.LS&#xff1a;https://n7.gpt03.xyz ChatX (iOS/macOS應用)&#xff1a;https://itunes.apple.com/app/id6446304087 ch…

C/C++ : C/C++的詳解,C語言與C++的常用算法以及算法的各自用法和應用(初級,中級),C++ CSP考題(J居多,S偏少)的詳解,NOI的真題題解

目錄 1.C語言 2.C 3.C與C語言的共同/不同點 4.導讀 5.相關文章 5.1&#xff1a;Dev-C是Windows 環境下的一個輕量級 C/C 集成開發環境&#xff08;IDE&#xff09; 5.2&#xff1a;C是從C語言發展而來的&#xff0c;而C語言的歷史可以追溯到1969年 6.C/C最新年度總…

?LeetCode解法匯總88. 合并兩個有序數組

目錄鏈接&#xff1a; 力扣編程題-解法匯總_分享記錄-CSDN博客 GitHub同步刷題項目&#xff1a; https://github.com/September26/java-algorithms 原題鏈接&#xff1a;力扣&#xff08;LeetCode&#xff09;官網 - 全球極客摯愛的技術成長平臺 描述&#xff1a; 給你兩個按…

解決方案:如何在 Amazon EMR Serverless 上執行純 SQL 文件?

長久已來&#xff0c;SQL以其簡單易用、開發效率高等優勢一直是ETL的首選編程語言&#xff0c;在構建數據倉庫和數據湖的過程中發揮著不可替代的作用。Hive和Spark SQL也正是立足于這一點&#xff0c;才在今天的大數據生態中牢牢占據著主力位置。在常規的Spark環境中&#xff0…

國企的大數據崗位方向的分析

現如今大數據已無所不在&#xff0c;并且正被越來越廣泛的被應用到歷史、政治、科學、經濟、商業甚至滲透到我們生活的方方面面中&#xff0c;獲取的渠道也越來越便利。 今天我們就來聊一聊“大屏應用”&#xff0c;說到大屏就一定要聊到數據可視化&#xff0c;現如今&#xf…

【Git】(三)回退版本

1、git reset命令 1.1 回退至上一個版本 git reset --hard HEAD^ 1.2 將本地的狀態回退到和遠程的一樣 git reset --hard origin/master 注意&#xff1a;謹慎使用 –-hard 參數&#xff0c;它會刪除回退點之前的所有信息。HEAD 說明&#xff1a;HEAD 表示當前版本HEAD^ 上…

服務鏈路追蹤

一、服務鏈路追蹤導論 1.背景 對于一個大型的幾十個、幾百個微服務構成的微服務架構系統&#xff0c;通常會遇到下面一些問題&#xff0c;比如&#xff1a; 如何串聯整個調用鏈路&#xff0c;快速定位問題&#xff1f;如何理清各個微服務之間的依賴關系&#xff1f;如何進行…

pycorrector一鍵式文本糾錯工具,整合了BERT、MacBERT、ELECTRA、ERNIE等多種模型,讓您立即享受糾錯的便利和效果

pycorrector&#xff1a;一鍵式文本糾錯工具&#xff0c;整合了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer、T5等多種模型&#xff0c;讓您立即享受糾錯的便利和效果 pycorrector: 中文文本糾錯工具。支持中文音似、形似、語法錯誤糾正&#xff0c;pytho…

Python OpenGL環境配置

1.Python的安裝請參照 Anconda安裝_安裝anconda_lwb-nju的博客-CSDN博客anconda安裝教程_安裝ancondahttps://blog.csdn.net/lwbCUMT/article/details/125322193?spm1001.2014.3001.5501 Anconda換源虛擬環境創建及使用&#xff08;界面操作&#xff09;_anconda huanyuan_l…

徹底卸載Android Studio

永恒的愛是永遠恪守最初的諾言。 在安裝Android Studio會有很多問題導致無法正常運行&#xff0c;多次下載AS多次錯誤后了解到&#xff0c;刪除以下四個文件才能徹底卸載Android Studio。 第一個文件&#xff1a;.gradle 路徑&#xff1a;C:\Users\yao&#xff08;這里yao是本…

解密人工智能:線性回歸 | 邏輯回歸 | SVM

文章目錄 1、機器學習算法簡介1.1 機器學習算法包含的兩個步驟1.2 機器學習算法的分類 2、線性回歸算法2.1 線性回歸的假設是什么&#xff1f;2.2 如何確定線性回歸模型的擬合優度&#xff1f;2.3 如何處理線性回歸中的異常值&#xff1f; 3、邏輯回歸算法3.1 什么是邏輯函數?…

火山引擎聯合Forrester發布《中國云原生安全市場現狀及趨勢白皮書》,賦能企業構建云原生安全體系

國際權威研究咨詢公司Forrester 預測&#xff0c;2023年全球超過40%的企業將會采用云原生優先戰略。然而&#xff0c;云原生在改變企業上云及構建新一代基礎設施的同時&#xff0c;也帶來了一系列的新問題&#xff0c;針對涵蓋云原生應用、容器、鏡像、編排系統平臺以及基礎設施…

用棧解決有效的括號匹配問題

//用數組實現棧 typedef char DataType; typedef struct stack {DataType* a;//動態數組int top;//棧頂int capacity; //容量 }ST;void STInit(ST*pst);//初始化void STDestroy(ST* pst);//銷毀所有空間void STPush(ST* pst, DataType x);//插入數據到棧中void STPop(ST* pst);…

【業務功能篇65】maven加速 配置settings.xml文件 鏡像

maven加速 添加阿里鏡像倉 <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additi…

Kubernetes 調度約束(親和性、污點、容忍)

目錄 一、Pod啟動典型創建過程 二、調度流程 三、指定調度節點 1.使用nodeName字段指定調度節點 2.使用nodeSelector指定調度節點 2.1給對應的node節點添加標簽 2.2修改為nodeSelector調度方式 3.通過親和性來指定調度節點 3.1節點親和性 3.2Pod親和性與反親和性 3.2…

Vue CLI創建Vue項目詳細步驟

&#x1f680; 一、安裝Node環境&#xff08;建議使用LTS版本&#xff09; 在開始之前&#xff0c;請確保您已經安裝了Node.js環境。您可以從Node.js官方網站下載LTS版本&#xff0c;以確保穩定性和兼容性。 中文官網下載 確認已安裝 Node.js。可以在終端中運行 node -v 命令…

基于STM32設計的中藥分裝系統

一、設計需求 基于STM32設計的中藥分裝系統 【1】項目背景 中藥文化是我國文化瑰寶之一,它具有療效好、副作用小的優點,而且相對于西藥,全天然的中藥還具有標本兼治的特點,不僅可以用來治病,更可以對患者身體進行調理,所以格外受到當今一直追求生活質量的人們的追捧&quo…

在Spring Boot和Vue中實現請求過濾器以驗證請求頭中的Token

在Spring Boot應用程序中創建一個過濾器類&#xff0c;用于處理請求&#xff1a; Component public class AuthenticationFilter implements Filter {Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException,…