MyBatis 如何創建 SqlSession 對象的?

MyBatis 創建 SqlSession 對象的過程主要由 SqlSessionFactory 接口及其實現類來完成。以下是詳細步驟:

1. SqlSessionFactory 接口:

  • SqlSessionFactory 是 MyBatis 的核心接口之一,它負責創建 SqlSession 對象。 你可以將 SqlSessionFactory 視為 SqlSession 的工廠。
  • SqlSessionFactory 接口定義了多個 openSession() 方法,用于創建 SqlSession。這些方法提供了不同的選項,例如:
    * openSession(): 使用默認配置(通常是不自動提交事務)。
    * openSession(boolean autoCommit): 指定是否自動提交事務。
    * openSession(ExecutorType execType): 指定執行器類型 (SIMPLE, REUSE, BATCH)。
    * openSession(TransactionIsolationLevel level): 指定事務隔離級別。
    * openSession(Connection connection): 使用外部提供的數據庫連接。

2. SqlSessionFactoryBuilder:

  • SqlSessionFactoryBuilder 是一個構建器類,用于構建 SqlSessionFactory 實例。
  • 它提供了多個 build() 方法,可以通過以下方式構建 SqlSessionFactory
    * 從 XML 配置文件 (mybatis-config.xml) 構建。
    * 從 Configuration 對象構建。
    * 從 InputStreamReader 構建。
// 從 XML 配置文件構建 SqlSessionFactory (最常見的方式)
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 從 Configuration 對象構建 SqlSessionFactory
Configuration configuration = new Configuration();
// ... 添加配置信息 ...
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
  • SqlSessionFactoryBuilder 在構建完 SqlSessionFactory 后,其自身的使命就完成了,通常不需要保留它的實例。最佳實踐是在方法內部創建 SqlSessionFactoryBuilder,構建 SqlSessionFactory,然后丟棄 SqlSessionFactoryBuilder

3. DefaultSqlSessionFactory (默認實現):

  • DefaultSqlSessionFactorySqlSessionFactory 接口的默認實現類。
  • SqlSessionFactoryBuilderbuild() 方法通常會創建一個 DefaultSqlSessionFactory 實例。

4. openSession() 方法 (創建 SqlSession 的核心):

  • DefaultSqlSessionFactoryopenSession() 方法(及其重載方法)負責創建 SqlSession 對象。
  • 創建 SqlSession 的過程大致如下:
  1. 獲取 Environment:Configuration 對象中獲取 Environment 對象,Environment 對象包含了數據源、事務管理器等信息
  2. 創建 Transaction: 根據 Environment 中的 TransactionFactory 創建 Transaction 對象。Transaction 對象負責管理數據庫事務。
  3. 創建 Executor: 根據配置信息(例如,defaultExecutorType 設置)和 Transaction 對象創建 Executor 對象。Executor 負責執行 SQL 語句,并處理緩存。
  4. 創建 DefaultSqlSession: 創建 DefaultSqlSession 對象,并將 ConfigurationExecutorautoCommit 標志(是否自動提交事務)傳遞給 DefaultSqlSession 的構造函數。
  5. 返回 DefaultSqlSession: openSession() 方法返回新創建的 DefaultSqlSession 對象。
    // DefaultSqlSessionFactory 的 openSessionFromDataSource() 方法 (簡化版)
    private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {Transaction tx = null;try {final Environment environment = configuration.getEnvironment();final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);final Executor executor = configuration.newExecutor(tx, execType);return new DefaultSqlSession(configuration, executor, autoCommit);} catch (Exception e) {closeTransaction(tx); // may have fetched a connection so lets call close()throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);} finally {ErrorContext.instance().reset();}
    }
    

5. DefaultSqlSession:

  • DefaultSqlSessionSqlSession 接口的默認實現類。
  • 它包含了執行 SQL 語句、獲取 Mapper 接口實例、管理事務等方法。
  • DefaultSqlSession 內部持有 Configuration 對象、Executor 對象和 autoCommit 標志。

總結:

