MyBatis 四大核心組件之 ResultSetHandler 源碼解析

🚀 作者主頁: 有來技術
🔥 開源項目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot
🌺 倉庫主頁: Gitee 💫 Github 💫 GitCode
💖 歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請糾正!


目錄

  • 前言
  • ResultSetHandler 簡介與作用
  • ResultSetHandler 接口
  • DefaultResultSetHandler 類
    • handleResultSets
    • handleResultSet
    • handleRowValues
  • 結語
  • 開源項目

前言

MyBatis 是一款廣受歡迎的 Java 持久層框架,其中的四大核心組件之一是 ResultSetHandler。ResultSetHandler 負責處理 JDBC 查詢返回的 ResultSet,并將結果映射成 Java 對象。本文將深入解析 ResultSetHandler 的源碼,探討其實現原理、核心方法,以及在 MyBatis 中的作用。

ResultSetHandler 簡介與作用

在 MyBatis 中,ResultSetHandler 起到了重要的橋梁作用。當我們執行查詢操作時,JDBC 會返回一個 ResultSet 對象,而 ResultSetHandler 就負責將這個 ResultSet 轉化為 Java 對象。具體而言,ResultSetHandler 的作用包括:

  1. 結果集映射: 將 ResultSet 中的數據映射到 Java 對象上,形成查詢結果。
  2. 多結果集處理: 處理存儲過程等情況下的多結果集返回。
  3. 懶加載處理: 處理延遲加載,將查詢結果中的延遲加載的部分進行懶加載。

ResultSetHandler 接口

在這里插入圖片描述

ResultSetHandler 是 MyBatis 中的一個接口,定義了處理結果集的方法。核心方法包括:

  • handleResultSets(Statement stmt): 處理包含多個 ResultSet 的情況,返回一個包含映射結果的 List。
  • handleOutputParameters(CallableStatement cs): 處理存儲過程等情況下的輸出參數。
  • handleResultSets(Statement stmt, int resultSetType): 處理指定 ResultSet 類型的情況。
  • handleCursorResultSets(Statement stmt): 處理存儲過程等情況下的游標結果集。

DefaultResultSetHandler 類

DefaultResultSetHandler 是 ResultSetHandler 接口的默認實現類,負責處理結果集映射的具體邏輯。以下是 DefaultResultSetHandler 中的核心方法:

handleResultSets

該方法負責處理多個 ResultSet 的情況,將每個 ResultSet 映射成 Java 對象,并最終返回映射結果的列表。

@Override
public List<Object> handleResultSets(Statement stmt) throws SQLException {ErrorContext.instance().activity("handling results").object(mappedStatement.getId());// 處理多個 ResultSet 的情況List<Object> multipleResults = new ArrayList<>();int resultSetCount = 0;ResultSetWrapper rsw = getFirstResultSet(stmt);// 遍歷結果集while (rsw != null && !rsw.isClosed() && rsw.getResultSet().getStatement().getMoreResults()) {handleResultSet(rsw, multipleResults, resultSetCount);rsw = getNextResultSet(stmt);cleanUpAfterHandlingResultSet();resultSetCount++;}// 處理多結果集時的映射邏輯return collapseSingleResultList(multipleResults);
}

handleResultSet

該方法用于處理單個 ResultSet 的映射邏輯,包括處理簡單的映射關系和嵌套結果集。在處理單個 ResultSet 時,調用 handleRowValues 方法進行映射。

private void handleResultSet(ResultSetWrapper rsw, List<Object> multipleResults, int resultSetCount) throws SQLException {List<ResultMap> resultMaps = mappedStatement.getResultMaps();ResultMap resultMap = resultMaps.get(resultSetCount);// 處理單個 ResultSet 的映射邏輯handleRowValues(rsw, resultMap, multipleResults, null);// 處理嵌套結果集if (resultMap.hasNestedResultMaps()) {handleRowValuesForNestedResultMap(rsw, resultMap, multipleResults, null);}
}

handleRowValues

該方法用于處理單行記錄的映射關系,根據是否存在嵌套結果集分別調用 handleRowValuesForSimpleResultMap 或 handleRowValuesForNestedResultMap 方法。

