前面mybatis的初始化过程分析完成,接下来是第二步SqlSession的创建。

创建过程总览

SqlSession创建过程如下图:创建过程还是比较简单的,首先是之前分析的SqlSessionFactory,在mybatis中提供了两个SqlSessionFactory实现:SqlSessionManager和DefaultSqlSessionFactory,通过前面的分析知道默认返回的是DefaultSqlSessionFactory,至于SqlSessionManager后面再说吧。DefaultSqlSessionFactory为创建SqlSession对象重载了多个方法,除了默认的无参方法,还可以指定自动提交、事务隔离级别以及指定的执行器类型。执行器类型是一个枚举对应mybatis提供的三种执行器类型:SIMPLE, REUSE, BATCH。这里从无参方法入手,可以看到最终传递了三个默认参数:默认的执行器类型(在configuration中默认是SIMPLE),默认隔离级别,非自动提交。接下来就是具体创建SqlSession的过程了,主要做了三件事情:1、根据configuration获取environment,然后获取事务工厂,也就是在mybatis-config中配置的事务工厂;2、通过事务工厂根配置文件中的据数据源、事务隔离等级、是否自动提交创建事务对象;3、根据事务对象和执行器类型创建执行器对象;4、创建DefaultSqlSession对象,把configuration和执行器对象设置给这个对象;这个过程创建了三个对象:事务、执行器、DefaultSqlSession。

事务创建过程

事务创建源码过程如下图:事务创建首先是事务工厂,因为在配置文件中配置的是JDBC,在configuration中JDBC类型别名对应的是JdbcTransactionFactory类,所以这里直接看的是JdbcTransactionFactory类,它创建Transaction的方法是  newTransaction,直接调用的是JdbcTransaction的构造函数,只是把数据源、事务隔离级别、是否自动提交设置到对象中没有多余的操作。JdbcTransaction是Transaction的一个实现。它已经实现了Transaction的getConnection、commit、rollback、close、getTimeout方法。数据源是从configuration中获取的,在mybatis中数据源DataSource有两种实现:PooledDataSource、UnpooledDataSource,由配置文件的dataSource节点的type值来确定。一般在生产中,我们会使用DBCP或druid等连接池。

执行器创建

执行器初始化源码如下图:执行器Executor对象是通过Configuration对象创建的,newExecutor方法会先判断创建的Executor类型,然后根据类型创建对应的对象,创建成功后如果开启了缓存还会把新建的Executor对象作为参数创建CachingExecutor对象。CachingExecutor持有其他Executor对象,具体操作由其他对象执行,他只做缓存那块的功能,CachingExecutor更像是其他Executor的代理。Configuration和transaction都被保存在了BaseExecutor中,然后SimpleExecutor实现了操作数据库的方法,这些方法后面再说。在最后还看到了interceptorChain的身影,执行interceptorChain的pluginAll方法实际上就是遍历配置的所有Interceptor对对执行器进行包装。

总结

DefaultSqlSession的构造函数没有什么说的,这里就不展开了。通过这几个类的分析现在清楚了几个对象的结构,首先是SqlSession中有全局配置configuration和执行器executor,执行器executor中有全局配置configuration和事务Transaction,而事务Transaction中有从configuration中得到的DataSource,而DataSource中包含有数据库的连接信息。接下来就是SqlSession执行sql语句了,后面继续。Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

