• 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. 下面是个简易的流程图

  • 相关阅读:
    Linux下安装配置SVN服务器,windows访问
    Zookeeper集群版搭建
    Zookeeper单机版启动
    Nginx-Session缓存一致性-memcached
    Nginx-配置多台Tomcat-反向代理
    Linux-tomcat-安装启动
    Linux-JDK-环境搭建安装
    Nginx-安装-运行访问页面
    Linux-虚拟机-克隆-学习
    解决CocosCreator 在微信小游戏中使用Socket.io 报错的问题
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/11885575.html
Copyright © 2020-2023  润新知