`

mybatis 源码分析之openSession

 
阅读更多
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Connection connection = null;
    try {
      final Environment environment = configuration.getEnvironment();
      final DataSource dataSource = getDataSourceFromEnvironment(environment);
      TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      connection = dataSource.getConnection();
      if (level != null) {
        connection.setTransactionIsolation(level.getLevel());
      }
      //设置日志代理如果需要的话
      connection = wrapConnection(connection);
      Transaction tx = transactionFactory.newTransaction(connection, autoCommit);
      Executor executor = configuration.newExecutor(tx, execType);
      return new DefaultSqlSession(configuration, executor, autoCommit);
    } catch (Exception e) {
      closeConnection(connection);
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

 

可以看出,创建sqlsession经过了以下几个主要步骤:

1)       从配置中获取Environment

2)       Environment中取得DataSource

3)       Environment中取得TransactionFactory

4)       DataSource里获取数据库连接对象Connection

5)       在取得的数据库连接上创建事务对象Transaction

6)       创建Executor对象(该对象非常重要,事实上sqlsession的所有操作都是通过它完成的);

7)       创建sqlsession对象。

 

 public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
    executorType = 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) {
      executor = new CachingExecutor(executor);
    }
    executor = (Executor) interceptorChain.pluginAll(executor);
    return executor;
  }

 可以看出,如果不开启cache的话,创建的Executor只是3中基础类型之一,BatchExecutor专门用于执行批量sql操作,ReuseExecutor会重用statement执行sql操作,SimpleExecutor只是简单执行sql没有什么特别的。开启cache的话(默认是开启的并且没有任何理由去关闭它),就会创建CachingExecutor,它以前面创建的Executor作为唯一参数。CachingExecutor在查询数据库前先查找缓存,若没找到的话调用delegate(就是构造时传入的Executor对象)从数据库查询,并将查询结果存入缓存中。

Executor对象是可以被插件拦截的,如果定义了针对Executor类型的插件,最终生成的Executor对象是被各个插件插入后的代理对象

分享到:
评论

相关推荐

    MyBatis源码详解学习.zip

    源码分析时,会了解到SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等关键类的作用,它们构成了MyBatis的主要工作流程。 SqlSessionFactoryBuilder用于构建SqlSessionFactory,这是MyBatis的核心工厂,...

    Mybatis源码分析.docx

    Mybatis源码分析 Mybatis是一款流行的基于Java的持久层框架,它提供了一个简洁的方式来访问和操作数据库。为了更好地理解Mybatis的工作机制,我们需要对其源码进行分析。 连接数据库 Mybatis通过DataSource对象来...

    一本小小的MyBatis源码分析书.rar

    《一本小小的MyBatis源码分析书》是针对Java开发者,特别是初中级开发工程师的一份重要参考资料,专注于解析MyBatis这一流行持久层框架的源代码。MyBatis作为一个轻量级的ORM(对象关系映射)框架,它极大地简化了...

    mybatis3.x源码深度解析与最佳实践.pdf

    本系列源码解析的方式将从 MyBatis 的源码入手,深入分析 MyBatis 的设计思路和实现机制。 2. 容器的加载与初始化 2.1 config 文件解析 XMLConfigBuilder.parseConfiguration 方法是 MyBatis 中的核心方法之一,...

    Mybatis源码分析.md

    ### Mybatis源码分析 #### 1. 解析配置文件,创建SQLSessionFactory 在MyBatis框架中,创建`SQLSessionFactory`是初始化整个框架的重要步骤之一。这一过程涉及到了配置文件的读取与解析,以及如何构建出可以用于...

    java-ORM框架Mybatis源码分析

    当调用`SqlSessionFactory.openSession()`时,MyBatis会创建一个`DefaultSqlSession`实例,它是实际执行SQL的地方。`DefaultSqlSession`持有`Executor`执行器,`Executor`是MyBatis执行SQL的接口,分为`...

    MyBatis源码demo

    《MyBatis源码分析与实战应用》 在IT行业中,MyBatis作为一个轻量级的持久层框架,因其灵活性和高效性而被广泛应用。它将SQL语句与Java代码相结合,提供了比传统JDBC更方便的数据操作方式。本文将深入探讨MyBatis的...

    mybatis-example.zip

    通过分析这个示例,我们可以深入了解MyBatis的核心功能和用法。 首先,MyBatis的核心组件包括:SqlSessionFactoryBuilder、SqlSessionFactory和SqlSession。SqlSessionFactoryBuilder用于创建SqlSessionFactory,它...

    Mybatis – 执行流程分析(源码分析)

    在深入分析Mybatis的执行流程之前,我们先回顾一下Mybatis的基本操作。Mybatis是一个轻量级的持久层框架,它允许开发者通过XML或注解定义SQL语句,然后通过接口与数据库进行交互。在使用Mybatis时,我们通常会经历...

    MyBatis.md

    根据提供的文件信息,“MyBatis.md”文档主要探讨了MyBatis框架的源码实现及其与Spring框架集成时出现的一级缓存失效问题。本文将深入解析MyBatis的核心组件如Configuration、SqlSession等,并针对MyBatis与Spring...

    myBatis系列之七:事务管理

    本文将深入探讨“myBatis系列之七:事务管理”这一主题,结合源码分析和实用工具,帮助你理解MyBatis中的事务处理机制。 首先,事务在数据库操作中扮演着至关重要的角色,它保证了数据的一致性和完整性。在MyBatis...

    mybatis的helloworld版

    5. **源码分析**: Mybatis的执行流程大致如下: - 创建SqlSessionFactory时,加载并解析配置文件,构建SqlSessionFactory实例。 - 通过SqlSessionFactory创建SqlSession,SqlSession持有Executor实例。 - 调用...

    MyBatis 的执行流程.pdf

    以上流程是基于MyBatis 3.5.5版本源码的分析,MyBatis的执行流程是建立在配置好的映射文件和接口绑定基础上的,通过动态代理机制生成Mapper接口的代理对象,并通过配置的处理器来处理SQL语句的输入输出。了解这一...

    Mybatis基础入门一

    接下来,我们分析`MemberMapper.xml`,这是一个映射文件,它定义了SQL语句和Java对象之间的映射关系。映射文件通常包含`select`、`insert`、`update`、`delete`等元素,用于编写各种数据库操作语句。例如: ```xml ...

    ibatis框架源码剖析光盘资料

    《ibatis框架源码剖析》是一本深入探讨mybatis前身——ibatis的源码解析书籍。通过对源码的深入分析,我们可以理解ibatis的核心机制,掌握数据库操作的底层原理,从而更好地利用和优化这个强大的持久层框架。在这个...

    Criteria hibernate

    10. **源码分析** 对于深入理解Criteria API的工作原理,查看和分析其源码是非常有价值的。通过源码,可以了解Criteria是如何转化为SQL,以及如何处理各种查询条件的。 11. **工具支持** 一些IDE(如IntelliJ ...

    ORM映射实现 java源码

    ORM(Object-Relational Mapping,对象关系映射)是软件开发中一种用于将关系数据库的数据映射到对象的技术,使得开发者可以...通过分析和运行提供的源码,我们可以深入理解ORM的工作原理,从而更好地应用到实际项目中。

    表格的移动

    在IT行业中,表格数据的移动是一项常见的操作,特别是在数据库管理和数据分析任务中。表格的移动可能涉及到数据的导入、导出、复制以及在不同系统或应用间迁移。本篇将主要探讨这一主题,结合标签"源码"和"工具",...

    java分页例子

    本示例将探讨如何在Java应用中实现分页功能,我们将结合源码分析和实用工具来理解这个过程。 首先,我们需要理解分页的基本原理。分页通常涉及到两个关键参数:当前页数和每页显示的记录数。通过这两个参数,我们...

Global site tag (gtag.js) - Google Analytics