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

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

请添加图片描述

图比较大:如果看着比较糊的话,可以下载高清图: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 中发生的。

相关文章:

  • Linux中的vim最小集、指令集及其配置
  • 【胖虎的逆向之路】02——Android整体加壳原理详解实现
  • 【学Vue就跟玩一样】组件-非单文件组件的使用
  • 数据结构进阶 AVL树
  • 正确的清理内存方式,才能让你的空间更加充裕
  • 关于sql注入这一篇就够了(适合入门)
  • 【Linux学习】进程控制
  • Springboot中如何优雅的写好controller层代码
  • Elasticsearch:Go 客户端简介 - 8.x
  • Vue--》详解状态管理工具——Vuex
  • 基于Android的物业管理app
  • C++STL——list类与模拟实现
  • 基于java springboot+mybatis学生学科竞赛管理管理系统设计和实现
  • 分布式理论协议与算法 第三弹 BASE理论
  • Ubuntu18.04下安装编译文件压缩相关的zlib和quazip库文件
  • AHK 中 = 和 == 等比较运算符的用法
  • canvas 高仿 Apple Watch 表盘
  • Computed property XXX was assigned to but it has no setter
  • github从入门到放弃(1)
  • idea + plantuml 画流程图
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 初识MongoDB分片
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 漂亮刷新控件-iOS
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用权重正则化较少模型过拟合
  • 小程序开发中的那些坑
  • 优秀架构师必须掌握的架构思维
  • 在weex里面使用chart图表
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​比特币大跌的 2 个原因
  • ​插件化DPI在商用WIFI中的价值
  • ​学习一下,什么是预包装食品?​
  • "无招胜有招"nbsp;史上最全的互…
  • (2)STM32单片机上位机
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2015)JS ES6 必知的十个 特性
  • (二)fiber的基本认识
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (三)Honghu Cloud云架构一定时调度平台
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)关于pipe()的详细解析
  • (转)原始图像数据和PDF中的图像数据
  • .NET CLR Hosting 简介
  • .net Stream篇(六)
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net连接MySQL的方法
  • .NET中GET与SET的用法
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @synthesize和@dynamic分别有什么作用?
  • [ C++ ] 继承