MyBatis 創建 SqlSession 對象的過程如下:

  1. SqlSessionFactoryBuilder 構建 SqlSessionFactory (通常是 DefaultSqlSessionFactory)。
  2. 調用 SqlSessionFactoryopenSession() 方法。
  3. DefaultSqlSessionFactory 創建 TransactionExecutorDefaultSqlSession 對象。
  4. openSession() 方法返回 DefaultSqlSession 對象。

SqlSessionFactorySqlSession 的工廠,DefaultSqlSessionFactorySqlSessionFactory 的默認實現,DefaultSqlSessionSqlSession 的默認實現。SqlSessionFactoryBuilder 用于構建 SqlSessionFactory

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

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

相關文章

深度優先搜索(DFS)剪枝技術詳解與C++實現

深度優先搜索(DFS)剪枝技術通過提前終止無效路徑的搜索,大幅提升算法效率。以下是五種核心剪枝技術的詳細解析及C代碼示例: 目錄 一、可行性剪枝 C實現示例 二、搜索順序剪枝 偽代碼邏輯 三、最優性剪枝 C實現示例 四、排除…

【雙指針】移動零

題目描述: 算法分析: 觀察輸入輸出: 輸出中一共分為兩個區域,0區和非零區。 但是在處理未完成之前,必然存在著一個零和非零數共存的區域,所以在處理的過程當中一共有三個區域,0區,…

學習15天:pytest

1、.pytest強大的插件 pytest-html(生成html格式的自動化測試報告) pytest-xdist測試用例分布式執行。多CPU分發。 pytest-ordering 用于改變測試用例的執行順序 pytest-rerunfailures用例失敗后重跑 allure-pytest 用于生成美觀的測試報告。 2、規則: 模塊…

股票交易所官方api接口有哪些?獲取和使用需要滿足什么條件

炒股自動化:申請官方API接口,散戶也可以 python炒股自動化(0),申請券商API接口 python炒股自動化(1),量化交易接口區別 Python炒股自動化(2):獲取…

2.7 滑動窗口專題:串聯所有單詞的子串

LeetCode 30. 串聯所有單詞的子串算法對比分析 1. 題目鏈接 LeetCode 30. 串聯所有單詞的子串 2. 題目描述 給定一個字符串 s 和一個字符串數組 words,words 中所有單詞長度相同。要求找到 s 中所有起始索引,使得從該位置開始的連續子串包含 words 中所…

【區塊鏈】區塊鏈密碼學基礎

🌈個人主頁: 鑫寶Code 🔥熱門專欄: 閑話雜談| 炫酷HTML | JavaScript基礎 ?💫個人格言: "如無必要,勿增實體" 文章目錄 區塊鏈密碼學基礎引言一、哈希函數1.1 基本概念1.2 數學表達 二、非對稱加密2.1…

Spring Boot配置類原理、Spring Boot核心機制理解,以及實現自動裝置的底層原理

目的:從底層源碼角度分析 Spring Boot 配置類以及自動裝載的底層原理 文章目錄 1. Spring Boot 配置類實現自動裝載1.1 @Configuration注解1.2 @Configuration 注解完成 bean 注入流程圖1.3 @ConfigurationProperties注解賦值2. Spring Boot的核心機制:自動裝配2.1 @SpringBo…

docker桌面版啟動redis,解決無法連接

docker run -d --name redis -p 6379:6379 -v E:\2\redis\redis.conf:/usr/local/etc/redis/redis.conf redis redis-server /usr/local/etc/redis/redis.conf 在本地創建一個目錄,里面有個redis.conf文件,內容如下,啟動時綁定這個配置文件目…

[網絡][tcp協議]:tcp報頭

tcp(傳輸控制協議)是一種面向字節流的傳輸層協議,相較于udp協議,tcp能保證傳輸數據的可靠性與準確性,tcp也是目前最常見的傳輸層協議 本文主要介紹tcp報頭各個字段的含義與用途 注:保留6位和6位標記位是目前最普遍的寫法,在我查資料時,發現有一些拓展情況,會在后文細說 最簡單的…