mybatis都有哪些executor执行器_Mybatis的SqlSession创建过程详解相关推荐

  1. spark源码(四)executor在worker上的创建过程,executor本质是什么,是线程池吗?

    上篇文章我们讲解了master调度driver和executor(application)的过程,但是对于executor在worker上的创建过程没有讲,这里我们接着上篇文章继续讲. 首先我们从wo ...

  2. 外贸收汇方式你都真的清楚了吗?外贸B2B收款结汇方法详解!

    外贸收汇方式你都真的清楚了吗?外贸B2B收款结汇方法详解!很多做外贸朋友都知道,外贸收款.结汇是外贸交易中非常重要的一个环节.一个好的外贸收款渠道,可以快速地帮助企业资金回笼,支付货款.退税等等,能省 ...

  3. mybatis 鉴别其_MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询

    MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询 白玉 IT哈哈 支持的 JDBC 类型 为了未来的参考,MyBatis 通过包含的 jdbcType 枚举型,支持下面的 ...

  4. sql server解析xml属性为表格_Mybatis中SqlSource解析流程详解

    前面几篇文章都在详细分析mapper的加载过程,但是始终没有看到sql的解析过程,今天来详细分析下. 解析sql的位置 前面分析到不管是通过注解还是通过xml方式生成mapper,最终都是调用Mapp ...

  5. mybatis数据源(JNDI、POOLED、UNPOOLED)源码详解

    一.概述 二.创建 mybatis数据源的创建过程稍微有些曲折. 1. 数据源的创建过程: 2. mybatis支持哪些数据源,也就是dataSource标签的type属性可以写哪些合法的参数? 弄清 ...

  6. java编译不报错但运行啥都没_java编译时与运行时概念与实例详解

    java编译时与运行时概念与实例详解 发布于 2020-7-29| 复制链接 本篇文章通过实例对 java程序编译时与运行时进行了详解,需要的朋友可以参考下 Java编译时与运行时很重要的概念,但是一 ...

  7. mybatis select语句会默认带排序吗_MyBatis中#和$的区别详解

    区别 1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111& ...

  8. mybatis date类型映射_Mybatis中类型映射处理器详解

    上一篇梳理了Configuration初始化分析,今天继续typeHandlers部分. 数据库厂商标识 接上一篇文章分析,下一个解析的是databaseIdProvider节点,这个节点好理解,从字 ...

  9. 【笔记】mybatis的sqlSession和Mapper详解

    文章目录 SqlSession介绍和使用 Mapper映射器 总结 SqlSession介绍和使用 SqlSession是一个接口类,它类似于你们公司前台的美女客服,它扮演着门面的作用,而真正干活的是 ...

最新文章

  1. celery的初次使用
  2. Netscreen防火墙常用命令-管理篇
  3. 学校老师绝对不会教的方法,让你的孩子拥有一个开挂般的人生!
  4. 单机单网卡最大tcp长连接数真的是65535吗?
  5. 8个Python高效数据分析的技巧
  6. 洛谷 2017.7月赛解题报告
  7. qt最大化和还原实现_Qt 窗口操作函数(置顶、全屏,最大化最小化按钮设置等)...
  8. 【Java必备技能三】自定义注解
  9. 区分微信小程序是否支持canvas 2d
  10. Ubuntu 16.04安装crossover17 并安装 TIM
  11. 如何提高机器学习模型预测准确率
  12. 未来,我们终将共同沐浴在实时光追之下
  13. TOM邮箱|怎么在邮箱里设置邮件个人签名呢?
  14. 企业规划SaaS产品时,要预防商业智能BI取数的坑
  15. UCASE() 函数
  16. 2016传智SSH框架CRM项目(5天)笔记(2017年5月20日22:11:15)
  17. Hibernate 多表映射(Mybatis,Springjdbc,Hibernate ,JDBC的多表映射学习比较)
  18. 用区块链构建可信教育——2020高校区块链技术创新云论坛集锦(1)
  19. “数字哨兵”+门禁,访客、闸机 联动管控
  20. last night

热门文章

  1. bzoj千题计划174:bzoj1800: [Ahoi2009]fly 飞行棋
  2. TortoiseGit使用入门
  3. php数组写杨辉三角java_用java实现杨辉三角的示例代码
  4. 手机自动化测试IDE之Airtest基本操作方法,学完让你解放双手
  5. java字符相似_JAVA 获取两个字符串的相似度
  6. mysql分组按天统计数据_MySql按周,按月,按日分组统计数据
  7. python实践项目(四)
  8. requests库post方法如何传json类型的data
  9. ant里面table嵌套子表格_ElementUI el-table行内编辑验证,动态增减行
  10. Python自动化整理文件,还增加了可视化GUI界面