MyBatis 原理淺析——基本原理
前言
MyBatis 是一個被廣泛應用的持久化框架。一個簡單的使用示例如下所示,先建立會話工廠,然後從會話工廠中開啟會話,通過 class 型別和配置生成 Mapper 介面的代理實現,最後使用 Mapper 進行持久化操作。
本文將從 MyBatis 中的 SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession 和 Mapper 幾個方面入手簡單分析 MyBatis 的實現原理。在後面的系列文章中會進一步具體分析核心類的細節實現。
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 使用 Builder 模式去生成 SqlSessionFactory,因此只提供了多個 build 方法。這些方法可以接受 XML 配置檔案的 Reader 或 InputStream 輸入流,也可以傳入 environment 指定環境或傳入 Properties 作為屬性。
在 build 方法的實現中,首先根據傳入的輸入流、environment 和 Properties 構建 XMLConfigBuilder 物件,然後呼叫其 parse() 方法解析 XML 檔案得到 Configuration 物件,最後建立 SqlSessionFactory 物件並返回。
SqlSessionFactory
SqlSessionFactory 是一個工廠介面,預設實現是 DefaultSqlSessionFactory。SqlSessionFactory 的作用是獲取 SqlSession,因此提供了多個 openSession 方法,支援從 DataSource 資料來源和一個給定的連線 Connection 中建立 SqlSession。
openSession 方法的底層實現可以分為 5 步:
①從 Configuration 物件中獲取環境配置 Environment;
②根據環境配置得到事務工廠 TransactionFactory;
③從事務工廠得到事務 Transaction,Transaction 包裝了資料庫連線,處理資料庫連線的建立、準備、提交、回滾和關閉;
④建立執行器 Executor;
⑤建立 SqlSession,返回 DefaultSqlSession 的例項。
其中從 DataSource 資料來源建立 SqlSession 的過程如下所示:
建立 SqlSessionSqlSession
SqlSession 是一個介面,預設實現是 DefaultSqlSession,提供了多種資料庫操作方式,如 select、selectOne、selectList、insert、update、delete、commit、rollback 和 getMapper 等方法。getMapper 方法用於獲取 Mapper 介面的代理實現。在 MyBatis 中建議使用 Mapper 介面操作資料庫。
資料庫的增刪改查和事務的提交回滾都是通過 Executor 執行的。Executor 有 3 種類型 SIMPLE、REUSE、BATCH,預設使用簡易執行器 SIMPLE,REUSE 型別執行器重用預處理語句,BATCH 型別執行器重用預處理語句和批量更新。Executor 物件的建立在 Configuration 型別的 newExecutor 方法中進行。
Executor 在執行過程中,會用到 StatementHandler、ParameterHandler 和 ResultHandler,其中 StatementHandler 封裝了 java.sql.Statement 的相關操作,ParameterHandler 封裝了 SQL 對引數的處理,ResultHandler 封裝了對返回資料集的處理。Executor 的執行過程,就是對這 3 個物件的排程過程。更多分析在後續文章中進行。
Mapper
Mapper 是通過 JDK 動態代理實現的,在 MapperProxyFactory 中建立 MapperProxy 並進行介面代理封裝。對 Mapper 介面的呼叫實際上是由 MapperProxy 實現的。
JDK 動態代理在 MapperProxy 中,實現了 InvocationHandler 的 invoke 方法。methodCache 是一個 ConcurrentHashMap,其中儲存了方法與 MapperMethod 的對應關係。從 methodCache 快取中獲取或建立 MapperMethod 物件,然後呼叫 MapperMethod 物件的 execute 方法執行資料庫操作。
MapperProxy建立 MapperMethod 物件時,會在建構函式中初始化 SqlCommand 和MethodSignature。SqlCommand 包含了資料庫操作的名稱,格式為 “介面名.操作名稱”,以及 XML 中配置的操作型別,如 select、update等,把一個 Mapper 介面與 XML中的一個配置結合起來。MethodSignature 是方法的簽名,標記了方法的返回值型別,對於使用 RowBounds(offset 和 limit 配置)、ResultHandler(結果處理回撥)作為引數的方法記錄引數位置並初始化引數處理器。
在 MapperMethod 的 execute 方法中,根據 SqlCommand 中的配置選擇 SqlSession 的方法,根據 MethodSignature 的配置處理傳入的引數,呼叫 SqlSession 的方法進行資料庫操作,最後根據 MethodSignature 的返回值型別返回操作結果。
每週 3 篇學習筆記或技術總結,面向有一定基礎的 Java 程式設計師,內容涉及 Java 進階、虛擬機器、MySQL、NoSQL、分散式計算、開源框架等多個領域。關注作者或微信公眾號 backend-develop 第一時間獲取最新內容。
相關推薦
MyBatis 原理淺析——基本原理
前言MyBatis 是一個被廣泛應用的持久化框架。一個簡單的使用示例如下所示,先建立會話工廠,然後從會話工廠中開啟會話,通過 class 型別和配置生成 Mapper 介面的代理實現,最後使用 Mapper 進行持久化操作。本文將從 MyBatis 中的 SqlSessionFactoryBuilder、Sq
twemproxy0.4原理分析-基本原理介紹和優缺點分析
引言 接下來將會寫一個分析twemproxy的系列。該系列會對twemproxy最新版v0.4的原始碼進行分析,對設計原理進行剖析,力求用通俗的語言和圖來表達設計思想,並結合實際的使用達到深入淺出的效果。 概述 twemproxy是一個redis和memcached的輕量級分
MyBatis原理淺析
簡介 MyBatis是一個輕量級的ORM框架,它簡化了對關係資料庫的使用,開發人員可以在XML或註解中編寫SQL來完成對資料庫的操作。 如果完全使用XML方式,SQL語句可以集中維護,做到與Java程式碼完全隔離,便於對SQL調優。 原理及流程 載
貝葉斯算法的基本原理和算法實現
utf shape less 流程 我們 def .sh 詞向量 貝葉斯算法 一. 貝葉斯公式推導 樸素貝葉斯分類是一種十分簡單的分類算法,叫它樸素是因為其思想基礎的簡單性:就文本分類而言,它認為詞袋中的兩兩詞之間的關系是相互獨立的,即一個對象 的特征向量
mysql線程池的實現原理淺析
new one lose clear pre turn logs color 否則 今天抽空主要看了一下mysql線程池(cached threads)的實現原理,總體並不那麽復雜,也學到了一些設計原理,值得記錄一下。為了簡化代碼,讓思路更清晰,我刪去了不少錯誤處理,線程同
JAVA語言開發基本原理
源文件 cli lips font 實現 環境 java字節碼 類庫 java開發工具 1.java編譯運行過程 java源文件(.java)經過編譯,編譯為java字節碼文件(.class),JVM來加載.class文件並運行.class文件。 2.JVM 不同系
哈希(Hash)與加密(Encrypt)的基本原理、區別及工程應用
class 區別 自己 裏的 lpad returns .net 角度 table 0、摘要 今天看到吉日嘎拉的一篇關於管理軟件中信息加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了信息管理軟件中如何通過哈希和加密進行數據保護。但是從文章評論
計算機程序的思維邏輯 17 - 繼承實現的基本原理
pass his aoe bin 原理 aer and 思維 bit %E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%80%9D%E7%BB%B4%E9%80%BB%E8%BE%91%2017%20-%20
計算機程序的思維邏輯 12 - 函數調用的基本原理
san emd insight msm cgo xiang pri car 程序 spring%E6%9C%8D%E5%8A%A1%E5%AE%9A%E4%BD%8D%E5%99%A8%EF%BC%8C%E5%8F%AF%E5%9C%A8%E4%BB%BB%E4%BD%95
防盜鏈的基本原理與實現
rec eal limit ole 站點 new exceptio stub text 1. 我的實現防盜鏈的做法,也是參考該位前輩的文章。基本原理就是就是一句話:通過判斷request請求頭的refer是否來源於本站。(當然請求頭是來自於客戶端的,是可偽造的,暫不在本文
Objection基本原理
navi dex https jsb logs implement efault 默認 center 1,Objection 的簡介 就是一個依賴註入框架,github地址:https://github.com/atomicobject/objection 2,Objec
【SSH進階之路】Struts基本原理 + 實現簡單登錄(二)
target doctype 掌握 pack insert enter snippet file manage 上面博文,主要簡單的介紹了一下SSH的基本概念,比較宏觀。作為剛開始學習的人可以有一個總體上的認識,個人覺得對學習有非常好的輔助功能,它不不過
【轉】哈希(Hash)與加密(Encrypt)的基本原理、區別及工程應用
phy 理論 靈活運用 十分 實際應用 廣泛 tle 多網站 net 0、摘要 今天看到吉日嘎拉的一篇關於管理軟件中信息加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了信息管理軟件中如何通過哈希和加密進行數據保護。但是從文章評論中也可以
Kafka 基本原理
本地 fix streams 均衡 fig rgs exception format 公司 簡介 Apache Kafka是分布式發布-訂閱消息系統。它最初由LinkedIn公司開發,之後成為Apache項目的一部分。Kafka是一種快速、可擴展的、設計內在就是分布式的
API Hook基本原理和實現
use 概率 缺省 後綴 origin gif object cati mov API Hook基本原理和實現 2009-03-14 20:09 windows系統下的編程,消息message的傳遞是貫穿其始終的。這個消息我們可以簡單理解為一個有特定
分布式事務處理基本原理
分布式系統 保存 idt 用戶 新的 標準 nbsp 對數 兩個 事務是有一系列對系統中數據進行訪問與更新的操作組成的一個基本的程序邏輯執行單元。引入事務的概念有兩個目的,第一,事務對多個並發訪問的應用程序進行隔離,防止彼此幹擾,第二,事務為數據庫操作序列提供了一個失敗回復
zookeeper基本原理
基於 同步 服務集群 設計 服務 高性能 官方 可靠 需要 服務集群對外提供服務的過程中,有很多的配置需要隨時更新,服務間需要協調工作,這些信息如何推送到各個節點?並且保證信息的一致性和可靠性? 用Zookeeper實現了一 個配置管理中心,利用Zookeeper將配置信
交換機的基本原理與配置
mac地址 console 以太網幀 securecrt 楊書凡 交換機工作在數據鏈路層,負責網絡相鄰節點之間的數據通信,並進行流量控制,主要通過幀在對等層間數據傳輸。在物理線路上提供可靠的數據傳輸,對網絡層而言為一條無差錯的線路。 MAC地址 計算機聯網的必備硬件是網卡,每
路由器的基本原理與配置命令(靜態路由和默認路由)
路由技術 路由表 route命令 路由環路 楊書凡 路由器工作在OSI參考模型的網絡層,它的重要作用是為數據包選擇最佳路徑,最終送達目的地。那麽路由器是怎樣選擇路徑的呢?如果主機A要和主機B通信,就需要一種方法判斷源主機和目標主機所經過的最佳路徑,從而進行數據轉發,這就是路由技術。
【苦讀官方文檔】2.Android應用程序基本原理概述
project 做出 系統默認 體驗 告訴 sta 執行過程 顏色 硬件配置 官方文檔原文地址 應用程序原理 Android應用程序是通過Java編程語言來寫。Android軟件開發工具把你的代碼和其它數據、資源文件一起編譯、打包成一個APK文件