当前位置: 首页 > news >正文

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.lryc.cn/news/259643.html

相关文章:

  • docker-compose 单机容器编排
  • springboot项目使用Layui作为前端UI的一系列前后端交互的解决方法
  • 【Linux】Firewalld防火墙新增端口、开启、查看等
  • 学习笔记 -- TVS管选型参考
  • 功能更新|免费敏捷工具Leangoo领歌私有部署新增第三方身份认证和API对接
  • 重生奇迹mu战士加点
  • 【数据结构(十一·多路查找树)】B树、B+树、B*树(6)
  • 弟弟的作业
  • 代码随想录算法训练营第37天|● 738.单调递增的数字 ● 968.监控二叉树 ● 总结
  • 出现 java: 找不到符号 符号: 变量 log 的解决方法
  • 大数据机器学习与深度学习—— 生成对抗网络(GAN)
  • vue前端访问Django channels WebSocket失败
  • 厉害了!水浸监控技术有升级啦
  • 【开题报告】基于SpringBoot的大学生心理教育平台的设计与实现
  • 376. 摆动序列
  • 现在个人想上架微信小游戏已经这么难了吗...
  • C语言数据结构-----二叉树(2)堆的深入理解及应用、链式二叉树的讲解及代码实现
  • 【算法】【动规】等差数列划分
  • 系统架构设计师教程(五)软件工程基础知识
  • 计算机中的文件管理
  • Linux常见排错思路及命令
  • 【springboot】【easyexcel】excel文件读取
  • 【STM32】ADC模数转换器
  • Git篇---第九篇
  • Paper Reading: (ACRST) 基于自适应类再平衡自训练的半监督目标检测
  • 2023年贺岁电影:一眼多,二眼好多
  • 软件测试面试中基础与功能的问题
  • map|二分查找|离线查询|LeetCode:2736最大和查询
  • 你知道Java中的BigInteger类和BigDecimal类吗?
  • 33.搜索旋转排序数组