MyBatis架構原理解析:核心對象與執行流程深度剖析

一、開篇:理解MyBatis的核心價值

在當今Java持久層框架生態中,MyBatis憑借其靈活的SQL控制能力簡潔的ORM實現成為企業級應用的首選。與JPA的全自動ORM不同,MyBatis采用半自動化映射理念,在保持SQL靈活性的同時,通過智能映射減少70%的JDBC樣板代碼。

開發者
直接編寫SQL
MyBatis核心引擎
自動參數綁定
結果集映射
事務管理
JDBC

本文將深入剖析MyBatis的架構核心,通過源碼解析揭示其內部工作機制。閱讀本文后,您將掌握:

  1. MyBatis核心對象的職責與協作關系
  2. SQL從映射到執行的完整生命周期
  3. 配置文件加載的關鍵流程
  4. 執行器體系的運作原理

二、核心對象體系解析

1. 基礎組件關系圖

SqlSessionFactoryBuilder
+build(InputStream inputStream) : SqlSessionFactory
SqlSessionFactory
+openSession() : SqlSession
SqlSession
+selectOne(String statement)
+getMapper(Class type)
?interface?
Executor
+query(MappedStatement ms, Object parameter) : List
?interface?
StatementHandler
+prepare(Connection connection)
+parameterize(Statement statement)

2. 核心對象職責說明

(1) SqlSessionFactoryBuilder
  • 功能:根據配置信息構建SqlSessionFactory
  • 生命周期:方法局部(構建后即可銷毀)
  • 源碼關鍵路徑
public class SqlSessionFactoryBuilder {public SqlSessionFactory build(Reader reader) {return build(reader, null, null);}public SqlSessionFactory build(InputStream inputStream) {return build(inputStream, null, null);}.....}
(2) SqlSessionFactory
  • 功能:創建SqlSession實例
  • 實現類DefaultSqlSessionFactory
  • 核心方法
public class DefaultSqlSessionFactory implements SqlSessionFactory {private final Configuration configuration;public DefaultSqlSessionFactory(Configuration configuration) {this.configuration = configuration;}@Overridepublic SqlSession openSession() {return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);}
......}
(3) SqlSession
  • 功能:執行CRUD操作、獲取Mapper接口
  • 實現類DefaultSqlSession
  • 關鍵源碼
public class DefaultSqlSession implements SqlSession {private final Configuration configuration;private final Executor executor;private final boolean autoCommit;private boolean dirty;private List<Cursor<?>> cursorList;public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {this.configuration = configuration;this.executor = executor;this.dirty = false;this.autoCommit = autoCommit;}public DefaultSqlSession(Configuration configuration, Executor executor) {this(configuration, executor, false);}@Overridepublic <T> T selectOne(String statement) {return this.selectOne(statement, null);}......}
(4) Executor執行器
類型特點適用場景
SimpleExecutor每次執行創建新Statement常規操作
ReuseExecutor復用預處理Statement高頻相同SQL操作
BatchExecutor批量操作優化大批量數據插入/更新
(5) StatementHandler
  • 職責鏈
    1. 準備Statement對象
    2. 參數綁定
    3. 執行SQL
    4. 結果集映射
  • 核心實現PreparedStatementHandler

三、配置文件加載機制深度解析

1. 配置文件加載流程

App XMLConfigBuilder XMLMapperBuilder Configuration DefaultSqlSessionFactory parse() parse() addMappedStatement() 返回 完成 構建實例 返回 App XMLConfigBuilder XMLMapperBuilder Configuration DefaultSqlSessionFactory

2. 核心源碼分析(MyBatis 3.5.10)

(1) XMLConfigBuilder 關鍵路徑
public Configuration parse() {parseConfiguration(parser.evalNode("/configuration"));return configuration;
}private void parseConfiguration(XNode root) {propertiesElement(root.evalNode("properties"));typeAliasesElement(root.evalNode("typeAliases"));pluginsElement(root.evalNode("plugins"));objectFactoryElement(root.evalNode("objectFactory"));objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));settingsElement(root.evalNode("settings"));environmentsElement(root.evalNode("environments"));databaseIdProviderElement(root.evalNode("databaseIdProvider"));typeHandlerElement(root.evalNode("typeHandlers"));mapperElement(root.evalNode("mappers"));
}
(2) Mapper解析核心邏輯
// XMLMapperBuilder.java
private void configurationElement(XNode context) {String namespace = context.getStringAttribute("namespace");// 解析緩存配置cacheRefElement(context.evalNode("cache-ref"));cacheElement(context.evalNode("cache"));// 解析SQL片段sqlElement(context.evalNodes("/mapper/sql"));// 解析CRUD操作buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
}

四、SQL執行全鏈路剖析

1. 執行流程時序圖

App SqlSession Executor StatementHandler ParameterHandler ResultSetHandler Statement selectOne("com.example.UserMapper.findById", 101) query() prepare() setParameters() execute() handleResultSets() 返回結果對象 User實例 App SqlSession Executor StatementHandler ParameterHandler ResultSetHandler Statement

