mybatis源碼解析(五) --- typehandler註冊和處理的查詢結果對象的類型轉換

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

能夠看到TypeHandlerRegistry註冊java中各類類型的類型處理器。
默認handler處理器的是Confguration中建立的faultResultHandler結果處理器,
這個是PreparedStatementHandler類中,執行query方法後,調用的ResultHandler調用handleResultSets方法,返回處理結果。
首先使從MapperStatement中查找對應的ResultMap對象,這裏ResultMaps只有一個對象,就是咱們在Mapper接口方法返回值類型,這裏有點不是很明白,它這裏設計有個有個返回值的,可是java裏面不是隻有一個返回值嗎,回頭再思考下,先看下面最重要的處理結果的過程,首先遍歷ResultMap列表,接着調用handlerResultSet接口,處理單個結果集,而後獲取下一個結果集,清除嵌套的對象的緩存。
這裏主要是處理單個結果集,沒有父節點的映射,resultHandler爲null,則調用的是DefaultResultHandler,接着調用handlerRowValue,最後關閉當前結果集。接下來重要看一下處理每一行代碼的。
這裏分爲是否沒有嵌套的對象,若是沒有,則處理沒一行的值,下面就簡單看一下handlerRowValueForSimpleResultMap這個方法.
這個方法主要是的獲取當前行的每一行的值,並轉換成對象,這個過程主要是在getRowValue這個方法中完成的,而後調用storeObject方法。存儲轉換後的結果存儲DefaultResultHandler中去。
這裏首先代用createResultObject建立一個空的對象,而後調用Configuration中的newMetaObject方法建立一個元對象。而後調用applyAutomaticMappings,就是自動映射設置值到反射生成的對象中去,而後在設置有屬性映射的 屬性,處理完返回。
看到這裏利用反射機制建立一個空的對象,而後接處理設置值到對象的每個屬性上設值。
這裏ObejectFactory建立的對象,反射完成建立返回的bean對象。
這裏是先粗粒自動映射的列的值, 而後在執行有映射的列的值。最後返回。
這段代碼是找到自動映射的屬性,先從緩存中去,這裏看到的mapperKey的組成resultMap+":"+columnPrefix,resultMapId進程過調試發現是類全名.方法名.-inline, 這個inline默認加的後綴,而後處理每一列的轉換。
相關文章
相關標籤/搜索