在上一篇中我们一起深入地看了SqlSessionFactory在创建的过程中里面都做了些什么,所以这里我们就接着讲下一步SqlSession的创建。没看上一篇的点这里:

Mybatis原理解析(一)解析全局xml配置文件生成SqlSessionFactory

首先我们知道了在创建SqlSessionFactory的过程中,其实底层大部分就是在初始化我们的Configuration对象,通过这个构建好的Configuration对象作为参数创建出一个DefaultSqlSession对象给上层。所以说现在我们拿到了一个包含有Configuration对象的DefaultSqlSession对象。

所以现在我们要研究的就是SqlSession session = sqlSessionFactory.openSession(true)这一个创建SqlSession的过程底层做了什么了。

好,话不多说,我们debug走起。

继续深入openSessionFromDataSource方法

 在这里很明显我们可以看到最终返回给我们的是一个DefaultSqlSession对象,而该对象需要一个Executor,Executor是什么,有何用?这里我们就深入创建Executor的newExecutor方法看看。

对于这个方法我们分三部分来看

part1

根据传过来的defaultExecutorType去判断要创建什么类型的Executor,如果类型是simple的,就创建出SimpleExecutor,类型是reuse的,就创建出ReuseExecutor,类型是batch的,就创建出BatchExecutor。

part2

创建好了具体的Executor对象之后,然后再看是否开启了二级缓存,二级缓存的设置是在全局配置文件中去设置的,所以说如果开启了,我们的Configuration对象的cacheEnabled属性就为true,否则为false。如果是true,即开启了二级缓存的话,那么我们就会将创建好的Executor对象作为参数传入一个叫CacheExecutor的构造函数中。所以我们可以深入到CacheExecutor中:

可以发现传入的Executor对象赋值给了里面的Executor变量 ,看它的其他方法,比如:

可以发现里面真正执行与数据库交互的操作其实还是我们传入的Executor对象,说明CacheExecutor只是一个将我们的Executor再封装了一层而已,然后在里面加多了一些缓存的方法罢了,其实这也是Java设计模式的静态代理的实现了,CacheExecutor就相当于Executor的一个代理类,这个代理类增加了缓存的功能。

part3 

executor = (Executor) interceptorChain.pluginAll(executor)这一句很重要,在之后我们好会遇到这一句代码,这是什么?这其实就和我们的插件机制有关了,在Mybatis中我们可以自定义插件,这个我们以后再说。

经过了这3部分之后,就拿到了一个可能被CacheExecutor和插件封装过的Executor对象了。最后返回给上层

最后,我们拿到的就是一个实现了SqlSession接口的DefaultSqlSession对象了,而且该对象里面包含了Configuration对象和可能被封装过的Executor对象。

Mybatis原理解析(二)SqlSession的创建过程相关推荐

  1. MyBatis运行原理(二)SqlSession对象创建过程分析

    PS:这篇博文承接上一篇: MyBatis运行原理(一)SqlSessionFactory对象创建过程分析 在上一篇博文中分析了SqlSessionFactory对象创建的过程,有了SqlSessio ...

  2. MyBatis原理解析

    参考自: MyBatis原理分析(通俗易懂)_Coder Wang-CSDN博客_mybatis原理 从源码一层一层进行分析,写得清晰易懂.我再这里就不赘述了,就写一下自己的大白话总结吧. Mybat ...

  3. java解析sql语句简书,Mybatis原理解析(一)--java.sql数据库操作的基本实现方式

    在研究Mybatis原理之前,先看一下java中是如何实现一次对数据库的访问的: public void testSql() { Connection connection = null; State ...

  4. OkHttp原理解析(二)

    前言 上一篇我们学习了OKHttp的请求执行流程,知道了最终请求流程都会交给getResponseWithInterceptorChain方法来执行,接下来我们就详细分析执行getResponseWi ...

  5. Android资源管理框架(二)AssetManager创建过程

     Android应用程序在运行的过程中,是通过一个称为AssetManager的资源管理器来读取打包在APK文件里面的资源文件的.在本文中,我们就将详细分析Android应用程序资源管理器的创建以 ...

  6. hessian原理解析二(服务端分析)

    hessian 服务端源码分析 我们在回头看看 web.xml 中 servlet 配置 <servlet> <servlet-name>HelloHessian</se ...

  7. iOS中下载大型文件的原理解析二

    在iOS中下载大型文件,需要使用NSURLConnection 的代理方法: (void)touchesBegan:(NSSet)touches withEvent:(UIEvent *)event ...

  8. 《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项

    MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上.MyBatis提供了一级缓存.二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能.本 ...

  9. spring整合mybatis原理

    1.MyBatis整合Spring实现 我们先来实现MyBatis和Spring的整合操作. 1.1什么事MyBatis? MyBatis 是一个可以自定义 SQL.存储过程和高级映射的持久层框架. ...

  10. Python 中 -m 的典型用法、原理解析与发展演变

    在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下: python [-bBdEhiIOqsSuvVWx?] [-c command | -m module- ...

最新文章

  1. 【Gamma】“北航社团帮”展示博客
  2. NeurIPS 2021放榜,接收率创九年新高,你的paper中了吗?
  3. c# 第28节 面向对象概述
  4. javascript的族家族史
  5. GUI实战|Python做一个文档图片提取软件
  6. python编写脚本教程_python编写一个会算账的脚本的示例代码
  7. win7开机动画_win7系统怎么修改开机动画 win7系统开机动画修改方法
  8. 没有提取码 php云盘文件,最新百度网盘分享文件链接无需提取码的方法
  9. DzzOffice_flowplayer播放器更改
  10. matlab imcrop 对应python函数_MATLAB车牌识别之车牌精准定位浅谈
  11. java 热力图,热力图
  12. 【LG-P5072 [Ynoi2015]】盼君勿忘
  13. H-大时钟(扩展欧几里得)
  14. sql sever 存储过程总结及实验
  15. canvas实现2019最酷炫3D特效
  16. 生活中软件易用性的例子_多用“举出例子”“比如说”,来进行生活中的语言交流...
  17. 10款可视化大屏特效,酷炫又内涵!
  18. c++类的类型转换函数
  19. 命令行登录和退出MySQL
  20. app营销变现系统,让你的app更值钱!

热门文章

  1. TableView全展开实现ContentSizedTableView
  2. 饿了么商品排序怎么实现PHP,PHP实现桶排序算法
  3. 局部敏感哈希(Locality Sensitive Hashing,LSH)
  4. Pycharm配置运行/调试时的工作目录
  5. Machine Learning for Communication Networks
  6. pandaboard 安装_pandaboard ES学习之旅——3 Uboot源码下载与编译
  7. 前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端战五渣学JavaScript——Promise...
  8. 自然语言处理(NLP)与自然语言理解(NLU)的区别
  9. DL神经网络权值初始化
  10. Scala入门(2)