2. 核心階段源碼分析

(1) 執行器選擇策略
// DefaultSqlSessionFactory.java
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {final Executor executor = configuration.newExecutor(tx, execType);return new DefaultSqlSession(configuration, executor, autoCommit);
}
(2) 參數綁定過程
// DefaultParameterHandler.java
public void setParameters(PreparedStatement ps) {for (int i = 0; i < parameterMappings.size(); i++) {ParameterMapping parameterMapping = parameterMappings.get(i);Object value;String property = parameterMapping.getProperty();// 獲取參數值(支持復雜對象導航)value = parameterMapping.getTypeHandler().getParameter(parameterObject, property);// 設置到PreparedStatementtypeHandler.setParameter(ps, i + 1, value, jdbcType);}
}
(3) 結果集映射核心邏輯
// DefaultResultSetHandler.java
public List<Object> handleResultSets(Statement stmt) throws SQLException {final List<Object> multipleResults = new ArrayList<>();ResultSetWrapper rsw = getFirstResultSet(stmt);// 遍歷結果集while (rsw != null) {// 處理單結果集Object resultObject = handleResultSet(rsw, resultMaps);multipleResults.add(resultObject);rsw = getNextResultSet(stmt);}return collapseSingleResultList(multipleResults);
}

五、生產級最佳實踐

1. SqlSession使用規范

// 正確用法:確保資源釋放
try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.findById(101);// 業務處理...
} // 自動關閉session

2. 執行器選擇策略

場景推薦執行器配置方式
常規單條操作SimpleExecutor默認配置
批量更新操作BatchExecutoropenSession(ExecutorType.BATCH)
高并發重復SQLReuseExecutoropenSession(ExecutorType.REUSE)

3. 二級緩存陷阱規避方案

問題場景

<!-- 錯誤配置:導致臟讀 -->
<cache/>

解決方案

<!-- 正確配置:啟用事務緩存 -->
<cache type="org.apache.ibatis.cache.TransactionalCache"/>

六、總結

本文深入剖析了MyBatis的核心架構運行機制,關鍵要點包括:

  1. 核心對象職責:SqlSessionFactoryExecutorStatementHandler的協作關系
  2. 配置文件加載:XML解析與Configuration對象構建過程
  3. SQL執行全鏈路:從映射到結果集轉換的完整流程

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

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

相關文章

移遠通信攜手高通:以全棧車載解決方案,共繪智能出行新藍圖

6月26日至27日&#xff0c;2025高通汽車技術與合作峰會于蘇州盛大舉辦。本次峰會以 “我們一起&#xff0c;行穩智遠” 為主題&#xff0c;全方位呈現智能汽車全棧技術、全產業鏈生態與全場景體驗。作為高通長期穩定的戰略合作伙伴&#xff0c;移遠通信攜全棧車載智能解決方案深…

拿來就能用的python 課程 1

拿來就能用的python 課程 引言 python是很多人入門計算機語言的首選。 但是繁文縟節&#xff0c;很多人從怎么裝python開始學起&#xff0c;然后python計算&#xff0c;然后什么是函數&#xff0c;然后什么是類&#xff0c;然后就因為太難放棄了。&#xff08;說的是不是你&a…

openssh-server

默認地&#xff0c;Ubuntu桌面版不帶SSH服務器 1 檢查服務是否存在 ls /usr/sbin/sshd2 安裝服務 apt install openssh-server3 關閉防火墻 ufw disable 4 啟動服務 service ssh start

