一图读懂mybatis 查询接口的源码流程

news2024/11/28 1:43:35

请添加图片描述

图比较大:如果看着比较糊的话,可以下载高清图:https://download.csdn.net/download/langwuzhe/87376216

第一步:创建 StatementHandler、ParameterHandler、ResultSetHandler-----------(三剑客的新生)

  1. 创建 StatementHandler 对象
    • 具体创建的实现类是 PreparedStatementHandler ,而且被 RoutingStatementHandler包裹,便于识别具体的 StatementHandler对象。
  2. 在创建 StatementHandler 对象时,会同时super()父类 BaseStatementHandler 的构造器。BaseStatementHandler构造器会把 ParameterHandlerResultSetHandler 都创建出来
    • ParameterHandlerResultSetHandler 这两个Handler 是在StatementHandler的实现类中创建出来的,所以当要调用 这两个Handler 的方法时需要去 StatementHandler 的实现中寻找这两个Hander 的引用。所以就会看见上图中 设置参数 和 整理数据库返回数据时依然会看见需要经过 StatementHandler的实现类PrepareStatementHandler

第二步:执行 connection.prepareStatement,返回 statement 对象---------(StatementHandler)

  1. 经过一系列流转,具体是在 StatementHandler 的实现类中执行的 connection.prepareStatement
  2. connection.prepareStatement(sql)时,由于connection 对象被种了动态代理的蛊。所以执行 connection.prepareStatement(sql)时,会先进入 connection的代理对象 ConnectionLogger中执行invoke方法 打印sql日志

第三步:往sql中设置参数。具体值 替换 ? 问号 -------------- (ParameterHandler)

  1. 把第二步的statement对象传出来用来往sql设置参数
  2. 使用具体参数 替换 ? 问号时,是在ParameterHandler的实现类 DefaultParameterHandler进行的

第四步:执行 statement.execute() ------------------------(StatementHandler)

  1. 执行 execute()方法是在 StatementHandler 的实现类 PreparedStatementHandler 中执行的。
  2. 由于 PreparedStatement 对象被种了动态代理的蛊,所以执行 他的execute()方法,会先进入到 PreparedStatement的代理的对象 PreparedStatementLogger打印入参的日志。

第五步:数据库返回数据结果映射。---------------------------(ResultSetHandler)

  1. 结果映射都是在 ResultSetHandler 的实现类 DefaultResultSetHandler 中进行的。

  2. 从 statement中取出 ResultSet 对象会把他放到 ResultSetWrapper 中,ResultSetWrapper是对ResultSet 的补充增强

  3. 在映射的过程中,还会创建 ResultHandler对象,他的实现类是 DefaultResultHandler。这个只是方法返回时携带数据用的,无需过多关注,但是要区分ResultSetHandlerResultHandler 长的很像,容易看花眼。

注:

​ 第一、二、三 步 都是在 Executor 中发生的。第四、五步 是在 StatementHandler 中发生的。

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

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

相关文章

WPS怎么转换PDF?保证你一学就会

相信大家在处理文件的时候肯定会使用到WPS文件,WPS文件包括Word、Excel、PPT文件,是我们经常使用的几种文件,有这几种文件我们可以更好的完成工作,但是在有些情况下,我们需要将WPS转换成PDF文件,这样就会更…

AS弹性伸缩简单介绍

AS 介绍 弹性伸缩(AutoScaling)是一种服务,可以自动调整弹性计算资源(ECS),以满足业务需求的变化。 弹性伸缩仅支持ECS实例或ECI实例数量的增加和减少,但不支持单个ECS实例或ECI实例的配置变更。 应用场景:弹性扩张、…

Windows安装使用Docker,方便你的开发和部署(DockerDesktop篇)

前言 首先声明,此篇不是完全的Docker技术文章,而是单纯的教你使用Docker,不包含Docker的一些命令、如何打包Docker镜像等等。 为什么要用Docker? 大家好,我是小简,今天带来一篇Windosw环境下使用Docker的…

女生学软件测试有什么优势么

在IT技术行业,女生学习软件测试还是有很大优势的。女生相较于男生更有耐心,包容性强,心思细腻,对细节把控更好,同时还能帮助团队男女平衡,活跃气氛。 软件测试是一个只要你肯学习就会有回报的职业&#xf…

判断用户输入的数字是奇数还是偶数

判断用户输入的数字是奇数还是偶数代码关键知识点 条件运算符, 相等运算符,为了让两个不同的数据类型(如number和string)的值可以作比较,必须要把一种类型转换为另一种类型(转换成相同的类型)&…

Ae 效果详解:CC Ball Action

Ae菜单:效果/模拟/CC Ball ActionEffect/Simulation/CC Ball ActionCC Ball Action (滚珠操作效果)可以将所有的像素变成小球模样,并且能够打破图层成球形网格。可通过摄像机观察其所具有的 3D 效果。◆ ◆ ◆效果控件属性说明S…

【数据结构与算法——C语言版】6. 排序算法(4)——快速排序

前言 本文介绍排序算法中的快速排序,快速排序是比较常用的一种排序算法,也是面试中经常会问到的一种排序算法,简称快排,是我们要介绍的第一种时间复杂度为O(nlogn)的排序算法。 核心思想 快速排序(Quick Sort)使用分治法策略&a…

