找个软柿子捏,先把 mybatis 的源码给分析了;

资料收集

官方文档
https://mybatis.org/mybatis-3/zh/index.html

聊聊MyBatis缓存机制-美团技术团队
https://tech.meituan.com/2018/01/19/mybatis-cache.html

MyBatis 配置 setting 详解 https://blog.csdn.net/fageweiketang/article/details/80767532

Mybatis中强大的resultMap
https://juejin.cn/post/6844903858477481992

  • 1:1 关联查询
  • 1:m 列表查询
  • 自动填充关联对象 通过 “.”

从源码角度分析 Mybatis 工作原理
https://mp.weixin.qq.com/s/Y8xf6D8SjNP28BOFOBW5tA

MyBatis 分页插件 PageHelper
https://pagehelper.github.io/
mybatis-plus
https://mp.baomidou.com/


学习路线参考这篇:
https://www.bilibili.com/read/cv7933087
下面是文章的精华提取:

在MyBatis 3.5.1这个版中有
968个类、
2770个字段、
8422个方法、
42504行代码、
186428个指令码。
其源码体量只有Spring 的1/5,也是Hibernate的1/5。
但在功能上这三个框架并无高低之分,但从源码轻量级来讲,MyBatis无疑是最成功的。
Mybatis 源码分析 - 图1

整体架构:

image.png

接口层:

指用于操作数据库的增删改查接口,如SqlSession以及用户自定义的Mapper接口,都属于接口层组件。通常我们对MyBatis源码学习是从接口层开始的,但这并不是一个好方法,至于原因会在学习路径中讲到。

数据处理层:

SQL执行流程实现,内容包括动态SQL语句构建、参数映射处理、结果映射集处理。他是整个MyBatis源码的核心,也是我们学习的重点和难点。

扩展支撑层:

指对主流程功能上的扩展与支撑。
扩展:对主流程,在易用性、性能上进行扩展。如SqlSession与Mappr接口就是易用性扩展。缓存与懒加载则是执行性能的扩展。
支撑:主程所依赖的工具,如数据源、反射工具、日志管理、配置构建器、脚本执行器等。

学习重点: 数据处理层

执行流程:体现 SQL 执行过程中的每个步骤
映射配置:SQL 执行前后的动态 sql 解析,参数映射,结果集映射

一个完整SQL执行流程,至少包含以下节点:
执行器:处理一至多个SQL、以及缓存、事务、批处理等。
Sql处理器 :用于声明Statement、参数设置、执行、以及结果集处理。
参数处理器:基于映射进行具体的参数赋值处理。
结果集处理器:基于映射进行具体的结果集处理。

MyBatis源码中映射配置特指以下三件事情:
动态SQL:基于配置的脚本,以及参数生成Sql字符串。
参数映射:转换JAVA参数,并设置成SQL参数
结果集映射解析:指定数据结果集,转换成JAVA对象。有1对1转换、1对多转换,还包括映射循环依赖等解决方案。

学习路径如下:
执行流程 -> 映射配置 -> 扩展支撑

第一目标:SQL 执行流程

执行器 - sql 处理器 - 参数处理器 - 结果集处理器

MyBatis源码学习的第一个目标就是要搞定四个组件所组成的Sql执行流程。这个四个组件分别是:

  • 执行器(Execute)
  • Sql处理器(StatementHandler)
  • 参数处理器(ParameterHandler)
  • 结果集处理器(ResultSetHandler)

这个目标又可分解成4个小目标

  • 理解四个组件执行上的顺序
  • 每个组件的作用及意义
  • 掌握Execute 的三个实现逻辑
  • 掌握StatementHandler的三个实现逻辑

第二目标:三大映射:

分别是

  • 动态SQL映射
  • 参数映射
  • 结果集映射

不仅要搞清楚映射配置的加载与解析,更重要的弄清楚映射逻辑。

加载解析:指用户配置的XML解析成JAVA配置对象。
比如块,最终要解析成SqlSource。或 要解析成ResultMap对象。
映射逻辑:比如SqlSource如何基于参数生成可执行SQL,ResultMap如何将结果集,解析成JAVA对象等。

小目标拆解:

  • 理解 SQL 映射声明(MappedStatement)的作用,以及它与三大映射的关系
  • 掌握动态 SQL 的解析过程,包括其脚本表达式的执行逻辑
  • 掌握 mybatis 所封装的映射工具包的使用
  • 掌握参数转换过程,以及映射的封装过程
  • 掌握结果集映射核心逻辑,包括关联映射等。循环依赖处理 (这部分最难)
  • 掌握全部配置 configuration 的核心定位,以及他的加载解析过程

第三目标:扩展支撑

小目标:

  • 掌握一二级缓存的结构,以及执行逻辑
  • 理解会话的意义和其采用的设计模式
  • 掌握 mapper 接口动态代理流程
  • 掌握插件机制底层原理
  • 掌握懒加载流程

涵盖的设计模式:装饰器、责任链、门面、动态代理等。

Mybatis 源码分析 - 图3

计划:
本周末完成;? 第一次分析,不求甚解;