读源码【读mybatis的源码的思路】
✿ 需要掌握的编译器知识
★ 编译器为eclipse为例子
调试准备工作(步骤:Window -> Show View -》...):
□ 打开调试断点Breakpoint:

□ 打开变量监视:

要看一个方法的内部细节,按f5,进入

要快速跳到某个位置【在目标位置上打个断点】,然后按f8

观察方法的细节(执行流程),一步一步走,按f6

去除掉所有断点(编译器是eclipse)

□ 注意看开始标记的执行位置对不对

f5调试的方式进入【
若进入的是不相干的,按f7返回,再按f5进入一次】
举例:
User user = mapper.get(1L); //在这里打一个断点进入,会先进入Long类,因为执行顺序是(1L)先执行呀,所以先进入它之后,再执行get方法
按ctr 和 按调试的f5的区别:
□ ctr:是进入“被选中的代码(类、接口、方法)”的定义的位置【强调点是代码的定义】
□ f5:是对于当前代码按执行的先后顺序进行执行,进入、执行它的内部【强调点是代码的执行】按ctr 结合鼠标, 可以知道代码下一步的去向(按ctr要注意的细节:ctr默认进入的是被选中的代码的定义,不是实现过程,进入之后发现没看到什么有帮助理解的代码,返回返回按住ctr,选择实现(若是有多个实现,
不知道选哪个,可以通过调试f5进入),再按鼠标进入。


重新开始调试细节:
(1)关闭上一次调试
(2)点击 开始调试之前,保留开始位置的断点前面的√,其他断点前面的√先去掉(开始调试之后才√回来)

进入一个方法后了解到方法的细节,想返回接着往下执行,按f7 返回 【
返回按f7】
一般在深入了解某个模块之后,可以按返回,返回。。。然后接着了解下一个模块

✿ 读源码的思路
1、重点理解执行逻辑(执行过程可以按control进入方法或类,理解下一步去向后,光标回到当前位置【快捷键是alt+←】)
2、看源码过程理清思路,异常相关的(error、exception、throw),让代码更加健硕的细节可以忽略;栈相关的stack,底层的可以忽略
3、在代码中,看到选择分支的话,可以观察变量的值(判断条件)知道要进入哪个分支
4、在代码中,看到不理解的代码,可以先往下执行,然后通过观察变量的值进行理解【还可结合官网进行理解】
5、读取流、加载资源、绑定命名空间、参数转化不是重点
6、构造构造器不是重点,重点是看 构造器的构造过程
7、构造解析器不是重点,重点是看 解析器的解析过程
8、创建了子类要注意:什么类型的子类?当子类有封装的父类或兄弟类时候,注意封装的父类或兄弟类是什么类型的?
1、重点理解执行逻辑(执行过程可以按control进入方法或类,理解下一步去向后,光标回到当前位置【快捷键是alt+←】)
- 所以阅读源码,咱了解到:创建了一个SqlSessoinFactory会话工厂对象是通过默认的SqlSessoinFactory创建的,在创建的时候需要传入一个配置对象【即创建会话工厂对象的时候还创建了一个配置对象】,至此,研究一下配置对象的创建过程。

2、看源码过程理清思路,异常相关的(error、exception、throw),让代码更加健硕的细节可以忽略;栈相关的stack,底层的可以忽略





3、在代码中,看到选择分支的话,可以观察变量的值(判断条件)知道要进入哪个分支

4、在代码中,看到不理解的代码,可以先往下执行,然后通过观察变量的值进行理解【还可以结合官网进行理解】

5、读取流、加载资源、绑定命名空间、参数转化不是重点



6、构造构造器不是重点,重点是看构造器的构造过程:

7、构造解析器不是重点,重点是看解析器的解析过程:



8、创建了子类要注意:什么类型的子类?当子类有封装的父类或兄弟类时候,注意封装的父类或兄弟类是什么类型的?
- Executor
- CachingExecutor(Simple) 带有缓存的执行器

✿ 读mybatis的源码的思路
■ 1、 阅读源码的过程,应该阅读哪一个,哪一个是阅读重点呢?
- 阅读源码构建会话工厂对象的源码,咱了解到:创建了一个SqlSessoinFactory会话工厂对象是通过默认的SqlSessoinFactory创建的,在创建的时候需要传入一个配置对象【即创建会话工厂对象的时候还创建了一个配置对象】,至此,研究一下配置对象的创建过程。

- 阅读源码构建会话工厂对象的源码,咱了解到:创建一个sqlSession会话对象是通过默认的sqlSession,在创建的时候需要传入三个参数,重点是观察哪个呢?
□ configuration 配置对象(在阅读会话工厂对象构建的源码的时候咱就了解过它了,不是重点)
□ executor 执行器(重点,因为在return 会话对象之前构建了executor执行器)
□ autoCommit (是否提交,布尔值,不是重点)

- 结合理解逻辑,还有return的提示作用,知道阅读重点是list的过程

■ 2、 阅读源码mybatis操作数据库的过程:
/* 测试查询 */
@Test
public void testGet() throws IOException {
// 1、从classpath路径加载mybatis全局配置文件mybatis-config.xml
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 2、创建SqlSessoinFactory会话工厂对象,好比连接池DataSource
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3、创建SqlSession会话对象,好比连接对象Connection
SqlSession session = factory.openSession();
// 4、获取mapper对象
UserMapper mapper = session.getMapper(UserMapper.class);
//执行sql操作
User user = mapper.get(1L);
System.out.println(user);
// 5、关闭资源
session.close();
}
(1)创建SqlSessoinFactory会话工厂对象
- 查看源码得知,表名上是创建了一个SqlSessoinFactory会话工厂对象, 实际上在创建SqlSessoinFactory会话工厂对象的时候还创建了一个全局配置对象。【咱还顺带看了一下全局配置的创建过程啦】

(2)创建SqlSessoin会话对象
查看源码得知,表名上是创建了一个SqlSessoin会话对象, 实际上在创建SqlSessoin会话对象的时候还创建了一个全执行器对象。【咱还顺带看了一下执行器的创建过程啦】
执行器对象Executor【
CachingExcutor(Simple)带有缓存的执行器】,是mybatis的调度中心,负责sql的生成和查询缓存维护。在创建SqlSessoin会话对象创建,会执行pluginAll方法

(3)创建mapper对象
- 查看源码得知,创建mapper对象, 实际上通过jdk的代理机制创建了一个mapper的代理对象。


(4) 执行sql操作:mapper.get(1L);
- 先判断传入的方法类型,不是Object类型,就使用映射方法进行执行

- 执行的时候会根据元素类型进行选择

- 咱执行mapper.get(1L)实际上是会话对象调用selectOne方法

- selectOne 返回一个集合list,观察selectList

- 映射语句mapperStatement封装了元素的信息

- 在selectList方法看到执行器调用查询方法

- 发现执行查询的过程,先经过CachingExcutor(带有二级缓存的执行器),先从二级缓存中寻找是否有数据

- 发现执行查询的过程,经过BaseExcutor(底层的执行器),先从一级缓存localCache中寻找是否有数据,若是没有在从数据库中查询

- 从数据库查询,是简单的执行器,调用doQuery方法

- 构建语句处理器对象

- 构建RoutingStatementHandler语句处理器对象

- 构建PreparedStatementHandler预编译语句处理器对象

- 构建ParameterHandler参数处理器对象、构建ParameterHandler参数处理器对象

- ★ Statement(PreparedStatement 预编译语句对象)创建对象之前,先创建参数处理器和结果处理器
□ ParamterHandler 参数处理器,先把用户传入的参数转成JDBC需要的参数值,在创建对象之前,会执行pluginAll方法
□ ResultSetHandler 结果集处理器,把结果集中的数据封装到list集合,在创建对象之前,会执行pluginAll方法



- 实例化一个语句对象

。。。
✿ 总结阅读mybatis执行sql的源码中的核心对象:
InterceptorChaiin 拦截器链,多个拦截器合成
Configuration 全局配置对象,封装了所有的配置信息
Executor 执行器,myBatis的调度中心,负责sql生成和查询缓存维护,在创建sqlSession对象之前。创建ok之后,会执行pluginAll方法
- BaseExecutor 底层的执行器,先从一级缓存中查询,若没有,则到数据库中查询
- CachingExcutor(Simple) 带有二级缓存的执行器,先去二级缓存中寻找是否有数据
MappedStatement 映射语句对象,封装了一个元素节点(insert|delete|update|select)的信息
StatementHandler 语句处理器,封装了JDBC的DML/DQL操作,参数设置,在创建对象时,执行pluginAll方法
- RoutingStatement
■ 在创建StatementHandler 创建对象之前,先创建参数处理器和结果集处理器
□ ParameterHandler 参数处理器,把用户传入的参数转化为JDBC需要的参数值,在创建对象时,执行 pluginAll方法
□ ResultSetrHandler 结果集处理器,在结果集中的数据封装到List集合,在创建对象时,执行 pluginAll方法
✿ 读的源码需要掌握的单词
- map 映射 mapper 映射器
- factory 工厂
- build 构建
- config 配置
- parse 解析 parser 解析器 parsed 已解析的 parseConfiguration 解析配置
- interceptor 拦截器
- plugin “安装[增强]”、插件
- proxy 代理
- prepared 预编译的 callable 存储的
- statment 语句对象 preparedStatement 预编译语句对象 callableStatement 存储的语句对象
- cursor 光标
- instantiate 实例化 instantiateStatement 实例化语句对象
- handler 处理器 typeHandler 类型处理器
- row 行
读源码【读mybatis的源码的思路】的更多相关文章
- java架构之路-(源码)mybatis执行流程源码解析
这次我们来说说Mybatis的源码,这里只说执行的流程,内部细节太多了,这里只能授之以渔了.还是最近的那段代码,我们来回顾一下. package mybatis; import mybatis.bea ...
- mybatis generator 源码学习
mybatis/generator 源码地址mybatis/parent 源码地址1. 分别点击Download ZIP下载到本地. 2. 解压generator-master.zip中的core到g ...
- 【源码分析】HashMap源码再读-基于Java8
最近工作不是太忙,准备再读读一些源码,想来想去,还是先从JDK的源码读起吧,毕竟很久不去读了,很多东西都生疏了.当然,还是先从炙手可热的HashMap,每次读都会有一些收获.当然,JDK8对HashM ...
- 【转】MaBatis学习---源码分析MyBatis缓存原理
[原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 ...
- 精尽MyBatis源码分析 - MyBatis 的 SQL 执行过程(一)之 Executor
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- Mybatis 系列10-结合源码解析mybatis 的执行流程
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- Spring mybatis源码篇章-Mybatis的XML文件加载
通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-Mybatis主文件加载 前话 前文主要讲解了Mybatis的主文件加载方式,本文则分析不使用主文件加载方式 ...
- 【狂神说】JAVA Mybatis 笔记+源码
简介 自学的[狂神JAVA]MyBatis GitHub源码: https://github.com/Donkequan/Mybatis-Study 分享自写源码和笔记 配置用的 jdk13.0.2 ...
- 精尽 MyBatis 源码分析 - MyBatis 初始化(一)之加载 mybatis-config.xml
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
随机推荐
- python安装第三方库的步骤
windows下举例:1.下载openpyxl,http://pypi.doubanio.com/simple/openpyxl/2.将下载后的文件解压放到Python文件夹下的Lib文件夹下3.cm ...
- 理解闭包--js面向对象编程
什么是闭包? 先看一段代码: function a(){ var n = 0; function inc() { n++; console.log(n); } inc(); inc(); } a(); ...
- hisql ORM 查询语句使用教程
HiSql 提供一个可以适合多种数据库的中间查询语法,不需要关注各个数据库的语法特性,通过HiSql写语句可以在常用的不同类型数据库中执行,且语法与Sql语境类似一看就懂一学就会 hisql.net ...
- Hive分析统计离线日志信息
关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...
- [转]JS正则表达式基础
1. 正则表达式的概念 正则表达式(regular expression)描述了一种字符串匹配的模式.这种模式,我们可以理解成是一种"规则".根据这种规则再去匹配符合条件的结果,而 ...
- HIVE理论学习笔记
概述 参加了新的公司新的工作新的环境之后,本人必须学习更多的知识,所以稳固之前的知识和学习新的知识是重中之重,新的公司把hadoop大部分的组件都进行了架构源码深度改造,所以使用过程确实遇到一些麻烦, ...
- 在 python 项目中如何记录日志
一. 概述 写本文的目的是我在写 python 项目的时候需要记录日志,我忘记怎么处理了,每次都需要去网上查一遍,好记性不如烂笔头, 这里把查阅的内容记录下来,方便以后查找. python 项目中记录 ...
- 大型站点TCP/IP协议优化
作为一个DAU上百万或千万的站点,不仅仅需要做好网站应用程序.数据库的优化,还应从TCP/IP协议层去进行相关的优化: 在我的工作中,曾使用到了以下的几种基本的优化方式: 增大最大连接数 在Linux ...
- Java库中的LocalDate类
Java库中的LocalDate类 类库设计者决定将保存时间与给时间点命名分开.所以标准Java类库分别包含了两个类:一个用来表示时间点的Date类:另一个是用来表示大家熟悉的日历表示法的LocalD ...
- Win7升级Win11升级记录及教程 【错误码(0×8004242d)】
hellow,大家好,我是公众号棱镜Prism K的[K君].家中电脑因为一些原因不得不进行升级,下面是我对这次电脑升级所进行的记录. step 1.打开微软官网,找到对应的WIN11下载模块,这里注 ...