html虛擬滾動,解決dom渲染過多卡頓的問題

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><title>極簡虛擬滾動</title><style>.container {width: 300px;height: 300px;border: 1px solid #ccc;overflow: auto;position: relative;}.pl…

華銳互動:全方位定制化 VR 內容制作服務流程剖析?

華銳互動始終堅持以客戶為中心&#xff0c;為客戶提供全方位、定制化的 VR 內容制作服務。從項目的最初階段開始&#xff0c;華銳互動就會深入了解客戶的需求和目標&#xff0c;與客戶進行充分的溝通和交流&#xff0c;挖掘項目背后的故事和文化內涵&#xff0c;然后根據客戶的…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | DragNDrop(拖拽占用組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— DragNDrop組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> 語法結合…

springboot應用即使使用了連接池,MySQL數據庫仍然有大量sleep狀態的連接

springboot應用即使使用了連接池&#xff0c;MySQL數據庫仍然有大量sleep狀態的連接 問題背景概念理解MySQL配置參數wait_timeout概念Hikari配置參數&#xff08;項目使用hikari作為數據庫連接池&#xff09; 實踐出真知總結和解決思路 問題背景 近期客戶生產環境報&#xff1…

windows下安裝和使用git

本文為windows下git的下載安裝和使用。 git下載和安裝 參考&#xff1a; windows安裝git&#xff08;全網最詳細&#xff0c;保姆教程&#xff09;-CSDN博客 【學了就忘】Git介紹 — 4.Git的安裝 - 簡書 先解決下載時的一些疑惑&#xff1a; 選擇哪個架構&#xff1f; 電腦ARM6…

借助工具給外語視頻加雙語字幕的實用指南?

給外語視頻配上雙語字幕&#xff0c;能讓不同語言背景的觀眾更輕松理解內容&#xff0c;也能讓視頻在傳播時更受歡迎。現在有不少智能工具能幫我們高效完成這項工作&#xff0c;比如 ViiTor AI 平臺&#xff0c;它在處理雙語字幕方面有不少實用功能&#xff0c;下面就結合其功能…

Claude 4 與 Gemini 2.5 Pro:開發者深度比較

Claude 4 與 Gemini 2.5 Pro&#xff1a;開發者深度比較 在使用相同的編碼挑戰對Claude Sonnet 4和Gemini 2.5 Pro Preview進行廣泛的正面測試后&#xff0c;我發現了每個開發人員都應該了解的顯著性能差異。我的發現揭示了執行速度、成本效率以及最重要的&#xff0c;精確執行…

怎么進入9870端口

在實驗時想進入9870端口查看safe狀態 但是輸入localhost:9870后顯示&#xff1a; 首先使用jps確認hadoop狀態&#xff1a; 從 jps 的輸出來看&#xff0c;Hadoop 的核心服務&#xff08;NameNode、DataNode、ResourceManager、NodeManager 等&#xff09;都已經正常運行&…

Windows、Linux、macOS 三大系統安裝 Git 的常見坑點及解決方案,附帶 具體操作示例,幫助新手快速避坑

以下是 Windows、Linux、macOS 三大系統安裝 Git 的常見坑點及解決方案,附帶 具體操作示例,幫助新手快速避坑。 一、Windows 系統安裝 Git 1. 安裝路徑含空格或中文 坑點:默認路徑 C:\Program Files\Git 可能導致某些腳本報錯。 解決:自定義路徑(如 D:\DevTools\Git)。…

OpenAI最新 GPT-4.1 、 GPT-4.1 mini 和 GPT-4.1 nano 新模型如何在ChatGPT付費創作系統平臺對接API使用

GPT-4.1 ?是 OpenAI 于2025年4月15日發布的最新語言模型系列&#xff0c;包括 GPT-4.1 、 GPT-4.1 mini 和 GPT-4.1 nano 三款新成員。這些模型在編程、指令遵循和長上下文理解方面表現出色&#xff0c;支持最大可達100萬個Token的上下文窗口&#xff0c;適用于處理復雜任務和…

計算機網絡(三)傳輸層TCP

目錄 一、TCP概述? 二、TCP三大核心特性 三、 對比UDP?? &#xff08;1&#xff09;TCP、UDP對比 &#xff08;2&#xff09;TCP、UDP頭部格式: &#xff08;3&#xff09;應用場景 ? 四、TCP的三次握手、四次揮手 &#xff08;1&#xff09;三次握手&#xff08;建…

Spring、SpringBoot 本身為什么不提供 Bean 的異步初始化

這是一個很有深度的架構問題&#xff01;Spring/Spring Boot 本身為什么不直接提供 Bean 的異步初始化&#xff1f; 下面從原理、歷史、設計哲學、技術挑戰、社區現狀等多個層面為你詳細分析。 一、Spring Bean 初始化的默認行為 Spring IoC 容器在啟動時&#xff0c;會同步地…

第十三節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - 接口操作審計日志功能

Vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入…

AI掌柜失守記:AI Agent商業自動化邊界實驗

1. 實驗設計&#xff1a;數字掌柜接管實體貨架 1.1 硬件載體與虛擬人格構建 位于舊金山的實驗場地被改造成微型零售生態系統&#xff1a;智能冰箱搭配商品籃構成實體貨架&#xff0c;iPad自助結賬系統連接Venmo支付接口&#xff0c;Slack通訊平臺成為人機交互窗口。Claude So…

NAT 打洞

本文基于NAT3NAT3實現upd打洞&#xff08;假設你對NAT類型已經很清楚&#xff09; 如果A網絡的NATAB網絡的NATB的值大于6則打洞會失敗&#xff0c;需要使用turn中繼服務 STUN協議解析 #pragma once #include "hv/UdpClient.h" #include "fmt/format.h" /*…

java近期工作總結

近期工作中的一些總結 &#xff08;1&#xff09;三層模板和流程 我發現很多東西其實吧&#xff0c;三層就是一個模板和流程&#xff1b; 正向推&#xff0c;從控制層開始&#xff0c;反向從內個sql開始寫&#xff0c;大部分應該就是從xml文件開始的&#xff0c;然后寫到控制層…

vue中的torefs

在 Vue 中&#xff0c; toRefs(state) 的返回值是一個 新對象&#xff0c;其中每個屬性都是對應 state 中原始屬性的 ref 對象。具體來說&#xff1a; 返回值的結構與特性 1. 對象結構 - 若輸入 state 為 { a: 1, b: text } &#xff0c;則 toRefs(state) 返回&a…