MyBatis 四大核心组件之 ResultSetHandler 源码解析

news2024/11/27 20:40:26

🚀 作者主页: 有来技术
🔥 开源项目: 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.coloradmin.cn/o/1300572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】 通过宝塔面板重置SSH密码,无需原密码

目录 应用场景&#xff1a; 步骤一&#xff1a;登录面板 步骤二&#xff1a;安装linux工具箱 步骤三&#xff1a;点击设置 步骤总结&#xff1a; 应用场景&#xff1a; 忘记ssh密码&#xff08;前提要有宝塔的账号密码&#xff09;修改重置ssh密码 步骤一&#xff1a;登录…

LVGL | Demo实例使用说明

LVGL | Demo实例使用说明 时间&#xff1a;2023年12月10日21:51:17 文章目录 LVGL | Demo实例使用说明Demos for LVGLAdd the examples to your projectsDemosWidgetsMusic playerKeypad and encoderBenchmarkStress Contributing Demos for LVGL Add the examples to your p…

【工具】JS脚本|浏览器脚本6分钟极速入门 · 开发一个限制自己刷b站的脚本

这张图花里胡哨的是让AI生成的&#xff0c;我觉得怪可爱的&#xff0c;就直接作为封面了。 这篇文章中会开发一个JS脚本&#xff0c;这是一个用来限制b站网页版功能的脚本&#xff0c;避免刷b站的时间过长。功能如下&#xff1a; 除了搜索、视频页、私信页之外的任何页都会被重…

RabbitMQ学习笔记10 综合实战 实现新商家规定时间内上架商品检查

配置文件&#xff1a; 记住添加这个。 加上这段代码&#xff0c;可以自动创建队列和交换机以及绑定关系。 我们看到了我们创建的死信交换机和普通队列。 我们可以看到我们队列下面绑定的交换机。 我们创建一个controller包进行测试: 启动&#xff1a; 过一段时间会变成死信队列…

Multisim电路仿真软件使用教程

安装直接参考这篇文章&#xff1a;Multisim 14.0安装教程 软件管家公众号里有很多软件&#xff0c;需要的可以去找下然后安装&#xff0c;这里用的是14.0版本。 这里有个大神的详细教程&#xff0c;可以参考&#xff1a; Multisim软件使用详细入门教程&#xff08;图文全解&…

mybatis数据输出-map类型输出

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;create table emp (empNo varchar(40) null,empName varchar(100) null,sal int null,deptno varchar(10) null ); 2、pom.xml <dependencies><dependency><groupId>org…

原来JMeter 分布式执行原理这么简单,为什么没有早点看到呢!

在使用 JMeter 进行性能测试时&#xff0c;如果并发数比较大&#xff08;比如项目需要支持 10000 并发&#xff09;&#xff0c;单台电脑&#xff08;CPU 和内存&#xff09;可能无法支持&#xff0c; 这时可以使用 JMeter 提供的分布式测试的功能&#xff0c;使用多台测试机一…

Python实现FA萤火虫优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

6.题目:编号2490 小蓝的括号串1

题目: ### 这道题主要考察stack #include<bits/stdc.h> using namespace std; const int N105; stack<char> stk; char s[N]; int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n;cin>>n;cin>>s1;bool anstrue;for(int i1;i<n;i){…

【PWN】学习笔记(二)【栈溢出基础】

课程教学 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 C语言函数调用栈 一个栈帧保存的是一个函数的状态信息&…

java--Date、SimpleDateFormat时间类,JDK8之前的

1.Date 代表的是日期和时间 2.SimpleDateFormat 代表简单日期格式化&#xff0c;可以用来把日期对象、时间毫秒值格式化成我们想要的形式。 3.时间格式常见符号 4.SimpleDateFormat解析字符串时间成为日期对象

专业mac投屏软件AirServer v7.2.7 mac中文版

专业mac投屏软件AirServer v7.2.7 mac中文版是一款好用的投屏工具&#xff0c;它可以将您的Mac变成通用镜像接收器&#xff0c;允许您使用内置的AirPlay或基于Google Cast的屏幕投影功能镜像设备的显示器。您可以通过任何AirPlay或Google Cast兼容设备镜像或投射屏幕&#xff0…

C语言精选——选择题Day42

第一题 1. 下面程序输出的结果是&#xff08;&#xff09; #include <stdio.h> int main () {int x;x printf("I See, Sea in C");printf("x%d" , x); } A&#xff1a;2 B&#xff1a;随机值 C&#xff1a;都不是 D&#xff1a;15 答案及解析 D p…

LabVIEW开发新型电化学性能测试设备

LabVIEW开发新型电化学性能测试设备 开发了一种基于Arduino和LabVIEW的新型电化学性能测试装置&#xff0c;专门用于实验电池&#xff0c;特别是在锂硫&#xff08;Li-S&#xff09;技术领域的评估。这种装置结合了简单、灵活的硬件和软件工具&#xff0c;使新科学家能够设计针…

DiffiT

本文首发于AIWalker&#xff0c;欢迎关注。 https://arxiv.org/abs/2312.02139 https://github.com/NVlabs/DiffiT 扩散模型以其强大的表达能力和高样本质量在许多领域得到了新的应用。对于样本生成&#xff0c;这些模型依赖于通过迭代去噪生成图像的去噪神经网络。然而&#x…

每天五分钟计算机视觉:使用1*1卷积层来改变输入层的通道数量

本文重点 在卷积神经网络中有很多重要的卷积核&#xff0c;比如1*1的卷积核&#xff0c;3*3的卷积核&#xff0c;本文将讲解1*1的卷积核的使用&#xff0c;它在卷积神经网络中具有重要的地位。由于1*1的卷积核使用了最小的窗口&#xff0c;那么1*1的卷积核就失去了卷积层可以识…

Redis 持久化 —— 超详细操作演示!

四、Redis 持久化 四、Redis 持久化4.1 持久化基本原理4.2 RDB持久化4.3 AOF持久化4.4 RDB与AOF对比4.5 持久化技术转型 五、Redis 主从集群六、Redis 分布式系统七、Redis 缓存八、Lua脚本详解九、分布式锁 数据库系列文章&#xff1a; 关系型数据库: MySQL —— 基础语法大全…

leetcode 100.相同的树

涉及到递归&#xff0c;最好多画图理解&#xff0c;希望对你们有帮助 100.相同的树 题目 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 题目链接…

2023-12-05 Qt学习总结6

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言十八 QMessageBox消息对话框十九 Qt布局管理总结 前言 要解决问题: 学习qt最核心知识, 多一个都不学. 十八 QMessageBox消息对话框 QMessageBox消息对话框是Qt中的一个提供用户交互界面的对话框窗口。 它通常…

perl处理base64、md5、SHA-1、SHA-256的计算

使用perl可以进行base64、md5、SHA-1、SHA-256的计算&#xff0c;使用也非常方便&#xff0c;下面是示例代码&#xff1a; #! /usr/bin/perl use v5.14; use MIME::Base64; use Digest;my $test_str hello world;# 测试base64 say encode_base64($test_str);# 测试md5 my $md…