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 🌺

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/235306.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数学建模】《实战数学建模:例题与讲解》第八讲-回归分析(含Matlab代码)

【数学建模】《实战数学建模&#xff1a;例题与讲解》第八讲-回归分析&#xff08;含Matlab代码&#xff09; 回归分析基本概念经典多元线性回归&#xff08;MLR&#xff09;主成分回归&#xff08;PCR&#xff09;偏最小二乘回归&#xff08;PLS&#xff09;建模过程应用和优势…

1688跨境寻源通计划后,都有哪些接口值得我们关注

1688跨境是什么? 最近火出圈的一个新词 今天我带大家走近1688跨境 首先为什么会出现1688跨境&#xff1f; 因为&#xff1a; 新型服务商崛起&#xff0c;反向海淘成趋势 在过去三年&#xff0c;1688涌现了一批新型的服务商: 他们帮助海外B类买家到1688采购&#xff0c…

宝宝洗衣机好吗?婴儿专用洗衣机推荐

我们都知道刚出生的宝宝抵抗力非常弱&#xff0c;接触宝宝的东西&#xff0c;我们要更加重视&#xff0c;而且宝宝的衣服是接触最多的&#xff0c;如果清洗不干净很容易造成细菌感染&#xff0c;所以对于宝妈来说有一款小型可以自动杀菌的洗衣机真的非常重要但现在市面上婴儿洗…

企业如何选择MES系统?

一、技术架构 虽然绝大多数的用户不会关心MES设计的技术架构&#xff0c;但如果是好的MES系统&#xff0c;需首先必须具备先进的技术支撑&#xff0c;只有先进的开发平台配合上可配置的模块模组&#xff0c;才可快速构建出符合不同用户场景的业务功能。 试想一下&#xff1a;在…

基于Springboot+Vue前后端分离的电影推荐系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

17、类模板

17、类模板 类模板类模板的声明类模板的使用类模板的静态成员类模板的递归实例化 类模板扩展数值型的模板参数模板型成员变量模板型成员函数模板型成员类型模板型模板参数 典型模板错误嵌套依赖依赖模板参数访问成员函数模板子类模板访问基类模板类模板中的成员虚函数 类模板 …

Jquery easyui异步提交表单的两种方式

这篇文章分享一下easyui常用的两种表单异步提交的方式。 目录 开始前的准备工作 方式一&#xff1a;利用jquery ajax提交 $.post() $.ajax() 方式二&#xff1a;使用easyui提供的表单提交方式 开始前的准备工作 1、使用HBuilderX创建一个简单的html项目&#xff0c;删除i…

ppt编辑密码如何设置?

大家在PPT中设置了限制编辑&#xff0c;发现后面任然可以编辑文件。那么如何将PPT文件设置成禁止修改模式呢&#xff1f;今天分享几个方法给大家。 方法一 将PPT文件直接保存或者另存为一份文件&#xff0c;在保存时&#xff0c;将文件格式选择为PowerPoint图片演示文稿 方法…

精通TypeScript:打造一个炫酷的天气预报插件

前言 ​ 随着数字化和信息化的发展&#xff0c;数据大屏使用越来越广泛&#xff0c;我们不仅需要展示数据&#xff0c;更需要以一种更加美观的方式展示数据。这就必然需要使用到各种图表组件&#xff0c;比如柱状图、饼图、折线图等等。但是有一些效果不太适合通过这种常规图表…

Python中的类与对象

✨前言✨ &#x1f4d8; 博客主页&#xff1a;to Keep博客主页 &#x1f646;欢迎关注&#xff0c;&#x1f44d;点赞&#xff0c;&#x1f4dd;留言评论 ⏳首发时间&#xff1a;2023年12月11日 &#x1f4e8; 博主码云地址&#xff1a;博主码云地址 &#x1f4d5;参考书籍&…

mapstruct个人学习记录

mapstruct核心技术学习 简介入门案例maven依赖 IDEA插件单一对象转换测试结果 mapping属性Spring注入的方式测试 集合的映射set类型的映射测试map类型的映射测试 MapMappingkeyDateFormatvalueDateFormat 枚举映射基础入门 简介 在工作中&#xff0c;我们经常要进行各种对象之…

Qt简介、C++工程文件分离、创建Qt工程、Qt的帮助文档

QT 简介 core&#xff1a;核心模块&#xff0c;非图形的接口类&#xff0c;为其它模块提供支持 gui&#xff1a;图形用户接口&#xff0c;qt5之前 widgets&#xff1a;图形界面相关的类模块 qt5之后的 database&#xff1a;数据库模块 network&#xff1a;网络模块 QT 特性 开…

Android : Xui- RecyclerView+BannerLayout 轮播图简单应用

实例图&#xff1a; 1.引用XUI http://t.csdnimg.cn/Wb4KR 2.创建显示图片布局 banner_item.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"…

【线程池】的原理分析及源码(C语言版)

线程池的原理分析及源码&#xff08;C语言版&#xff09; centos8 连接失败 线程已满_张三和你一聊聊线程池 线程池 线程池是一种用于管理和复用线程的机制&#xff0c;通过线程池可以减少线程的创建和销毁次数&#xff0c;提高程序的性能和效率。线程池通常包含一个线程…

【第三届】:“玄铁杯”RISC-V应用创新大赛(基于yolov5和OpenCv算法 — 智能警戒哨兵)

文章目录 前言 一、智能警戒哨兵是什么&#xff1f; 二、方案流程图 三、硬件方案 四、软件方案 五、演示视频链接 总结 前言 最近参加了第三届“玄铁杯”RISC-V应用创新大赛&#xff0c;我的创意题目是基于 yolov5和OpenCv算法 — 智能警戒哨兵 先介绍一下比赛&#xf…

Spring日志完结篇,MyBatis操作数据库(入门)

目录 Spring可以对日志进行分目录打印 日志持久化&#xff08;让日志进行长期的保存&#xff09; MyBatis操作数据库(优秀的持久层框架) MyBatis的写法 开发规范&#xff1a; 单元测试的写法 传递参数 Spring可以对日志进行分目录打印 他的意思是说spring相关只打印INFO…

Android画布Canvas绘图scale,Kotlin

Android画布Canvas绘图scale&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.…

vuepress-----22、其他评论方案

vuepress 支持评论 本文讲述 vuepress 站点如何集成评论系统&#xff0c;选型是 valineleancloud, 支持匿名评论&#xff0c;缺点是数据没有存储在自己手里。市面上也有其他的方案, 如 gitalk,vssue 等, 但需要用户登录 github 才能发表评论, 但 github 经常无法连接,导致体验…

java实现网络聊天

网络聊天实现步骤&#xff08;从功能谈论方法&#xff09;&#xff1a; 客户端&#xff1a; 1.登录面板&#xff1a;注册提醒用户注册格式&#xff0c;登录账号密码不为空&#xff0c;点击登录的时候需要连接服务器端&#xff0c;启动聊天面板。&#xff08;监听用户点击登录…

logback的使用

1 logback概述 SLF4J的日志实现组件关系图如下所示。 SLF4J&#xff0c;即Java中的简单日志门面&#xff08;Simple Logging Facade for Java&#xff09;&#xff0c;它为各种日志框架提供简单的抽象接口。 SLF4J最常用的日志实现框架是&#xff1a;log4j、logback。一般有s…