Spring Boot集成MyBatis實現多數據源訪問的“秘密”

文章目錄

    • 為什么需要多數據源?
    • Spring Boot集成MyBatis的基礎配置
    • 使用多數據源
    • 小結

在這里插入圖片描述

🎉Spring Boot集成MyBatis實現多數據源訪問的“秘密”


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒🍹
  • ?博客主頁:IT·陳寒的博客
  • 🎈該系列文章專欄:架構設計
  • 📜其他專欄:Java學習路線 Java面試技巧 Java實戰項目 AIGC人工智能 數據結構學習
  • 🍹文章作者技術和水平有限,如果文中出現錯誤,希望大家能指正🙏
  • 📜 歡迎大家關注! ??

在企業級應用程序中,往往需要處理多個數據庫的數據。Spring Boot提供了強大的功能,使得集成多數據源變得相對容易。本文將揭示Spring Boot集成MyBatis實現對多數據源的訪問的“秘密”,并通過實例代碼來演示整個過程。
在這里插入圖片描述

為什么需要多數據源?

在實際的應用中,有一些常見的場景需要使用多個數據源:

  1. 業務數據和日志數據分離: 將業務數據和日志數據存儲在不同的數據庫中,方便業務數據的備份和維護。

  2. 讀寫分離: 將讀操作和寫操作分別指向不同的數據庫,提高系統的讀取性能。

  3. 多租戶系統: 在一個系統中為不同的租戶使用不同的數據庫,確保數據隔離和安全性。

  4. 數據分片: 將數據按照某種規則分散到不同的數據庫中,提高查詢效率。

Spring Boot集成MyBatis的基礎配置

在開始之前,確保你已經創建了一個Spring Boot項目。接下來,我們將通過Maven添加MyBatis和連接池的依賴項。

<!-- MyBatis依賴 -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version>
</dependency><!-- 數據庫連接池(以Druid為例) -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.6</version>
</dependency>

接著,配置application.propertiesapplication.yml文件,指定數據庫連接信息:

# 主數據源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primarydb
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# 第二個數據源
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondarydb
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

這里配置了兩個數據源,分別是primarysecondary。接下來,我們需要創建對應的數據源、SqlSessionFactorySqlSessionTemplate