private void handleRowValues(ResultSetWrapper rsw, ResultMap resultMap, List<Object> multipleResults, ResultMapping parentMapping) throws SQLException {if (resultMap.hasNestedResultMaps()) {ensureNoRowWithNestedResultMap(rsw, resultMap);} else {// 處理簡單的映射關系handleRowValuesForSimpleResultMap(rsw, resultMap, multipleResults, parentMapping);}
}

結語

通過深度解析 ResultSetHandler 的源碼,我們更清晰地了解了其在 MyBatis 中的核心作用。ResultSetHandler 不僅完成了結果集到 Java 對象的映射,還處理了多結果集、嵌套結果集等復雜場景。熟悉 ResultSetHandler 的源碼實現,有助于我們更好地理解 MyBatis 的內部機制,提高對查詢操作的靈活應用。

開源項目

  • SpringCloud + Vue3 微服務商城
GithubGitee
后端youlai-mall 🍃youlai-mall 🍃
前端mall-admin🌺mall-admin 🌺
移動端mall-app 🍌mall-app 🍌
  • SpringBoot 3+ Vue3 單體權限管理系統
GithubGitee
后端youlai-boot 🍃youlai-boot 🍃
前端vue3-element-admin 🌺vue3-element-admin 🌺

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212707.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212707.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212707.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MyBatis動態SQL(Dynamic SQL)

Mybatis框架的動態SQL技術是一種根據特定條件動態拼裝SQL語句的功能&#xff0c;它存在的意義是為了解決拼接SQL語句字符串時的痛點問題。 實際開發中可以通過以下幾種標簽進行動態SQL拼接。 1 if標簽 根據test屬性所對應的表達式計算結果決定標簽中的內容是否拼接到sql中。 …

基于SpringBoot+JSP+Mysql寵物領養網站+協同過濾算法推薦寵物(Java畢業設計)

大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

《C++新經典設計模式》之第15章 適配器模式

《C新經典設計模式》之第15章 適配器模式 適配器模式.cpp 適配器模式.cpp #include <iostream> #include <vector> #include <string> #include <fstream> #include <memory> using namespace std;// 解決兩個類之間的兼容性問題 // 轉換接口調…

ffmpeg6.0之ffprobe.c源碼分析二-核心功能源碼分析

本篇我們繼續分析: 1、ffprobe -show_packets 參數的處理流程;2、ffprobe -show_frames 參數的處理流程;3、ffprobe -show_streams 參數的處理流程;4、ffprobe -show_format 參數的處理流程; 因為前面的文章已經回顧了這些命令的使用,以及作用。本文就不在贅述,以免篇幅…

《妙趣橫生的算法》(C語言實現)- 第5章 數學趣題(一)

《妙趣橫生的算法》&#xff08;C語言實現&#xff09;-第5章 數學趣題&#xff08;一&#xff09; 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 例如&#xff1a;第一章 Python 機器學習入門之pandas的使用 提示&#xff1a;寫完文…

“新華三杯”第十屆成都信息工程大學ACM程序設計競賽(同步賽)L. 怎么走啊(最短路+二分 分段函數)

題目 登錄—專業IT筆試面試備考平臺_牛客網 思路來源 衡陽師范學院ac代碼、pj學弟 題解 大致可以證明&#xff0c;在w從1e5減小到1的過程中&#xff0c; 之前某條反向邊沒有用到&#xff0c;現在需要用到反向邊&#xff0c;也就是正向邊用到的變少了 這樣的變化有sqrt個&a…

分層網絡模型(OSI、TCP/IP)及對應的網絡協議

OSI七層網絡模型 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即開放式系統互連參考模型&#xff0c; 一般都叫OSI參考模型&#xff0c;是ISO組織于1985年研究的網絡互連模型。OSI是分層的體系結構&#xff0c;每一層是一個模塊&#xff0c;用于完成某種功…

服務器GPU占用,kill -9 PID 用不了,解決辦法

PID&#xff08;progress ID 進程ID&#xff09; 上圖為占用情況&#xff0c;使用下面的指令都不管用 kill -9 PID kill -15 PID # 加入sudo 還是不行 # 等等網上的 chatgpt 提供的其他辦法&#xff0c;一圈試了下來還是不管用最后解決辦法 首先用下面的指令查看進程的樹結構…

【Hexo】自動在中英文之間添加空格

本文首發于 ??慕雪的寒舍 如題&#xff0c;中英文添加空格是比較規范的寫法&#xff0c; 但是我個人實在是懶&#xff0c;每次都要這么弄太累了。想找找hexo有沒有對應的插件&#xff0c;還是有的 npm install hexo-filter-auto-spacing --save安裝了之后&#xff0c;在hexo的…

〖大前端 - 基礎入門三大核心之JS篇?〗- 面向對象之對象的方法、遍歷、深淺克隆

說明&#xff1a;該文屬于 大前端全棧架構白寶書專欄&#xff0c;目前階段免費&#xff0c;如需要項目實戰或者是體系化資源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩編程&#xff0c;十余年工作經驗, 從事過全棧研發、產品經理等工作&#xff0c;目前在公司…

iOS使用CoreText完成txt閱讀器

CoreText是一個高效處理字符和字形轉換和進行文字排版的框架&#xff0c;API基于C語言。 常見的CoreText類介紹 &#xff08;1&#xff09;、CFAttributedStringRef 屬性字符串&#xff0c;用于存儲需要繪制的文字字符和字符屬性 &#xff08;2&#xff09;、CTFramesetterR…

【原創】錄剪視頻的折騰之路

制作視頻的起因 本人為IT男&#xff0c;IT發展快&#xff0c;需要學習的東西又多。往往為了一個技術小問題&#xff0c;花好幾天時間學習&#xff0c;接下來十來分鐘把事情做完。下次遇到這個同樣的問題的時候&#xff0c;可能是幾個月后&#xff0c;甚至是幾年以后了。這些技…

微信小程序頁面跳轉方法

文章目錄 前言方式一&#xff1a;wx.navigateTo方式二&#xff1a;wx.redirectTo方式三&#xff1a;wx.reLaunch方式四&#xff1a;wx.switchTab方式五&#xff1a;wxml中navigator標簽跳轉頁面回退 前言 微信小程序頁面跳轉的各種方法總結&#xff0c;備查。 方式一&#xff…

汽車連接器

汽車連接器 電子元器件百科 文章目錄 汽車連接器前言一、汽車連接器是什么二、汽車連接器的類別三、汽車連接器的應用實例四、汽車連接器的作用原理總結前言 汽車連接器通常需要具備防水、防塵、耐高溫等特性,以適應汽車惡劣的工作環境。它們的設計和連接方式也各不相同,以適…

JVM 內存分析工具 Memory Analyzer Tool(MAT)的深度講解

目錄 一. 前言 二. MAT 使用場景及主要解決問題 三. MAT 基礎概念 3.1. Heap Dump 3.2. Shallow Heap 3.3. Retained Set 3.4. Retained Heap 3.5. Dominator Tree 3.6. OQL 3.7. references 四. MAT 功能概述 4.1. 內存分布 4.2. 對象間依賴 4.3. 對象狀態 4.4…

鴻蒙前端開發-構建第一個ArkTS應用(Stage模型)

創建ArkTS工程 若首次打開DevEco Studio&#xff0c;請點擊Create Project創建工程。如果已經打開了一個工程&#xff0c;請在菜單欄選擇File > New > Create Project來創建一個新工程。 選擇Application應用開發&#xff08;本文以應用開發為例&#xff0c;Atomic Serv…

docker-compose安裝教程

1.確認docker-compose是否安裝 docker-compose -v如上圖所示表示未安裝&#xff0c;需要安裝。 如上圖所示表示已經安裝&#xff0c;不需要再安裝&#xff0c;如果覺得版本低想升級&#xff0c;也可以繼續安裝。 2.離線安裝 下載docker-compose安裝包&#xff0c;上傳到服務…

uniapp小程序分享為灰色

引用&#xff1a;https://www.cnblogs.com/panwudi/p/17074172.html uniapp開發的微信小程序&#xff0c;沒有轉發&#xff0c;分享&#xff1a; 創建一個mixin:common/share.js export default {onShareAppMessage(res) { //發送給朋友return {}},onShareTimeline(res) {//…

人工智能原理復習--機器學習

文章目錄 上一篇機器學習概述歸納(示例)學習ID3決策樹算法K近鄰算法下一篇 上一篇 人工智能原理復習–搜索策略&#xff08;二&#xff09; 機器學習概述 學習系統的基本結構&#xff1a; #mermaid-svg-JMjIZHjVOirLolvu {font-family:"trebuchet ms",verdana,ari…

辨析旅行商問題(TSP)與車輛路徑問題(VRP)

目錄 前言旅行商問題 (TSP)問題介紹數學模型符號定義問題輸入約束條件目標函數問題輸出 解的空間解空間大小計算解釋 車輛路徑問題 (VRP)問題介紹TSP到VRP的過渡數學模型符號定義問題輸入約束條件優化目標問題輸出 解空間特殊情況一般情況 TSP 與 VRP 對比 前言 計劃是通過本文…