mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換

xjz1842發表於2018-05-17

上一次分析了mapper介面動態代理呼叫的處理過程,在查詢結果後,然後轉換的java所對應的型別,這篇文章將對這個型別轉換處理詳細介紹,在Configuration中TypeHandlerRegistry這個類,是用來註冊

mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
可以看到TypeHandlerRegistry註冊java中各種型別的型別處理器。
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
預設handler處理器的是Confguration中建立的faultResultHandler結果處理器,
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
這個是PreparedStatementHandler類中,執行query方法後,呼叫的ResultHandler呼叫handleResultSets方法,返回處理結果。
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
首先使從MapperStatement中查詢對應的ResultMap物件,這裡ResultMaps只有一個物件,就是我們在Mapper介面方法返回值型別,這裡有點不是很明白,它這裡設計有個有個返回值的,但是java裡面不是隻有一個返回值嗎,回頭再思考下,先看下面最重要的處理結果的過程,首先遍歷ResultMap列表,接著呼叫handlerResultSet介面,處理單個結果集,然後獲取下一個結果集,清除巢狀的物件的快取。
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
這裡主要是處理單個結果集,沒有父節點的對映,resultHandler為null,則呼叫的是DefaultResultHandler,接著呼叫handlerRowValue,最後關閉當前結果集。接下來重要看一下處理每一行程式碼的。
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
這裡分為是否沒有巢狀的物件,如果沒有,則處理沒一行的值,下面就簡單看一下handlerRowValueForSimpleResultMap這個方法.
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
這個方法主要是的獲取當前行的每一行的值,並轉換成物件,這個過程主要是在getRowValue這個方法中完成的,然後呼叫storeObject方法。儲存轉換後的結果儲存DefaultResultHandler中去。
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
這裡首先代用createResultObject建立一個空的物件,然後呼叫Configuration中的newMetaObject方法建立一個元物件。然後呼叫applyAutomaticMappings,就是自動對映設定值到反射生成的物件中去,然後在設定有屬性對映的 屬性,處理完返回。
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
看到這裡利用反射機制建立一個空的物件,然後接處理設定值到物件的每一個屬性上設值。
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
這裡ObejectFactory建立的物件,反射完成建立返回的bean物件。
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
這裡是先粗粒自動對映的列的值, 然後在執行有對映的列的值。最後返回。
mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換
這段程式碼是找到自動對映的屬性,先從快取中去,這裡看到的mapperKey的組成resultMap+":"+columnPrefix,resultMapId程式過除錯發現是類全名.方法名.-inline, 這個inline預設加的字尾,然後處理每一列的轉換。

相關文章