Mybatis源码细节探究:sqlSessionFactory.openSession()这个方法到底发生了什么?

news/2024/11/19 12:32:17/

给自己的每日一句

不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽都顺利

前言

        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();

作为一个开发界的菜鸟,当我研究Mybatis的源码的时候,总是好奇,上边这三行代码单当中走过的时候,发生了什么样的事情呢?我们这篇文章只研究openSession这个方法。

sqlSessionFactory.openSession()

public interface SqlSessionFactory {SqlSession openSession();SqlSession openSession(boolean autoCommit);SqlSession openSession(Connection connection);SqlSession openSession(TransactionIsolationLevel level);SqlSession openSession(ExecutorType execType);SqlSession openSession(ExecutorType execType, boolean autoCommit);SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);SqlSession openSession(ExecutorType execType, Connection connection);Configuration getConfiguration();}

SqlSessionFactory是SqlSession的工厂,各种各样的重载的openSession方法。
在这里插入图片描述
实现类有两个,默认走的都是第一个DefaultSqlSessionFactory

  @Overridepublic SqlSession openSession() {return openSessionFromDataSource(//默认的是SimpleExcutor,configuration.getDefaultExecutorType(), null, false);}
  private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {Transaction tx = null;try {//final可以修饰局部变量//获取Mybatis-config.xml中的Environment标签对应的对象final Environment environment = configuration.getEnvironment();//通过environment获取事务工厂final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);//通过事务工厂和数据源获取事务对象tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);//configuration.newExecutor(事务对象,Executor类型对象)final Executor executor = configuration.newExecutor(tx, execType);return new DefaultSqlSession(configuration, executor, autoCommit);} catch (Exception e) {closeTransaction(tx); // may have fetched a connection so lets call close()throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);} finally {ErrorContext.instance().reset();}}

通过Environment 获取TransactionFactory 对象
通过TransactionFactory和Environment中的DateSource获取Transaction
通过Transaction 和 ExcutorType获取 Executor 对象
通过Executor configuration autoCommit获取SqlSession对象、

在这里插入图片描述

我们可以得出以下结论
1:openSession()默认创建的是DefaultSqlSession对象,而且三个入参是:ExcutorType、TransatinIsolationLevel、AutoCommit
2:默认的Exuecutor是SimpleExecutor
3:Excutor对象是由Configuration创建的,默认void:SimpleExcutor,param:Transaction、ExecutorType


http://www.ppmy.cn/news/89183.html

相关文章

jvm之JMX

写在前面 本文来看先jmx相关内容。 1:jmx介绍 jvm在运行的过程中有很多的信息,比如堆内存,线程数,加载的类信息,CPU的使用量等,如果我们想要将这些信息暴漏让外界获取,该怎么做呢?此时就需要…

咖啡「江湖」:从1999到2023

【潮汐商业评论/原创】 “我现在几乎每天都要来杯咖啡,哪怕周末在家休息也是。上班喝美式是为了提神,在家做拉花是享受生活,平时和朋友出去大概率还是会选择咖啡馆,毕竟看起来有氛围还不发胖。”Allen说道。 事实上,…

Java 代理模式详解

Java 代理模式详解 前言一、代理模式概述二、静态代理1、概述2、实现步骤3、代码演示 三、动态代理1、JDK 动态代理机制(1)JDK 动态代理类使用步骤(2)代码示例 2、CGLIB 动态代理机制(1)CGLIB 动态代理类使…

【面试题】前端必修-浏览器的渲染原理

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 1.浏览器的渲染原理 #浏览器是如何渲染页面的 1.什么叫渲染 render 当我们输入一个url地址的…

凌恩生物文献分享 | 16S全长扩增子+代谢组/转录组多组学!高分paper的绝佳拍档!

16S全长扩增子联合代谢组/转录组多组学研究,是目前微生态研究趋势。单一研究方法较难发表高水平文章,多组学关联研究逐渐成为“快速”发表高分paper的绝佳拍档! 小编精心挑选了3篇医学微生态研究的高分文章,希望能帮助大家激发科…

Python爬虫数据分析的基本概念

Python爬虫数据分析是一种利用Python编程语言和相关的库来获取互联网上的数据,并对数据进行处理、分析和可视化的技术。Python爬虫数据分析技术在数据挖掘、商业智能、市场调研、舆情分析等领域都有广泛的应用。本文将介绍Python爬虫数据分析的基本概念、常用库和实…

4.spring总结

文章目录 一、spring总结1、Spring三级缓存解决什么问题?2、Spring支持的几种bean的作用域?3、pring bean是否是线程安全?4、*Spring框架中bean的生命周期*?5、哪些是重要的bean生命周期方法?你能重载它们吗&#xff1…

Spring Boot注解@Async与线程池的配置

目录 使用异步注解创建异步任务 Async注解 使用Demo 线程池配置 Spring Boot默认用于异步任务线程池配置 线程池配置 线程池隔离 为什么需要线程池隔离? 线程池隔离实现Demo 线程池配置: 异步任务: 测试demo 参考内容: 使…