MyBatis執行器與ORM特性深度解析

一、MyBatis的Executor執行器詳解

1. MyBatis執行器類型

MyBatis有三種核心執行器實現,在org.apache.ibatis.executor包中定義:

執行器類型特點描述
SimpleExecutor默認執行器,每次執行都會創建新的Statement對象
ReuseExecutor重用預處理語句(PreparedStatement),減少重復編譯
BatchExecutor批量操作執行器,將多個更新操作合并批處理
CachingExecutor裝飾器模式實現,為其他執行器提供二級緩存功能

2. 各執行器實現原理與區別

2.1 SimpleExecutor
  • 工作原理

    • 每次執行update或query都會創建新的PreparedStatement

    • 執行完畢后立即關閉Statement

  • 優點:實現簡單,無狀態,線程安全

  • 缺點:頻繁創建/關閉Statement,性能開銷較大

  • 適用場景:常規單條SQL操作

2.2 ReuseExecutor
  • 工作原理

    • 維護一個Statement緩存Map(key為SQL語句)

    • 相同SQL重復使用已創建的PreparedStatement

  • 優點:減少SQL預編譯開銷,提升重復SQL執行效率

  • 缺點:需要維護Statement緩存,長時間不用的Statement不會主動關閉

  • 適用場景:短時間內重復執行相同SQL語句

2.3 BatchExecutor
  • 工作原理

    • 將多個update操作緩存起來

    • 等待顯式調用flushStatements()時批量提交

    • 使用JDBC的addBatch()/executeBatch()機制

  • 優點:大幅提升批量操作性能(減少網絡往返)

  • 缺點:需要手動控制批量提交時機

  • 適用場景:批量插入、更新、刪除操作

2.4 CachingExecutor
  • 特殊性質

    • 裝飾器模式實現,不單獨使用

    • 為其他執行器添加二級緩存功能

    • 通過TransactionalCacheManager管理緩存事務

  • 工作流程

    1. 先查詢二級緩存

    2. 緩存未命中時委托給被裝飾的執行器執行

    3. 將結果存入緩存

3. 執行器配置與選擇

配置方式(mybatis-config.xml):

xml

<settings><!-- 可選值:SIMPLE(默認), REUSE, BATCH --><setting name="defaultExecutorType" value="REUSE"/>
</settings>
代碼中臨時切換:

java

SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {UserMapper mapper = session.getMapper(UserMapper.class);// 批量操作...session.commit();
} finally {session.close();
}

4. 執行器選擇建議

  1. 常規CRUD:使用默認的SimpleExecutor即可

  2. 高頻重復SQL:考慮使用ReuseExecutor

  3. 批量數據處理:顯式使用BatchExecutor

  4. 緩存需求:配合CachingExecutor使用

二、MyBatis半自動ORM特性解析

1. ORM工具分類標準

特性全自動ORM半自動ORM
SQL生成框架自動生成開發者編寫
對象-關系映射自動映射顯式配置
學習曲線較陡峭較平緩
靈活性較低較高
性能控制較難優化易于優化
典型代表Hibernate, JPAMyBatis

2. MyBatis作為半自動ORM的核心表現

  1. SQL控制權

    • 開發者需要手動編寫和維護SQL語句

    • 可以精確控制每個查詢的細節

    • 支持原生SQL和動態SQL

  2. 映射配置

    • 需要顯式定義ResultMap/ResultType

    • 關聯關系需要手動配置(嵌套查詢/嵌套結果)

    • 支持高級映射(構造函數映射、鑒別器等)

  3. 會話管理

    • 需要手動管理SqlSession生命周期

    • 顯式控制事務邊界

  4. 延遲加載

    • 需要手動配置fetchType="lazy"

    • 理解SqlSession作用域對延遲加載的影響

3. 半自動與全自動ORM的典型區別

查詢示例對比:

JPA (全自動)

java

// 自動生成SQL:SELECT * FROM users WHERE name = ?
List<User> users = entityManager.createQuery("SELECT u FROM User u WHERE u.name = :name", User.class).setParameter("name", "張三").getResultList();

