博客
关于我
2021-04-11 MyBatis运行流程-02
阅读量:169 次
发布时间:2019-02-28

本文共 3048 字,大约阅读时间需要 10 分钟。

文章目录

获取SqlSession对象

具体操作

  1. openSession()
  2. openSessionFromDataSource()
  3. 获取一些信息,创建事物管理器tx
  4. newExecutor()
  5. 根据Executor在全局配置中的类型,创建出SimpleExecutor/ReuseExecutor/BatchExecutor
  6. 如果有二级缓存配置开启,创建CachingExecutor(executor)
  7. 使用每一个拦截器重新包装executor并返回
  8. 创建DefaultSqlSession,包含ConfigurationExecutor
  9. 返回DefaultSqlSession

源码分析

1. openSession()

SqlSession openSession = sqlSessionFactory.openSession();

2. openSessionFromDataSource()

configuration中拿到默认的Executor类型。Executor类型的类型有三种:SIMPLE/REUSE/BATCH

@Override  public SqlSession openSession() {       return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);  }

3. 获取一些信息,创建事物管理器tx

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {       Transaction tx = null;    try {       //从全局配置中获取环境等信息      final Environment environment = configuration.getEnvironment();      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);      //创建事务      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);      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();    }  }

4. newExecutor()

传入的参数为事务管理器和Executor的类型,根据传入的类型来创建ExecutorExecutor是一个接口,是用来增删改查的。

final Executor executor = configuration.newExecutor(tx, execType);

5. 根据Executor在全局配置中的类型,创建出SimpleExecutor/ReuseExecutor/BatchExecutor

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);    }    //看全局配置中是否配置了二级缓存,如果有用CachingExecutor包装    if (cacheEnabled) {         executor = new CachingExecutor(executor);    }    //使用拦截器包装executor    executor = (Executor) interceptorChain.pluginAll(executor);    return executor;  }

6. 如果有二级缓存配置开启,创建CachingExecutor(executor)

对二级缓存的具体操作:

public CachingExecutor(Executor delegate) {       this.delegate = delegate;    delegate.setExecutorWrapper(this);  }

7. 使用每一个拦截器重新包装executor并返回

pluginAll具体实现:拿到所有的拦截器,调用每一个拦截器的plugin方法。

public Object pluginAll(Object target) {       for (Interceptor interceptor : interceptors) {         target = interceptor.plugin(target);    }    return target;  }

8.创建DefaultSqlSession,包含ConfigurationExecutor

在这里插入图片描述

9.返回DefaultSqlSession

总结:

DefaultSqlSessionsqlSession的实现类,里面包含了ExecutorConfigurationExecutor在这一步会被创建。

转载地址:http://mpwc.baihongyu.com/

你可能感兴趣的文章
MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
查看>>
mysql支持表情
查看>>
MySQL支撑百万级流量高并发的网站部署详解
查看>>
MySQL改动rootpassword的多种方法
查看>>
mysql数据分组索引_MYSQL之索引配置方法分类
查看>>
mysql数据取差,mysql屏蔽主外键关联关系
查看>>
MySQL数据和Redis缓存一致性方案详解
查看>>
MySQL数据和Redis缓存一致性方案详解
查看>>
Mysql数据库 InnoDB存储引擎中Master Thread的执行流程
查看>>
MySQL数据库 范式
查看>>
Mysql数据库B-Tree索引
查看>>
mysql数据库io空闲_mysql数据库磁盘io高的排查
查看>>
mysql数据库root密码忘记,查看或修改的解决方法
查看>>
MySQL数据库SQL注入靶场sqli通关实战(附靶场安装包)
查看>>
MYSQL数据库下载安装(Windows版本)
查看>>
MySQL数据库与Informix:能否创建同名表?
查看>>
mysql数据库中的数据如何加密呢?mysql8.0自带新特性
查看>>
MySQL数据库优化
查看>>
MySQL数据库优化总结
查看>>
MySQL数据库入门看这一篇文章就够了
查看>>