導航:首頁 > 源碼編譯 > mybatis源碼指南

mybatis源碼指南

發布時間:2025-01-07 12:43:07

Ⅰ 從源碼角度分析 Mybatis 工作原理

本文以入門級示例說明 MyBatis 工作原理,涵蓋資料庫准備、添加 MyBatis、配置、Mapper、測試程序、生命周期、映射器、架構、SqlSession 機制等內容。通過源碼解析詳細展現 MyBatis 如何將 java 代碼與資料庫操作緊密結合。

資料庫准備:針對用戶表進行 CRUD 操作,設計數據模型。

添加 MyBatis:Maven 依賴配置,引入 MyBatis 依賴。

MyBatis 配置:XML 配置文件設置數據源、事務管理器。

Mapper:包含 Mapper.xml 和 Mapper.java 文件,實現 SQL 模板與 Java 對象綁定。

測試程序:MyBatisDemo.java 文件,展示如何使用 SqlSession 執行操作。

MyBatis 生命周期:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession 的創建、使用與釋放。

映射器:介面定義與動態代理生成,完成 SQL 與 Java 方法的映射。

架構:配置層、介面層、數據處理層、框架支撐層,展現 MyBatis 體系結構。

SqlSession 內部工作機制:解析 SQL、管理緩存、執行事務、處理結果集。

總結:MyBatis 通過封裝、映射、執行等機制,簡化了 Java 與資料庫的交互過程,實現數據操作的便捷與高效。

Ⅱ Mybatis源碼分析

上面這兩幅圖來源於網路,不過畫的很好,基本說明了Mybatis的架構流程。

說明:

Executor

MyBatis執行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護

StatementHandler

封裝了JDBC Statement操作,負責對JDBC statement 的操作,如設置參數、將Statement結果集轉換成List集合。

ParameterHandler

負責對用戶傳遞的參數轉換成JDBC Statement 所需要的參數

ResultSetHandler

負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合

TypeHandler

負責java數據類型和jdbc數據類型之間的映射和轉換

SqlSource

負責根據用戶傳遞的parameterObject,動態地生成SQL語句,將信息封裝到BoundSql對象中,並返回BoundSql表示動態生成的SQL語句以及相應的參數信息

基本上Mybatis的流程就是這樣了,其中還有很多實現細節暫時看不太懂。 我認為學習框架源碼分為兩步:

目前第一步尚有問題,需要多走幾遍源碼,加深下理解,一起加油~~

Ⅲ Mybatis源碼詳解系列(四)--你不知道的Mybatis用法和細節

這是 Mybatis 系列博客的第四篇,我將擴展一些其他特性或使用細節,掌握它們可以更優雅、高效地使用 mybatis。

本文的所有測試例子都是基於本系列 Mybatis 第一篇文章的項目,相關博客如下:

Mybatis源碼詳解系列(一)--持久層框架解決了什麼及如何使用Mybatis

Mybatis源碼詳解系列(二)--Mybatis如何載入配置及初始化

Mybatis源碼詳解系列(三)--從Mapper介面開始看Mybatis的執行邏輯

在分析源碼時,我們提到過 ResultHandler 這個介面。當 Mapper 介面的入參列表中包含 ResultHandler 且返回類型為 void 時,mybatis 會將映射完的每一個 Employee 對象傳入 ResultHandler 中。通過 ResultHandler,我們可以對傳進來的 Employee 對象進行任意處理。

這里我提供了一個 ResultHandler 實現類的示例。我認為,官方之所以提供 ResultHandler,是考慮到 resultMap 也有映射不了的對象而做的補充。所以,當我們遇到 resultMap 也映射不了的對象時,可以考慮使用 ResultHandler。

在使用篇中,我們使用 pagehelper 來支持分頁功能,其實,mybatis 已經自帶了分頁功能。和 ResultHandler 一樣,我們只需要改造下 Mapper 介面。通過 RowBounds 中指定好結果的范圍,mybatis 就會幫我們自動分頁。相比使用插件,這種方式不是更簡單嗎?那麼,我為什麼還要使用插件呢?其實,當我們看到控制台列印的 sql,就應該知道原因了。mybatis 使用 RowBounds 進行分頁,本質上是把所有數據查出來,再放到應用內存里分頁,這種方式非常耗性能和內存。所以,RowBounds 了解一下就可以了,實際項目中分頁還是考慮引入插件吧。

在使用篇中,我們通過配置 lazyLoadingEnabled 來開啟延遲載入。按理來說,只有我調用了 getDepartment 時,才會觸發查詢部門的操作,不調用的話永遠都不會觸發。而實際上真的是這樣嗎?下面的方法中,我們把 getDepartment 注釋掉。運行測試,控制台中竟然列印了查詢部門的 sql。說好的延遲載入呢?其實並沒有,根本原因就在於,mybatis 認為,toString 里會用到 department 欄位,所以觸發了查詢部門。那麼,我們如何改變這種行為呢?mybatis 提供了配置項 lazyLoadTriggerMethods。我們將配置修改如下。再次測試上面的例子。這時,嵌套對象就沒有被載入出來了。作為延遲載入部分的總結,這里對比下不同配置項組合的效果。

如果我希望部分關聯對象不用延遲載入,部分關聯對象又需要,例如,查詢員工對象時,部門跟著查出來,而角色等到需要用的時候再載入。針對這種情況,可以使用 fetchType 來覆蓋全局配置。

mybatis 的結果集自動映射默認是開啟的,可以使用 setting 配置項進行修改。它有三種自動映射等級。上面的 xml 中,如果你的自動映射等級為 PARTIAL,則會出現這樣的結果。所以,我強烈建議自動映射等級配置為 FULL。另外,無論是否在全局開啟了自動映射,你都可以通過 autoMapping 屬性進行覆蓋。

以上補充了一些 mybatis 的「彩蛋」,後續發現其他有趣的地方還會繼續補充,也歡迎大家指正不足的地方。最後,感謝閱讀。

閱讀全文

與mybatis源碼指南相關的資料

熱點內容
緩存伺服器管理員不允許怎麼處理 瀏覽:884
vb命令按鈕顏色 瀏覽:581
airpods在安卓怎麼設置雙擊 瀏覽:146
用友t3伺服器地址變動 瀏覽:324
伺服器掛了找誰伺服器地址 瀏覽:577
單片機p30引腳功能 瀏覽:283
oracle命令導出資料庫 瀏覽:597
python多行代碼編譯窗口 瀏覽:969
如何解壓精神壓力 瀏覽:190
嶽麓版高中歷史課本pdf 瀏覽:417
中國銀行app充話費怎麼看電話號碼 瀏覽:427
安卓手機安裝量達到上限怎麼辦 瀏覽:306
清除bitlocker加密 瀏覽:357
實木地板打龍骨要加密嗎 瀏覽:122
安卓手機怎麼用fv懸浮器 瀏覽:805
疫情期間程序員的失業 瀏覽:208
微信samplephp 瀏覽:166
食物解壓系列素材 瀏覽:767
python人工智慧視頻 瀏覽:615
修腳視頻解壓嵌甲 瀏覽:851