//false: 不自动提交
SqlSession sqlSession = factory.openSession(false);public class DefaultSqlSessionFactory implements SqlSessionFactory {//DefaultSqlSessionFactory 中唯一成员变量private final Configuration configuration;@Overridepublic SqlSession openSession(boolean autoCommit) {return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, autoCommit);}//configuration.getDefaultExecutorType() 得到的结果就是默认的 ExecutorType.SIMPLE;public class Configuration {//ExecutorType.SIMPLE: 这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。//ExecutorType.REUSE: 这个执行器类型会复用预处理语句。//ExecutorType.BATCH: 这个执行器会批量执行所有更新语句,如果 SELECT 在它们中间执行还会标定它们是 必须的,来保证一个简单并易于理解的行为。protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;}private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {Transaction tx = null;//通过configuration(封装<configration>所有信息);获取到Environment信息(<environment>)final Environment environment = configuration.getEnvironment();//从Environment中获取TransactionFactoryfinal TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);private TransactionFactory getTransactionFactoryFromEnvironment(Environment environment) {if (environment == null || environment.getTransactionFactory() == null) {return new ManagedTransactionFactory();}return environment.getTransactionFactory();}        //TransactionFactory是Environment类中的对象属性public final class Environment {private final String id;private final TransactionFactory transactionFactory;private final DataSource dataSource;}//transactionFactory创建一个事务 : 传参数 -- environment.数据源, level : 事务隔离级别, 自动提交tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);   //555//根据execType类型, 和事务对象, 创建一个执行器final Executor executor = configuration.newExecutor(tx, execType);          //666//创建DefaultSqlSession: 根据配置对象configuration, 执行器 executor, 自动提交boolean值return new DefaultSqlSession(configuration, executor, autoCommit);           //777}}//返回一个ManagedTransaction对象(TransactionFactory 实现类)
public class ManagedTransactionFactory implements TransactionFactory {//555private boolean closeConnection = true;@Overridepublic Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {return new ManagedTransaction(ds, level, closeConnection);}}public Executor newExecutor(Transaction transaction, ExecutorType executorType) {//666executorType = executorType == null ? defaultExecutorType : executorType;executorType = executorType == null ? ExecutorType.SIMPLE : executorType;Executor executor;if (ExecutorType.BATCH == executorType) {executor = new BatchExecutor(this, transaction);} else if (ExecutorType.REUSE == executorType) {executor = new ReuseExecutor(this, transaction);} else {executor = new SimpleExecutor(this, transaction);}if (cacheEnabled) {//默认trueexecutor = new CachingExecutor(executor);}//装饰模式, 将SimpleExecutor 装饰到 CachingExcutorexecutor = (Executor) interceptorChain.pluginAll(executor);return executor;}//创建一个SqlSession子类DefaultSqlSession对象返回, openSession()方法获得了SqlSession
public class DefaultSqlSession implements SqlSession { // 777private final Configuration configuration;private final Executor executor;private final boolean autoCommit;private boolean dirty;public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {this.configuration = configuration;this.executor = executor;this.dirty = false;this.autoCommit = autoCommit;    }}

mybatis SqlSessionFactory . openSession()方法执行过程相关推荐

  1. 从 JVM 角度看 Spring 中方法执行过程和内存状态

    Spring 容器中的 Bean 默认是单例的,也就是说我们在使用被Spring管理的对象的时候,不需要重复创建了,从而节省空间. 举个例子: 作为一个 CRUD 攻城狮,平时开发最多的就是一个Web ...

  2. [mybatis]sqlSessionFactory.openSession()

    第一个是不会自动提交的 第二个带参数的是会自动提交的

  3. MyBatis 源码分析 - SQL 的执行过程

    本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析.运 ...

  4. Mybatis(9)Dao实现类和无实现类的执行过程

    findAll方法执行为例 1.执行findAll方法,DefaultSqlSession类 2. CachingExecutor类 3.BaseExecutor类 4.SimpleExecutor类 ...

  5. mybatis源码分析(方法调用过程)

    十一月月底,宿舍楼失火啦,搞得20多天没有网,目测直到放假也不会来了... 正题 嗯~,其实阅读源码不是为了应付面试,更重要的让你知道,大师是怎样去写代码的,同样是用Java,为啥Clinton Be ...

  6. mybatis一个方法执行多条sql_精尽MyBatis源码分析——SQL执行过程之Executor!

    MyBatis的SQL执行过程 在前面一系列的文档中,我已经分析了 MyBatis 的基础支持层以及整个的初始化过程,此时 MyBatis 已经处于就绪状态了,等待使用者发号施令了 那么接下来我们来看 ...

  7. MyBatis核心源码剖析(SqlSession XML解析 Mapper executor SQL执行过程 自定义类型处理器 缓存 日志)

    MyBatis核心源码剖析 MyBatis核心源码剖析 1 MyBatis源码概述 1.1 为什么要看MyBatis框架的源码 1.2 如何深入学习MyBatis源码 1.3 源码分析的5大原则 2 ...

  8. mybatis delete返回值_面试:谈谈你对MyBatis执行过程之SQL执行过程理解

    前言 在了解了MyBatis初始化加载过程后,我们也应该研究看看SQL执行过程是怎样执行?这样我们对于Mybatis的整个执行流程都熟悉了,在开发遇到问题也可以很快定位到问题. 更重要的,在面试中遇到 ...

  9. 类执行方法的过程与运行时

    大家都知道,调用一个未声明方法大多数情况下会崩溃,崩溃信息就是unrecognized selector sent to instance:是的,的确大多数情况下是这样的,但是有了运行时就不一定了,这 ...

最新文章

  1. linux qemu 报错 Unable to reserve 0xfffff000 bytes of virtual address space at 0x1000 解决方法
  2. php微信支付na,虚拟支付
  3. JAVA项目中出现部分中文乱码问题
  4. Spring MVC实现Spring Security,Spring Stomp websocket Jetty嵌入式运行
  5. MyEclipse优化浅析
  6. java代码快速_java代码编写快捷途经
  7. js 页面所有超链接后加随机数 基于jquery
  8. 数组拼接时中间怎么加入空格_【题解二维数组】1123:图像相似度
  9. 黄光裕:力争用未来18个月的时间 使企业恢复原有的市场地位
  10. 华为机试HJ27:查找兄弟单词
  11. 微软职位内部推荐-Software Engineer II-Search
  12. 第三篇:关于MVPArms与OKGO结合报错--mRootView为空
  13. 计算机 行列式,行列式计算器
  14. 书评《鸟哥的Linux私房菜 基础学习篇》第四版
  15. 车牌拍照系统上传服务器,车牌识别系统实现过程及摄像机要求
  16. vue项目中使用思维导图mindmap
  17. 风变编程python基础语法-第0关-千寻的名字
  18. Java多线程学习(吐血超详细总结)转自博主林炳文Evankaka
  19. 链家租房数据抓取流程、分析
  20. Visual Studio 2005 Service Pack 1 (SP1)

热门文章

  1. elasticsearch查询term等级(query查询)
  2. FarPoint 表格(居中)自适应显示图片
  3. 王者电竞APP源码大圣电竞掌趣电竞逗游电竞比心电竞TT语音电竞王者荣耀和平精英游戏赛事软件二开搭建运营过的产品
  4. 时钟服务器工作原理,OpenNTPD时间服务器的基本工作过程分析
  5. 面试题: 你在工作/学习过程中遇到过什么深刻问题吗?怎么克服?
  6. phpcms v9修改flash上传为h5上传方法
  7. 超越GAN?OpenAI提出可逆生成模型Glow!图像生成太逼真
  8. 通过IP地址获取当前地理位置的接口(包含纬经度)
  9. 医用X射线胶片扫描仪行业调研报告 - 市场现状分析与发展前景预测
  10. hideFocus(小技巧) 聚焦无虚框 【转】