@Configuration
@MapperScan(basePackages = "com.example.mapper.primary", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PrimaryDataSourceConfig {@Primary@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource dataSource() {return DataSourceBuilder.create().build();}@Primary@Bean(name = "primarySqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);return factoryBean.getObject();}@Primary@Bean(name = "primarySqlSessionTemplate")public SqlSessionTemplate sqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}

上述代碼中,@Primary注解表示這是主數據源的配置。同樣,我們也需要為第二個數據源進行配置:

@Configuration
@MapperScan(basePackages = "com.example.mapper.secondary", sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SecondaryDataSourceConfig {@Bean(name = "secondaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource dataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondarySqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);return factoryBean.getObject();}@Bean(name = "secondarySqlSessionTemplate")public SqlSessionTemplate sqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}

這樣,我們已經完成了多數據源的基礎配置。

在這里插入圖片描述

使用多數據源

接下來,我們將演示如何在Service層中使用多數據源。首先,創建對應的Mapper接口和Mapper XML文件。

// PrimaryDataSource中的Mapper接口
@Mapper
public interface PrimaryUserMapper {User getUserById(@Param("userId") int userId);
}
<!-- PrimaryUserMapper.xml -->
<mapper namespace="com.example.mapper.primary.PrimaryUserMapper"><resultMap id="BaseResultMap" type="com.example.entity.User"><id column="id" property="id" jdbcType="INTEGER"/><result column="username" property="username" jdbcType="VARCHAR"/><result column="password" property="password" jdbcType="VARCHAR"/></resultMap><select id="getUserById" resultMap="BaseResultMap">SELECT * FROM user WHERE id = #{userId}</select>
</mapper>
// SecondaryDataSource中的Mapper接口
@Mapper
public interface SecondaryUserMapper {User getUserById(@Param("userId") int userId);
}
<!-- SecondaryUserMapper.xml -->
<mapper namespace="com.example.mapper.secondary.SecondaryUserMapper"><resultMap id="BaseResultMap" type="com.example.entity.User"><id column="id" property="id" jdbcType="INTEGER"/><result column="username" property="username" jdbcType="VARCHAR"/><result column="password" property="password" jdbcType="VARCHAR"/></resultMap><select id="getUserById" resultMap="BaseResultMap">SELECT * FROM user WHERE id = #{userId}</select>
</mapper>

然后,在Service層中分別注入兩個Mapper接口,并在方法中使用對應的數據源。

@Service
public class UserService {@Autowiredprivate PrimaryUserMapper primaryUserMapper;@Autowiredprivate SecondaryUserMapper secondaryUserMapper;@Transactional(transactionManager = "primaryTransactionManager")public User getPrimaryUserById(int userId) {return primaryUserMapper.getUserById(userId);}@Transactional(transactionManager = "secondaryTransactionManager")public User getSecondaryUserById(int userId) {return secondaryUserMapper.getUserById(userId);}
}

在上述代碼中,通過@Transactional(transactionManager = "primaryTransactionManager")注解指定了使用主數據源。同樣,@Transactional(transactionManager = "secondaryTransactionManager")注解指定了使用第二個數據源。

最后,我們需要在application.propertiesapplication.yml中配置事務管理器的Bean。

# 主數據源事務管理器
spring.primary.datasource.transactionManager=primaryTransactionManager# 第二個數據源事務管理器
spring.secondary.datasource.transactionManager=secondaryTransactionManager

小結

通過以上步驟,我們成功地實現了Spring Boot集成MyBatis,并實現了對多數據源的訪問。使用多數據源可以滿足一些特定的業務需求,如讀寫分離、多租戶系統等。在實際應用中,根據項目的具體情況,可以進一步進行配置和優化。

在這里插入圖片描述

希望本文能夠幫助讀者更好地理解Spring Boot如何集成MyBatis,以及如何配置和使用多數據源。同時,了解多數據源的使用場景和優勢,對于構建高性能、可擴展的應用系統有著重要的意義。


🧸結尾 ?? 感謝您的支持和鼓勵! 😊🙏
📜您可能感興趣的內容:

  • 【Java面試技巧】Java面試八股文 - 掌握面試必備知識(目錄篇)
  • 【Java學習路線】2023年完整版Java學習路線圖
  • 【AIGC人工智能】Chat GPT是什么,初學者怎么使用Chat GPT,需要注意些什么
  • 【Java實戰項目】SpringBoot+SSM實戰:打造高效便捷的企業級Java外賣訂購系統
  • 【數據結構學習】從零起步:學習數據結構的完整路徑

在這里插入圖片描述

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

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

相關文章

力扣:178. 分數排名(Python3)

題目&#xff1a; 表: Scores ---------------------- | Column Name | Type | ---------------------- | id | int | | score | decimal | ---------------------- 在 SQL 中&#xff0c;id 是該表的主鍵。 該表的每一行都包含了一場比賽的分數。Score …

TCP /UDP協議的 socket 調用的過程

在傳輸層有兩個主流的協議 TCP 和 UDP&#xff0c;socket 程序設計也是主要操作這兩個協議。這兩個協議的區別是什么呢&#xff1f;通常的答案是下面這樣的。 TCP 是面向連接的&#xff0c;UDP 是面向無連接的。TCP 提供可靠交付&#xff0c;無差錯、不丟失、不重復、并且按序…

Selenium介紹及基本使用方法

Selenium是一個開源、免費、簡單、靈活&#xff0c;對Web瀏覽器支持良好的自動化測試工具&#xff0c;在UI自動化、爬蟲等場景下是十分實用的&#xff0c;能夠熟練掌握并使用Selenium工具可以大大的提高效率。 Selenium簡介 Selenium支持多平臺、多瀏覽器、多語言去實現自動化…

深入理解強化學習——馬爾可夫決策過程:動作價值函數

分類目錄&#xff1a;《深入理解強化學習》總目錄 不同于馬爾可夫獎勵過程&#xff0c;在馬爾可夫決策過程中&#xff0c;由于動作的存在&#xff0c;我們額外定義一個動作價值函數&#xff08;Action-value Function&#xff09;。我們用 Q π ( s , a ) Q^\pi(s, a) Qπ(s,a)…

線程提交線程到線程池,有幾種方式,哪一種方式是工作中不能使用的,無法捕捉異常,線程池的拒絕策略,線程池的提交方式

線程池的工作原理 JDK中提交線程到線程池&#xff0c;有幾種方式&#xff0c;哪一種方式是工作中不能使用的&#xff0c;無法捕捉異常 兩種提交任務的方法 ExecutorService 提供了兩種提交任務的方法&#xff1a; execute()&#xff1a;提交不需要返回值的任務 submit()&a…

【C語言】多組輸入

C系列文章目錄 目錄 C系列文章目錄 一、什么是多組輸入&#xff1f; 二、如何使用多組輸入 2.1&#xff0c;試題舉例講解 2.2&#xff0c;錯誤解法 2.3&#xff0c;我們實現多組輸入的思路 2.4&#xff0c;第一種正確的解法 2.5&#xff0c;第二種正確的解法 2.6&…

Python入門教程 | Python3 字典(dict)

Python3 字典 字典是另一種可變容器模型&#xff0c;且可存儲任意類型對象。 Python3中的字典是一種無序、可變、可迭代的數據結構&#xff0c;它由鍵&#xff08;key&#xff09;和對應的值&#xff08;value&#xff09;組成。字典在Python中被視為可變對象&#xff0c;這意…

ES ElasticSearch安裝、可視化工具kibana安裝

1、安裝ES docker run -d --name es9200 -e "discovery.typesingle-node" -p 9200:9200 elasticsearch:7.12.1訪問測試&#xff1a; http://域名:9200/ 2、安裝kibana對es進行可視化操作 執行命令 docker run -d --name kibana5601 -p 5601:5601 kibana:7.1.12.修…

如何實現在公網下使用navicat圖形化工具遠程連接本地內網的MariaDB數據庫

公網遠程連接MariaDB數據庫【cpolar內網穿透】 文章目錄 公網遠程連接MariaDB數據庫【cpolar內網穿透】1. 配置MariaDB數據庫1.1 安裝MariaDB數據庫1.2 測試局域網內遠程連接 2. 內網穿透2.1 創建隧道映射2.2 測試隨機地址公網遠程訪問3. 配置固定TCP端口地址3.1 保留一個固定的…

Redis深入理解-Socket連接建立流程以及文件事件處理機制

Redis Server 運行原理圖 Redis 服務器中 Socket 網絡建立以及文件事件模型 一個 redis 單機&#xff0c;可以抗幾百上千的并發&#xff0c;這里的并發指的就是同時可以有幾百個 client 對這個 redis server 發起請求&#xff0c;都需要去建立網絡連接&#xff0c;同時間可能會…

利用 docker 實現JMeter分布式壓測

為什么需要分布式&#xff1f; 在工作中經常需要對一些關鍵接口做高QPS的壓測&#xff0c;JMeter是由Java 語言開發&#xff0c;沒創建一個線程&#xff08;虛擬用戶&#xff09;&#xff0c;JVM默認會為每個線程分配1M的堆棧內存空間。受限于單臺試壓機的配置很難實現太高的并…

YAML 深入解析:從語法到最佳實踐

什么是YAML YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一種人類可讀的數據序列化語言。它的設計目標是使數據在不同編程語言之間交換和共享變得簡單。YAML采用了一種簡潔、直觀的語法&#xff0c;以易于閱讀和編寫的方式表示數據結構。 YAML廣泛應用于配置文…

【OpenCV實現圖像:制作酷炫的動畫效果】

文章目錄 概要生成背景圖添加點動畫添加文本顯示小結 概要 首先&#xff0c;通過導入必要的庫&#xff0c;包括NumPy用于數學運算和Matplotlib庫用于數據可視化。隨后&#xff0c;創建圖形和軸&#xff0c;初始化點的位置&#xff0c;以及編寫初始化函數和更新函數。 初始化函…

C語言歸并排序

以夢為馬&#xff0c;不負韶華 文章目錄 引入&#xff1a;實現原理問題引出&#xff1a;遞歸實現&#xff1a;迭代實現穩定性分析&#xff1a;總結&#xff1a; 引入&#xff1a; 如何將兩個有序數組&#xff08;假設為升序&#xff09;合并為一個有序數組&#xff1f; 雙指針…

yolov5/v7修改標簽和檢測框顯示【最全】

《記錄自己在使用yolov5遇到的一些問題》同時也供大家參考&#xff0c;如果對你們有幫助&#xff0c;希望大家可以給個點贊、收藏鼓勵下&#xff0c;非常感謝&#xff01; 以自帶的一張圖片作為示例,yolov5(6.1版本)的初始檢測框應該是如下圖所示 修改線條粗細、隱藏標簽、隱…

EI論文故障識別程序:DBN深度置信/信念網絡的故障識別Matlab程序,數據由Excel導入,直接運行!

?適用平臺&#xff1a;Matlab2021b版及以上 本程序參考中文EI期刊《基于變分模態分解和改進灰狼算法優化深度置信網絡的自動轉換開關故障識別》中的深度置信網絡&#xff08;Deep Belief Network&#xff0c;DBN&#xff09;部分進行故障識別&#xff0c;程序注釋清晰&#x…

Python之學生信息管理系統

目錄 一、基礎界面實現 1、主函數 2、保持循環&#xff0c;獲取用戶需求 二、函數實現模塊功能 1、添加學生信息 2、刪除學生信息 3、修改學生信息 4、查找全部學生信息 5、退出系統 三、整合代碼 1、 完整代碼 2、完整實現過程 實現 打印功能菜單、添加學生信息、刪…

想自學軟件測試?一般人我還是勸你算了吧。。。

&#x1f4e2;專注于分享軟件測試干貨內容&#xff0c;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01;&#x1f4e2;交流討論&#xff1a;歡迎加入我們一起學習&#xff01;&#x1f4e2;資源分享&#xff1a;耗時200小時精選的「軟件測試」資…

<keep-alive>作用及用法

<keep-alive>是Vue.js的內置組件。它用于緩存具有相同組件樹的組件。當組件使用<keep-alive>包裹時&#xff0c;組件不會被銷毀&#xff0c;而是會緩存到內存中&#xff0c;等到下次再次渲染時&#xff0c;直接使用緩存中的組件實例。 <keep-alive>有以下幾…

【Linux】共享內存

文章目錄 一、共享內存的原理詳談共享內存的實現過程二、共享內存的接口函數1.shmget2. shmatshmdtshmctl 進程間使用共享內存通信三、共享內存的特性 關于代碼 一、共享內存的原理 共享內存是由操作系統維護和管理的一塊內存。 共享內存的本質是內核級的緩沖區。 一個進程向…