Mybatis原理解析(二)SqlSession的创建过程
在上一篇中我们一起深入地看了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的创建过程相关推荐
- MyBatis运行原理(二)SqlSession对象创建过程分析
PS:这篇博文承接上一篇: MyBatis运行原理(一)SqlSessionFactory对象创建过程分析 在上一篇博文中分析了SqlSessionFactory对象创建的过程,有了SqlSessio ...
- MyBatis原理解析
参考自: MyBatis原理分析(通俗易懂)_Coder Wang-CSDN博客_mybatis原理 从源码一层一层进行分析,写得清晰易懂.我再这里就不赘述了,就写一下自己的大白话总结吧. Mybat ...
- java解析sql语句简书,Mybatis原理解析(一)--java.sql数据库操作的基本实现方式
在研究Mybatis原理之前,先看一下java中是如何实现一次对数据库的访问的: public void testSql() { Connection connection = null; State ...
- OkHttp原理解析(二)
前言 上一篇我们学习了OKHttp的请求执行流程,知道了最终请求流程都会交给getResponseWithInterceptorChain方法来执行,接下来我们就详细分析执行getResponseWi ...
- Android资源管理框架(二)AssetManager创建过程
Android应用程序在运行的过程中,是通过一个称为AssetManager的资源管理器来读取打包在APK文件里面的资源文件的.在本文中,我们就将详细分析Android应用程序资源管理器的创建以 ...
- hessian原理解析二(服务端分析)
hessian 服务端源码分析 我们在回头看看 web.xml 中 servlet 配置 <servlet> <servlet-name>HelloHessian</se ...
- iOS中下载大型文件的原理解析二
在iOS中下载大型文件,需要使用NSURLConnection 的代理方法: (void)touchesBegan:(NSSet)touches withEvent:(UIEvent *)event ...
- 《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项
MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上.MyBatis提供了一级缓存.二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能.本 ...
- spring整合mybatis原理
1.MyBatis整合Spring实现 我们先来实现MyBatis和Spring的整合操作. 1.1什么事MyBatis? MyBatis 是一个可以自定义 SQL.存储过程和高级映射的持久层框架. ...
- Python 中 -m 的典型用法、原理解析与发展演变
在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下: python [-bBdEhiIOqsSuvVWx?] [-c command | -m module- ...
最新文章
- 【Gamma】“北航社团帮”展示博客
- NeurIPS 2021放榜,接收率创九年新高,你的paper中了吗?
- c# 第28节 面向对象概述
- javascript的族家族史
- GUI实战|Python做一个文档图片提取软件
- python编写脚本教程_python编写一个会算账的脚本的示例代码
- win7开机动画_win7系统怎么修改开机动画 win7系统开机动画修改方法
- 没有提取码 php云盘文件,最新百度网盘分享文件链接无需提取码的方法
- DzzOffice_flowplayer播放器更改
- matlab imcrop 对应python函数_MATLAB车牌识别之车牌精准定位浅谈
- java 热力图,热力图
- 【LG-P5072 [Ynoi2015]】盼君勿忘
- H-大时钟(扩展欧几里得)
- sql sever 存储过程总结及实验
- canvas实现2019最酷炫3D特效
- 生活中软件易用性的例子_多用“举出例子”“比如说”,来进行生活中的语言交流...
- 10款可视化大屏特效,酷炫又内涵!
- c++类的类型转换函数
- 命令行登录和退出MySQL
- app营销变现系统,让你的app更值钱!
热门文章
- TableView全展开实现ContentSizedTableView
- 饿了么商品排序怎么实现PHP,PHP实现桶排序算法
- 局部敏感哈希(Locality Sensitive Hashing,LSH)
- Pycharm配置运行/调试时的工作目录
- Machine Learning for Communication Networks
- pandaboard 安装_pandaboard ES学习之旅——3 Uboot源码下载与编译
- 前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端战五渣学JavaScript——Promise...
- 自然语言处理(NLP)与自然语言理解(NLU)的区别
- DL神经网络权值初始化
- Scala入门(2)