■ 阅读源码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
  • TypeHandler 类型转化器,把java类型和JDBC类型做相互转化操作,参数处理器、结果集处理器都会用到它。

■ 在创建StatementHandler 创建对象之前,先创建参数处理器和结果集处理器

□ ParameterHandler 参数处理器,把用户传入的参数转化为JDBC需要的参数值,在创建对象时,执行 pluginAll方法

□ ResultSetrHandler 结果集处理器,在结果集中的数据封装到List集合,在创建对象时,执行 pluginAll方法


阅读mybatis的源码的思路的更多相关文章

  1. 读源码【读mybatis的源码的思路】

    ✿ 需要掌握的编译器知识 ★ 编译器为eclipse为例子 调试准备工作(步骤:Window -> Show View ->...): □ 打开调试断点Breakpoint: □ 打开变量 ...

  2. 教你阅读 Cpython 的源码(二)

    第二部分:Python解释器进程 在上节教你阅读 Cpython 的源码(一)中,我们从编写Python到执行代码的过程中看到Python语法和其内存管理机制. 在本节,我们将从代码层面去讨论 ,Py ...

  3. (原创)通用查询实现方案(可用于DDD)[附源码] -- 设计思路

    [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html).   [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...

  4. daily news新闻阅读客户端应用源码(兼容iPhone和iPad)

    daily news新闻阅读客户端应用源码(兼容iPhone和iPad),也是一款兼容性较好的应用,可以支iphone和ipad的阅读阅读器源码,设计风格和排列效果很不错,现在做新闻资讯客户端的朋友可 ...

  5. mybatis generator 源码学习

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

  6. 如何阅读Android系统源码-收藏必备

    对于任何一个对Android开发感兴趣的人而言,对于android系统的学习必不可少.而学习系统最佳的方法就如linus所言:"RTFSC"(Read The Fucking So ...

  7. 【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

    原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量—— ...

  8. 通用查询实现方案(可用于DDD)[附源码] -- 设计思路

    原文:通用查询实现方案(可用于DDD)[附源码] -- 设计思路 [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html).   ...

  9. android新闻项目、饮食助手、下拉刷新、自定义View进度条、ReactNative阅读器等源码

    Android精选源码 Android仿照36Kr官方新闻项目课程源码 一个优雅美观的下拉刷新布局,众多样式可选 安卓版本的VegaScroll滚动布局 android物流详情的弹框 健身饮食记录助手 ...

随机推荐

  1. 单例模式(python)

    python 的单例模式需要重写__new__()和 __init__() 需要注意,标识符__和_区别 参考资料: https://www.cnblogs.com/huchong/p/8244279 ...

  2. win10 安装vue 详解-包括node.js、npm、webpack

    1.下载 去官网下载 node.js https://nodejs.org/en/download/ 一般不会选择最新的,我安装的是 12.18.4 进入历史记录页面网址 https://nodejs ...

  3. centos 目录结构

    bin -----存放命令的目录(bin目录是快捷方式)是/usr/bin的快捷方式 sbin ----只有root用户才能使用的命令 etc ----系统服务的配置文件 /usr/local --- ...

  4. Android官方文档翻译 二 1.Building Your First App

    Building Your First App 创建你的第一个App项目 Dependencies and prerequisites 依赖关系和先决条件 * Android SDK * ADT Pl ...

  5. linux系统Kibana安装 汉化

    Elasticsearch官方系列软件Kibana,在控制台管理维护Elasticsearch. 这里注意Elasticsearch和Kibana的版本一定要一致. 官网下载地址 https://ww ...

  6. Three.js之绘制物体的边框及修改lineWidth

    本博文主要记录如何使用three.js绘制物体的边框及修改其lineWidth.three.js是个技术点比较多,查询资料又比较少的框架,单单就这个修改lineWidth就是一个坑.先放一个动态的效果 ...

  7. 【刷题-LeetCode】210. Course Schedule II

    Course Schedule II There are a total of n courses you have to take, labeled from 0 to n-1. Some cour ...

  8. netty系列之:请netty再爱UDT一次

    目录 简介 netty对UDT的支持 搭建一个支持UDT的netty服务 异常来袭 TypeUDT和KindUDT 构建ChannelFactory SelectorProviderUDT 使用UDT ...

  9. 谷歌浏览器和火狐浏览器如何查看HTTP协议

    谷歌浏览器和火狐浏览器如何查看HTTP协议 谷歌浏览器查看HTTP协议 火狐浏览器查看HTTP协议

  10. [HZOI] 山海经 题解

    0.题目大意 给出一个序列,每次查询一个区间的最大子段和的端点和值.序列长度 \(n \le 10^{5}\) . 1.思路 显然应该使用线段树.题目要求每次求一个区间的最大子段和,那么在线段树节点中 ...