mybatis源碼解析 - 核心流程之ResultSet解析

接上篇 mybatis核心運行流程之第三階段--mybatis數據庫數據讀寫設計,上次還留有一個重要的模塊,也就是sqlSession進行數據庫操做後,對結果集進行解析、映射和轉換成POJO的過程代碼解析。今天咱們就來爲此作個圓滿收尾,同時也是完成前幾篇文章提出那個問題的最後環節解答。算法

核心運行流程sql

image.png

對數據庫讀寫階段的設計還有這最後一個模塊了,鳳凰涅槃就在此舉~~ 最後階段沒有太多的彎彎繞繞、設計套路、目標很明確! 有了前面的基礎組件設計和流程的解析和鋪墊,最後一搏應該豁然開朗纔對。~ 咱們直指源碼吧!數據庫

源碼解析mybatis

先找準解析的入口: PreparestatementHandler-->query()方法架構

image.png

核心處理接口ResultSetHandller框架

進入DefaultResultSetHandler-->handleResultSets()方法,此方法是ResultSet映射和轉換的核心骨架方法ide

image.png

讀上面的代碼咱們大概能夠得知:學習

1. mybatis要轉換後的結果集,多是一個多結果集List容器;
spa

2.首先從結果中獲取第1個結果集ResultMap進行解析,最終結果放入multipleResults容器;設計

3.結果集核心處理方法handleResultSet()方法;

進入內核處理方法: DefaultResultSetHandler-->handleResultSet()

image.png

進入內核處理方法: DefaultResultSetHandler-->handleRowValues()

image.png

在平常開發中,普通結果集使用場景更多一些,這裏進入handleRowValuesForSimpleResultMap()方法

image.png

讀以上代碼,咱們能夠得知結果集映射的流程爲:

1.首先根據分頁信息(mybatis內置的內存分頁),提取也數據進行映射;

2.分頁遍歷每一行記錄,經過getRowValue()映射單行記錄成對象;

3. 經過storeObject()方法保存,行映射轉換結果;

接下來,咱們重點來看看getRowValue()方法的映射實現

image.png

從以上的代碼,咱們能夠理出一個比較直觀處理脈絡

image.png

對未指明映射規則的列,進行自動映射

image.png

對已指明映射規則的列,進行映射

image.png

OK, 看到以上的核心代碼,是否是對ResultSet進行結果集映射的算法思路和流程都瞭如指掌了?打完收工,如下咱們根據以上的脈絡,繪製出ResultSet結果集映射核心調用鏈路圖,你們再過一遍!

整體調用鏈路

image.png

總結

到這裏mybatis三個階段的核心運行流程的源碼解析就所有完畢了。但願能爲讀源碼的同窗提供這樣一種源碼思路:(1)首先看清楚源碼的骨架和基礎設施,學習它們的思想和設計技巧;(2)但凡框架級源碼都比較多,分析全量的源碼不太現實(時間成本也過高),應該找經常使用或核心業務模塊,理順其總體運行流程;(3)在前兩步的基礎上,重點分析感興趣設計的優缺點,從而提高本身的架構和設計能力! 今天的源碼分享就先到這裏,更多源碼和乾貨,請繼續關注!

相關文章
相關標籤/搜索