上一次分析了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註冊和處理的查詢結果物件的型別轉換
相關文章
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- myBatis原始碼解析-型別轉換篇(5)MyBatis原始碼型別
- MyBatis(九):MyBatis型別處理器(TypeHandler)詳解MyBatis型別
- mybatis原始碼解析(四)--- MapperStatement的註冊MyBatis原始碼APP
- 【Mybatis系列】從原始碼角度理解Mybatis的資料轉換器TypeHandlerMyBatis原始碼
- MyBatis(三) mybatis-config.xml元素說明、型別處理器typeHandler的使用MyBatisXML型別
- PostgreSQL 原始碼解讀(202)- 查詢#115(型別轉換)SQL原始碼型別
- Mybatis底層原理學習(三):查詢結果集的處理原理MyBatis
- PostgreSQL 原始碼解讀(203)- 查詢#116(型別轉換實現)SQL原始碼型別
- SpringMVC(二)處理器方法繫結形參(簡單型別和註解@RequestParam,pojo型別)、自定義型別轉換器、springMVC亂碼解決SpringMVC型別POJO
- java基本型別和物件之間的轉換Java型別物件
- 2.3、mybatis原始碼分析-基礎模組之型別轉換MyBatis原始碼型別
- Mybatis模糊查詢結果為空MyBatis
- [Python影象處理] 五.影象融合、加法運算及影象型別轉換Python型別
- Mybatis 查詢語句結果集總結MyBatis
- Spring原始碼解析-applicationContext.xml載入和bean的註冊Spring原始碼APPContextXMLBean
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現(五)之過期原始碼
- Mybatis原始碼之美:3.4.解析處理parameterMap元素MyBatis原始碼
- MySQL探祕(五):InnoDB鎖的型別和狀態查詢MySql型別
- mysql bigint型別和datetime型別的轉換MySql型別
- Qt元物件系統自帶型別與註冊型別的判斷QT物件型別
- 從規範的角度解析物件 — 原始值轉換物件
- Golang語言包-字串處理strings和字串型別轉換strconvGolang字串型別
- Mybatis TypeHandler 的使用MyBatis
- Javascrip 之 字串處理 & 定時器 & 型別轉換Java字串定時器型別
- 《手寫Mybatis》第4章:Mapper XML的解析和註冊使用MyBatisAPPXML
- Mybatis實踐(一)型別轉換器MyBatis型別
- Netty原始碼分析--Channel註冊(上)(五)Netty原始碼
- SpringMVC 解析(五)URI連結處理SpringMVC
- mybaits原始碼分析--型別轉換模組(三)AI原始碼型別
- springboot~mybatis-plus中使用TypeHandler做型別對映Spring BootMyBatis型別
- Oracle 12CR2查詢轉換之星型轉換Oracle
- spring原始碼解析之IOC容器(二)------載入和註冊Spring原始碼
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現(一)之註冊原始碼
- AspectCore和MSDI 實現Name註冊以及解析物件物件
- Mybatis原始碼分析(二)XML的解析和Annotation的支援MyBatis原始碼XML
- golang的型別轉換Golang型別