上一次分析了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(九):MyBatis型別處理器(TypeHandler)詳解MyBatis型別
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- myBatis原始碼解析-型別轉換篇(5)MyBatis原始碼型別
- long查詢結果轉換為varchar2型別型別
- 【Mybatis系列】從原始碼角度理解Mybatis的資料轉換器TypeHandlerMyBatis原始碼
- mybatis原始碼解析(四)--- MapperStatement的註冊MyBatis原始碼APP
- Mybatis底層原理學習(三):查詢結果集的處理原理MyBatis
- MyBatis(三) mybatis-config.xml元素說明、型別處理器typeHandler的使用MyBatisXML型別
- 動態sql查詢結果多行的處理情況SQL
- Mybatis模糊查詢結果為空MyBatis
- 2.3、mybatis原始碼分析-基礎模組之型別轉換MyBatis原始碼型別
- Mybatis 查詢語句結果集總結MyBatis
- PostgreSQL 原始碼解讀(202)- 查詢#115(型別轉換)SQL原始碼型別
- java基本型別和物件之間的轉換Java型別物件
- PostgreSQL 原始碼解讀(203)- 查詢#116(型別轉換實現)SQL原始碼型別
- SpringMVC(二)處理器方法繫結形參(簡單型別和註解@RequestParam,pojo型別)、自定義型別轉換器、springMVC亂碼解決SpringMVC型別POJO
- 在HQL select查詢語句中自定義查詢結果返回的資料型別資料型別
- MyBatis Like查詢處理%_符號MyBatis符號
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現(五)之過期原始碼
- 查詢構造器結果--物件陣列互轉方法物件陣列
- Mybatis TypeHandler 的使用MyBatis
- Mybatis原始碼之美:3.4.解析處理parameterMap元素MyBatis原始碼
- MySQL探祕(五):InnoDB鎖的型別和狀態查詢MySql型別
- Oracle查詢轉換(五)子查詢展開Oracle
- Qt元物件系統自帶型別與註冊型別的判斷QT物件型別
- 物件點查詢和中括號查詢的區別物件
- Picasso原始碼分析(六):BitmapHunter與請求結果的處理原始碼
- [Python影象處理] 五.影象融合、加法運算及影象型別轉換Python型別
- 處理物件的多種狀態及其相互轉換——狀態模式(五)物件模式
- C++中的向上型別轉換和向下型別轉換C++型別
- js為物件註冊多個事件處理函式程式碼JS物件事件函式
- JN專案-型別轉換異常處理型別
- PLSQL Language Referenc-PL/SQL靜態SQL-帶有子查詢的查詢結果集處理SQL
- 從規範的角度解析物件 — 原始值轉換物件
- SQL語句替換查詢結果的的寫法舉例SQL
- Mybatis實踐(一)型別轉換器MyBatis型別
- Netty原始碼分析--Channel註冊(上)(五)Netty原始碼
- 巧用臨時表將大結果集轉換為小結果集驅動查詢薦