mybatis源码解析(五) --- typehandler注册和处理的查询结果对象的类型转换
生活随笔
收集整理的這篇文章主要介紹了
mybatis源码解析(五) --- typehandler注册和处理的查询结果对象的类型转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一次分析了mapper接口動態代理調用的處理過程,在查詢結果后,然后轉換的java所對應的類型,這篇文章將對這個類型轉換處理詳細介紹,在Configuration中TypeHandlerRegistry這個類,是用來注冊
可以看到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默認加的后綴,然后處理每一列的轉換。總結
以上是生活随笔為你收集整理的mybatis源码解析(五) --- typehandler注册和处理的查询结果对象的类型转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: extjs中js资源缓存策略
- 下一篇: 【MongoDB系列】:MongoDB