✿ 需要掌握的编译器知识

★ 编译器为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会话对象的时候还创建了一个全执行器对象。【咱还顺带看了一下执行器的创建过程啦

  • 执行器对象ExecutorCachingExcutor(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的源码的思路】的更多相关文章

  1. java架构之路-(源码)mybatis执行流程源码解析

    这次我们来说说Mybatis的源码,这里只说执行的流程,内部细节太多了,这里只能授之以渔了.还是最近的那段代码,我们来回顾一下. package mybatis; import mybatis.bea ...

  2. mybatis generator 源码学习

    mybatis/generator 源码地址mybatis/parent 源码地址1. 分别点击Download ZIP下载到本地. 2. 解压generator-master.zip中的core到g ...

  3. 【源码分析】HashMap源码再读-基于Java8

    最近工作不是太忙,准备再读读一些源码,想来想去,还是先从JDK的源码读起吧,毕竟很久不去读了,很多东西都生疏了.当然,还是先从炙手可热的HashMap,每次读都会有一些收获.当然,JDK8对HashM ...

  4. 【转】MaBatis学习---源码分析MyBatis缓存原理

    [原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 ...

  5. 精尽MyBatis源码分析 - MyBatis 的 SQL 执行过程(一)之 Executor

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  6. Mybatis 系列10-结合源码解析mybatis 的执行流程

    [Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...

  7. Spring mybatis源码篇章-Mybatis的XML文件加载

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-Mybatis主文件加载 前话 前文主要讲解了Mybatis的主文件加载方式,本文则分析不使用主文件加载方式 ...

  8. 【狂神说】JAVA Mybatis 笔记+源码

    简介 自学的[狂神JAVA]MyBatis GitHub源码: https://github.com/Donkequan/Mybatis-Study 分享自写源码和笔记 配置用的 jdk13.0.2 ...

  9. 精尽 MyBatis 源码分析 - MyBatis 初始化(一)之加载 mybatis-config.xml

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

随机推荐

  1. linux 之 nginx安装步骤

    配置规划 用户 lzh 用户目录  /lzh 下载 进入官网下载nginx http://nginx.org/download/ 安装 解压 cd /lzh/app tar -zxvf nginx-1 ...

  2. idea 创建 springboot 模块报错-解决

    1.报错截图 2.解决 把 https://start.spring.io  换成  阿里镜像的即可 https://start.aliyun.com/

  3. Linux shc 命令手册

    shc Generic shell script compiler. https://www.linux-man.cn/command/shc/ #Compile a shell script: sh ...

  4. antd中的form表单 initialValue导致数据不更新问题

    初步理解 : initialValue就是所谓的defaultValue,只会在第一次赋值的时候改变,却又有一些不同,因为 initialValue又会因其他改动而改变. 然而当获取的数据重新上来要渲 ...

  5. lvgl移植—Linux fbdev&evdev(基于LVGL v7)

    虽然lvgl官方提供了有关linux framebuffer操作的库函数,但是我决定自己试一下能否自己实现这部分操作 实际项目中应优先采用官方库函数,官方实现代码位于文件夹lv_drivers/dis ...

  6. 兼容h5在ios上登录窗口input失焦后页面不会滚

    $("#logincode").blur(function(){ //滚动到顶部 window.scrollTo(0, 0); })一般多用于密码框失焦后,页面不回滚

  7. Solon 开发,三、构建一个Bean的三种方式

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  8. Ubuntu下使用VS Code创建Spring Boot工程

    目的 我们将在Ubuntu桌面系统下,使用VS Code(Visual Studio Code)编辑器从零开始创建一个Spring Boot工程,并实现一个简单的RESTful风格接口.使用这套流程的 ...

  9. porcupine语音唤醒python实现

    note it is not for arm pyaudio <= 3.6 version porcupine 3.5 3.6 not 3.7 code import struct import ...

  10. X架构键盘选购指南

    X架构键盘 联想 JME8002(未知) JME7597(推荐) 据说是ThinkPAD键盘的血统. Thinkapad 小红点键盘,据说腿撑容易坏 明基 明基精钢侠 海湾海贝(键程长,不累手,但不易 ...