MyBatis (半自動)

xml

<!-- 需手動編寫SQL -->
<select id="findByName" resultType="User">SELECT * FROM users WHERE name = #{name}
</select>

java

// 執行明確映射的SQL
List<User> users = sqlSession.selectList("findByName", "張三");

4. 半自動設計的優勢與代價

優勢

  1. 性能可控:可優化每一句SQL

  2. 靈活性強:支持復雜查詢和存儲過程

  3. 過渡平滑:適合從原生JDBC遷移

  4. 技術債務少:避免全自動ORM的"魔法"行為

代價

  1. 開發效率:需要編寫更多樣板代碼

  2. 維護成本:SQL分散在XML/注解中

  3. 移植性:數據庫方言差異需要手動處理

三、MyBatis核心理解與架構剖析

1. MyBatis架構全景圖

text

[應用程序]|v
[MyBatis API] (SqlSession, MapperProxy)|v
[核心執行流程] |-- 配置解析|-- SQL解析|-- 參數處理|-- SQL執行|-- 結果映射|v
[JDBC]

2. 核心組件與工作流程

  1. 配置階段

    • 解析mybatis-config.xml全局配置

    • 加載Mapper.xml映射文件

    • 構建Configuration對象(包含所有配置信息)

  2. 會話階段

    • 創建SqlSessionFactory

    • 開啟SqlSession(包含Executor實例)

    • 獲取Mapper接口代理對象(MapperProxy)

  3. 執行階段

    • 參數處理(TypeHandler)

    • SQL解析(包括動態SQL)

    • 執行查詢/更新(通過Executor)

    • 結果映射(ResultSetHandler)

  4. 緩存體系

    • 一級緩存(SqlSession級別)

    • 二級緩存(Mapper級別)

3. MyBatis的核心價值主張

  1. SQL與代碼分離

    • SQL保存在XML/注解中

    • 業務代碼不摻雜SQL字符串拼接

  2. 簡化JDBC但不隱藏

    • 封裝了樣板代碼(連接管理、結果集遍歷等)

    • 仍保持對JDBC底層訪問的能力

  3. 靈活的結果映射

    • 支持簡單POJO到復雜嵌套對象

    • 可自定義TypeHandler處理特殊類型

  4. 插件擴展體系

    • 可攔截四大核心組件

    • 實現分頁、審計等通用功能

4. 適用場景分析

最適合場景

  • 需要高度優化SQL性能的項目

  • 遺留數據庫或復雜數據庫模式

  • 需要調用存儲過程的系統

  • 對SQL有深度控制需求的團隊

不太適合場景

  • 快速原型開發

  • 簡單CRUD為主的應用程序

  • 需要跨數據庫移植的項目

5. MyBatis的演進趨勢

  1. 注解支持增強

    • @Select, @Insert等注解功能不斷完善

    • 動態SQL也可以通過@SelectProvider實現

  2. Spring Boot整合

    • MyBatis-Spring-Boot-Starter簡化配置

    • 自動發現Mapper接口

  3. Kotlin支持

    • 更好的Kotlin DSL支持

    • 協程等現代特性整合

  4. 響應式編程

    • 實驗性的響應式MyBatis實現

    • 集成R2DBC等響應式驅動

四、總結對比表格

執行器對比

執行器類型線程安全Statement重用批量支持緩存支持適用場景
SimpleExecutor需裝飾常規操作
ReuseExecutor是(SQL級別)需裝飾重復SQL高頻執行
BatchExecutor需裝飾批量插入/更新
CachingExecutor依賴被裝飾者依賴被裝飾者需要二級緩存的場景

ORM類型對比

特性維度全自動ORMMyBatis(半自動)
學習成本較高中等
開發效率高(簡單CRUD)中(需寫SQL)
性能優化較難容易
復雜查詢支持有限強大
數據庫移植性需手動調整
社區生態豐富(JPA)非常豐富

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

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

相關文章

紅黑樹的特性與實現