【虛幻C++筆記】引擎源碼下載及編譯步驟

目錄 1.在GitHub上訪問虛幻引擎源代碼2.安裝Visual Studio 20223.解壓完成以后,打開源碼的根目錄,選擇Setup.bat運行4.選擇GenerateProjectFiles.bat運行,生成uE5.sln文件,點擊這個文件打開項目5.設置編譯的選項,選擇DevelopmentE…

【數學建模】層次分析法(AHP)詳解及其應用

層次分析法(AHP)詳解及其應用 引言 在現實生活和工作中,我們經常面臨復雜的決策問題,這些問題通常涉及多個評價準則,且各準則之間可能存在相互影響。如何在這些復雜因素中做出合理的決策?層次分析法(Analytic Hierarchy Process…

科普:為何要對特征進行分箱?

一、為何要對特征進行分箱? 分箱(Binning)是將連續型或離散型特征轉化為區間型變量的過程,其核心目標是提升模型效果和解釋性,具體原因如下: 1. 業務需求 可解釋性:將特征轉化為業務可理解的…

理解langgraph工作流的驅動邏輯,以適應langgraph工作流模式的編程。

langgraph的工作流模式雖然方便直觀,但習慣了普通函數式編程的數據流處理。剛開始接觸時,確實容易試圖用函數式編程的思維去適配它,特別是langgraph數據傳遞由狀態字典管理,而非函數返回值,導致代碼不夠自然&#xff0…

線性dp(數字三角形,LIS,LCS,LCIS)

文章目錄 線性dp數字三角形題目思路 LIS(最長上升子序列)代碼(n^2)二分優化(nlogn) LCS(最長公共子序列)代碼 LCS——>>LIS思路代碼 最長公共子串最長公共上升子序列(LCIS) 線…

Spring Validation參數校驗

Spring Validation是Spring框架中用于數據校驗的核心模塊&#xff0c;通過注解簡化數據校驗邏輯。 1. 依賴引入&#xff08;SpringBoot項目&#xff09; Spring Boot項目&#xff1a;自動包含spring-boot-starter-validation <dependency><groupId>org.springfra…

《AI大模型趣味實戰》No2 : 快速搭建一個漂亮的AI家庭網站-相冊/時間線/日歷/多用戶/個性化配色(中)

快速搭建一個漂亮的AI家庭網站-相冊/時間線/日歷/多用戶/個性化配色(中) 摘要 在上一篇文章中&#xff0c;我們介紹了如何搭建一個基礎的家庭網站&#xff08;V1.0版本&#xff09;&#xff0c;包含了用戶管理、相冊管理、時間線和日歷等功能。本文將繼續深入&#xff0c;詳細…

pythonSTL---sys

sys 是 Python 標準庫中的一個內置模塊&#xff0c;它提供了許多與 Python 解釋器和系統環境進行交互的功能。 sys方法 1. 導入 sys 模塊 在使用 sys 庫的功能之前&#xff0c;需要先導入它&#xff1a; import sys2. 命令行參數 (sys.argv) sys.argv 是一個包含命令行參數…

軟件需求分類、需求獲取(高軟46)

系列文章目錄 軟件需求分類&#xff0c;需求獲取 文章目錄 系列文章目錄前言一、軟件需求二、獲取需求三、真題總結 前言 本節講明軟件需求分類、需求獲取的相關知識。 一、軟件需求 二、獲取需求 三、真題 總結 就是高軟筆記&#xff0c;大佬請略過&#xff01;

Zabbix7.0+DeepSeek大模型實現人工智能告警分析

一、方案概述 本方案基于Zabbix7.0監控系統,通過底層webhook腳本機制集成Deepseek做故障分析提供解決方案,構建智能化運維體系。 其核心架構包括: Zabbix監控平臺:負責實時監控和告警觸發 Webhook接口:實現告警信息的傳遞 Deepseek AI平臺:提供故障智能分析能力 二、…

CPU相關:實時cpu信息接口

[rootxxx ~]# cat /proc/cpuinfo #通過實時cpu信息接口查看cpu信息