zoukankan      html  css  js  c++  java
  • mybatis源码分析之03SqlSession的创建

    在上一篇中,说到了mybatis是如何构造一个SqlSessionFactory实例的,顾名思意,SqlSessionFactory就是用于创建SqlSession的工厂类。

    好,现在我们接着昨天的来,mybatis框架解析完xml配置文件之后,将其封装成一个Configuration实例,然后,SqlSessionFactory拿着这个Configuration实例,就可以创建SqlSession了。mybatis框架中,默认的实现是DefaultSqlSessionFactory。

    下来,我们跟着源码来逐步分析, 还是从测试代码开始走起。

     测试代码

    public class V1Test {
        public static void main(String[] args) {
            try (InputStream is = Resources.getResourceAsStream("mybatis-config.xml")) {
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
                SqlSession sqlSession = sqlSessionFactory.openSession(true);
                FemaleMapper femaleMapper = sqlSession.getMapper(FemaleMapper.class);
                Female female = femaleMapper.getFemaleById(1);
                System.out.println(female);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    前面已经分析了SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is)这一行代码了, 今天咱们从SqlSession sqlSession = sqlSessionFactory.openSession(true)这一行代码说起。

    (1) DefaultSqlSessionFactory.java

    这一行代码上戳个断点,debug启动测试代码,很是直观的看到sqlSessionFactory的真实类型就是DefaultSqlSessionFactory类型,跟代码,就会看下面这段核心代码,

    代码的具体功能,注释已说明了。

      private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
        Transaction tx = null;
        try {
          // Environment 封装了数据库相关的信息
          final Environment environment = configuration.getEnvironment();
          // 事务工厂类
          final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
          // 新建一个事务
          tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
          // 创建一个执行器,就是它与底层数据库打交道,CRUD,提交事务,回滚事务啥的
          final Executor executor = configuration.newExecutor(tx, execType);
          // 创建一个SqlSession,并返回
          return new DefaultSqlSession(configuration, executor, autoCommit);
        } catch (Exception e) {
            
      }

    mybatis构造SqlSession对象就这么几步,还是很简单的。

    总结:

    1. mybatis默认使用DefaultSqlSessionFactory工厂来创建SqlSession对象

    2. mybatis从configuration对象中拿到数据库相关的环境信息,然后构造一个合适的事务工厂类,默认是JdbcTransactionFactory, 由于创建connection事务

    3. mybatis 会构造一个Executor执行器,使用它与数据库打交道。

    4. SqlSession持有了一个Executor实例,可以理解为对Executor功能的增强,有些装饰模式的意思吧!

    5. 下面是个简易的流程图

  • 相关阅读:
    第十三周作业
    第十二周作业2
    第十二周作业
    第十一次作业
    第十周作业
    第九周作业
    第十五次作业
    十四周上机作业
    第十三周上机作业
    第十二周作业
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/11885575.html
Copyright © 2011-2022 走看看