在數據結構領域&#xff0c;二叉搜索樹&#xff08;BST&#xff09;憑借 O (log n) 的平均時間復雜度成為查找、插入和刪除操作的優選結構。但它有個致命缺陷&#xff1a;當輸入數據有序時&#xff0c;會退化為鏈表&#xff0c;時間復雜度驟降至 O (n)。為解決這一問題&#xf…

ClickHouse從入門到企業級實戰全解析課程簡介

【課程簡介】你是否正在面臨這些挑戰&#xff1f;海量數據的分析查詢慢如蝸牛&#xff0c;報表一等就是幾小時&#xff1f;想構建實時數倉&#xff0c;卻不知如何高效處理 Kafka 等流式數據&#xff1f;對 ClickHouse 的眾多 MergeTree 引擎感到困惑&#xff0c;不知如何選型&a…

【新啟航】從人工偏差到機械精度:旋轉治具讓三維掃描重構數據重復精度提升至 ±0.01mm

在三維掃描重構領域&#xff0c;傳統人工操作方式受限于人為因素干擾&#xff0c;數據重復精度難以保證&#xff0c;無法滿足高精度工業檢測與逆向工程需求。旋轉治具憑借先進的機械設計與自動化控制技術&#xff0c;將三維掃描重構數據重復精度提升至 0.01mm&#xff0c;實現從…

《匯編語言:基于X86處理器》第13章 復習題和編程練習

本篇記錄了《匯編語言&#xff1a;基于X86處理器》第13章 復習題和編程練習的學習筆記。13.6 復習題1.當匯編過程被高級語言程序調用時&#xff0c;主調程序與被調過程是否應使用相同的內存模式?答&#xff1a;主調程序與被調過程使用的內存模式必須相同。2.C 和 C程序調用匯編…

SpringAI智能航空助手實戰<Demo>

我們將如何將我們得傳統業務進行智能化的改造>>>1.將我們傳統的航空票務系統 我們之前通過按鈕的方式來完成 現在我們通過智能對話的方式完成 >現在我們通過對話的方式來完成 整個智能化的改造 傳統應用如何進行智能化改造 我們把我們的項目通過Spring-ai 來接入A…

windows git安裝步驟

1&#xff0c;從官網下載安裝包&#xff1a;gitg官網 進行安裝 2&#xff0c;配置git環境&#xff1a; git config --global user.name "Your Name" git config --global user.email "Your Email"3&#xff0c;生成 SSH Key&#xff1a; ssh-keygen -t r…

使用chroma和LlamaIndex做RAG增強

RAG 原理&#xff1a;通過 “檢索&#xff08;從知識庫獲取相關信息&#xff09;→ 增強&#xff08;將信息作為上下文輸入模型&#xff09;→ 生成&#xff08;模型基于上下文回答&#xff09;” 三步&#xff0c;解決大模型知識時效性、領域局限性問題。 接下來將完成這么一個…

2025 最應避免的攝影陷阱以及解決方案

你有沒有想過&#xff0c;當你拍完了一個完美的場景后&#xff0c;卻發現畫面模糊、光線不足&#xff0c;或者更糟的是&#xff0c;存儲卡中的文件丟失了&#xff1f;這些問題可能會發生在任何人身上&#xff0c;無論是業余愛好者、專業人士還是最好的攝影師。當珍貴的記憶變成…

python類--python011

面向對象編程中的類的概念、屬性使用、繼承和類的改造問題等。7.1 初識類在軟件編程中&#xff0c;面向過程和面向對象是兩種主要的編程方法。面向過程的編程強調通過函數來實現特定的功能&#xff0c;具有靈活性&#xff0c;但在復雜系統中往往導致代碼重復&#xff0c;維護困…

Python函數篇:從零到精通

一、函數1.1 為什么有函數我們對于一個項目時&#xff0c;會有上千甚至上萬條代碼&#xff0c;當我們要使用到某個函數時&#xff0c;例如我需要計算一個求和代碼&#xff0c;獲得求和的值來服務我們的項目&#xff0c;那我們可能會這樣#計算1&#xff5e;100的和 theSun 0 fo…

QT項目之記事本