Vue--》详解状态管理工具——Vuex

目录 vuex 搭建vuex环境 vuex的使用 vuex开发者工具使用 getters mapState和mapGetters mapMutations和mapActions 多组件共享数据 vuex实现模块化 vuex 专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管…

c语言进阶(4)——字符函数的详细解析

文章目录1.strlen函数2.strcpy函数3.strcat函数4.strcmp函数5.strncpy函数6.strncat函数7.strncmp函数8.strstr函数9.strtok函数10. strerror函数11. 相关字符转换函数12.字符转换函数1.strlen函数 size_t strlen( const char *string ); 用途:用来计算字符串长度的…

【云原生进阶之容器】第二章Controller Manager原理2.8节--Resync机制

8 Resync机制 8.1 DeltaFIFO队列为什么需要Resync 为什么需要 Resync 机制呢?因为在处理 SharedInformer 事件回调时,可能存在处理失败的情况,定时的 Resync 让这些处理失败的事件有了重新 onUpdate 处理的机会。 主要的目的是为了不丢数据,处理 resync 机制还有边缘触发与…

公务员考试催生一家上市公司,公务员真的是一条好的出路吗

公务员考试能催生一家公司吗?还真的可以,而且在2023.01.09日也就是今天上市。公务员真的是一条好的出路吗,现在考公务员还行不行?这需要结合我们当下的环境来综合分析。我们都经历了疫情,期间各个大厂频频将裁员大棒挥…

《Spring揭秘》读书笔记 1:IoC和AOP

1 Spring框架的由来 Spring框架的本质:提供各种服务,以帮助我们简化基于POJO的Java应用程序开发。 各种服务实现被划分到了多个相互独立却又相互依赖的模块当中: Core核心模块:IoC容器、Framework工具类。 AOP模块:S…

如何抓住风口,利用互联网赚钱?(內含三大商业模式推荐)建议收藏

大家好,我是你们熟悉而又陌生的好朋友梦龙,一个创业期的年轻人 今天跟你做个分享,众所周知互联网是一块非常大的蛋糕,几位互联网巨头也做不到完全吃透,同时也是一个门槛较低的创业之路,非常的适合年轻人&a…

8、Javaweb_ServlethttpRequst

Servlet: 1. 概念 2. 步骤 3. 执行原理 4. 生命周期 5. Servlet3.0 注解配置 6. Servlet的体系结构 Servlet -- 接口 | GenericServlet -- 抽象类 | HttpServlet -- 抽象类 * GenericServlet:将Servlet接口中其他的方…

C语言-指针进阶-常见笔试面试题详解(9.4)

目录 思维导图&#xff1a; 指针和数组笔试题 指针笔试题 写在最后&#xff1a; 思维导图&#xff1a; 指针和数组笔试题 只有多刷题&#xff0c;才能巩固提高所学的知识。 例1&#xff1a; #include <stdio.h>int main() {//一维数组int a[] { 1,2,3,4 };//求出…

「精研科技」× 企企通,全球MIM龙头借助采购供应商数字化向多领域突破

近日&#xff0c;金属粉末注射成型&#xff08;MIM&#xff09;龙头企业江苏精研科技股份有限公司&#xff08;以下简称“精研科技”&#xff09;与企企通达成合作。双方将共同构建完整的采购管理和供应商协同平台&#xff0c;加强供应商管理&#xff0c;提高采购效率&#xff…

Netty源码性能分析 - ThreadLocal PK FastThreadLocal

序 既然jdk已经有ThreadLocal&#xff0c;为何netty还要自己造个FastThreadLocal&#xff1f;FastThreadLocal快在哪里&#xff1f;这需要从jdk ThreadLocal的本身说起。在java线程中&#xff0c;每个线程都有一个ThreadLocalMap实例变量&#xff08;如果不使用ThreadLocal&…

使用Alexnet实现CIFAR100数据集的训练

如果对你有用的话&#xff0c;希望能够点赞支持一下&#xff0c;这样我就能有更多的动力更新更多的学习笔记了。&#x1f604;&#x1f604; 使用Alexnet进行CIFAR-10数据集进行测试&#xff0c;这里使用的是将CIFAR-10数据集的分辨率扩大到224X224&#xff0c;因为在测试…

【ROS】—— ROS常用组件_TF坐标变换_多态坐标变换与TF坐标变换实操(十一)

文章目录前言1. 多态坐标变换1.1 发布方1.2 订阅方(C)1.3 订阅方(python)2. 坐标系关系查看3. TF坐标变换实操(C)3.1准备3.2 生成新的乌龟3.3 增加键盘控制3.4 发布方(发布两只乌龟的坐标信息)3.5 订阅方(解析坐标信息并生成速度信息)前言 &#x1f4e2;本系列将依托赵虚左老师…

将git仓库瘦身

一个小工具的仓库居然有7个g了&#xff0c;每次clone都要等好久&#xff0c;在网上找的方法&#xff0c;实际了几个小时才成功瘦身&#xff0c;做一次记录 一、排查是哪些历史文件占用了内存&#xff0c;下面是查询最大的5个文件 git rev-list --objects --all | grep "$(…