mybatis源码之加载session创建过程

String xml ="spring-mybatis.xml";
        Reader reader = Resources.getResourceAsReader(xml);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = build.openSession();

首先调用sqlSessionFactoryBuilder中的build方法去读取mybatis的配置文件,获得一个DefaultSqlSessionFactory。

 public SqlSessionFactory build(Reader reader) {
        return this.build((Reader)reader, (String)null, (Properties)null);
    }
  //真实的build方法
 public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
        SqlSessionFactory var5;
        try {
//通过XMLconfigBuilder来解析mybatis配置
            XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
            //关键部分在这里,调用了build方法返回了SqlSessionFactory对象
            var5 = this.build(parser.parse());
        } catch (Exception var14) {
            throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
        } finally {
            ErrorContext.instance().reset();

            try {
                reader.close();
            } catch (IOException var13) {
            }

        }

        return var5;
    }


//上面调用的build方法
public SqlSessionFactory build(Configuration config) {
        return new DefaultSqlSessionFactory(config);
    }

获得SqlSessionFactory之后,通过openSession方法来获得SqlSession对象。

public interface SqlSessionFactory {   
    SqlSession openSession();

上面说了,表面上我们使用的是SqlSessionFactory实际上,我们调用的是DefaultSqlSessionFactory中的openSession方法。

//DefaultSqlSessionFactory中的openSession方法
public SqlSession openSession() {
           //调用了openSessionFromDataSource方法
        return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
    }

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
        Transaction tx = null;

        DefaultSqlSession var8;
        try {
            Environment environment = this.configuration.getEnvironment();
            TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
            tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
            //表面上我们使用sqlSession执行sql,实际上,使用的是excutor执行, excutor是对于Statement的封装。    
            Executor executor = this.configuration.newExecutor(tx, execType);
            //关键,创建了一个DefaultSqlSession对象
            var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
        } catch (Exception var12) {
            this.closeTransaction(tx);
            throw ExceptionFactory.wrapException("Error opening session.  Cause: " + var12, var12);
        } finally {
            ErrorContext.instance().reset();
        }

        return var8;
    }

这样,我们就到了SqlSession对象了,就能执行sql语句了。

 

总结一下:

第一步,调用sqlSessionFactoryBuilder中的build方法去读取mybatis的配置文件,获得一个DefaultSqlSessionFactory。

解析mybatis文件是通过XMLconfigBuilder来实现的,通过调用XMLconfigrationBuilder对象的parse方法来调用parseConfiguration方法对mybatis文件中的各个节点和根节点进行解析。将解析完成的Configration丢给build方法去创建一个

DefaultSqlSessionFactory对象,返回完成操作。

第二步,获得SqlSessionFactory之后,通过openSession方法来获得SqlSession对象。上面提到,SqlSessionFactory得到实际是DefaultSqlSessionFactory,那么调用的openSession也是DefaultSqlSessionFactory对象的openSession方法。然后openSession方法调用openSessionFromDataSource方法来获取Environment 、TransactionFactory 、Executor 等对象属性,最后创建一个DefaultSqlSession对象返回。至此,SqlSession对象就创建完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值