本文用QT實現記事本功能。一、成品展示1.界面主要元素&#xff1a;1.標題為MyNoteBook&#xff1b;2.相應圖標為&#xff1a;打開文件&#xff0c;保存&#xff0c;退出&#xff1b;3.右下角標注光標所在行列&#xff0c;默認編碼方式為UTF-8&#xff1b;4.鼠標所在圖標位置時會…

【軟件測試】性能測試 —— 工具篇 JMeter 介紹與使用

&#x1f970;&#x1f970;&#x1f970;來都來了&#xff0c;不妨點個關注叭&#xff01; &#x1f449;博客主頁&#xff1a;歡迎各位大佬!&#x1f448; 文章目錄1. JMeter 的介紹2. JMeter 安裝、配置、搭建2.1 前置條件 —— Java環境搭建2.2 JMeter 下載2.3 JMeter 安裝…

二十二、Mybatis-快速入門程序

入門程序大概步驟敘述&#xff1a; 步驟一&#xff1a;創建springboot工程并且數據庫提前創建表步驟二&#xff1a;創建springboot工程對Mybatis相關依賴注意打勾步驟三&#xff1a;編寫查找方法步驟四&#xff1a;編寫測試方法項目目錄結構與數據庫以及代碼&#xff1a; 項目目…

Blender模擬結構光3D Scanner(一)外參數匹配

如何使用Blender模擬FPP(Fringe Projection Profilometry) 原理的結構光3D傳感器&#xff1f;主要包含的工作有&#xff1a;1&#xff09;相機、投影儀定位與內外參數匹配&#xff1b;2&#xff09;投影儀投射指定Pattern圖像&#xff1b;3&#xff09;被測物體材質屬性配置等&…

LangChain是如何實現RAG多輪問答的

目錄引言一、LangChain實現RAG多輪問答核心機制1. 對話歷史管理&#xff08;Memory&#xff09;2. 問題重寫&#xff08;Query Rewriting&#xff09;3. 檢索增強生成&#xff08;RAG Core&#xff09;4. 鏈式工作流&#xff08;Chain&#xff09;二、關鍵設計特點三、完整示例…

DAY 44 預訓練模型

知識點回顧&#xff1a; 預訓練的概念常見的分類預訓練模型圖像預訓練模型的發展史預訓練的策略預訓練代碼實戰&#xff1a;resnet18 一、預訓練的概念 我們之前在訓練中發現&#xff0c;準確率最開始隨著epoch的增加而增加。隨著循環的更新&#xff0c;參數在不斷發生更新。 所…

Java Stream API 中常用方法復習及項目實戰示例

在最近的練手項目中&#xff0c;對于stream流的操作愈加頻繁&#xff0c;我也越來越感覺stream流在處理數據是的干凈利落&#xff0c;因此寫博客用來記錄最近常用的方法以便于未來的復習。map() 方法map()是一個中間操作&#xff08;intermediate operation&#xff09;&#x…

從零開始手搓一個GPT大語言模型:從理論到實踐的完整指南(一)

現在人工智能飛速發展時代&#xff0c;LLM絕對可以算是人工智能領域得一顆明珠&#xff0c;也是現在許多AI項目落地得必不可少得一個模塊&#xff0c;可以說&#xff0c;不管你之前得研究領域是AI得哪個方向&#xff0c;現在都需要會一些LLM基礎&#xff0c;在這個系列&#xf…

Redis ubuntu下載Redis的C++客戶端

1. 安裝 redis-plus-plus C 操作 Redis 的庫有很多&#xff0c;這里選擇使用 redis-plus-plus&#xff0c;這個庫的功能強大&#xff0c;使用簡單。 Github 地址&#xff1a;GitHub - sewenew/redis-plus-plus: Redis client written in C 訪問不了Github 地址的可以使用Ste…

nm命令和nm -D命令參數

出現這種差異的原因在于&#xff1a;動態庫中的符號分為兩種類型&#xff1a; 常規符號表&#xff08;regular symbol table&#xff09;&#xff1a;通常用于靜態鏈接和調試&#xff0c;默認不包含在動態庫中&#xff08;除非顯式保留&#xff09;。動態符號表&#xff08;dyn…