浅谈Mybatis的生命周期
首先我们从官方文档里面可以看到的是SqlSessionFactoryBuilder使用build来创建SqlSessionFactory,然后SqlSessionFactory再使用openSession开启一个会话连接来创建SqlSession对吧。但是过程并没有那么简单。
首先我们来看一下SqlSessionBuilder有什么方法
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)
这些方法其实说白了就是在加载xml文件,也就是说我们在创建SqlSessionFactory对象之前的时候需要读取我们创建的mybatis-config的配置文件。我们是使用这个类来进行一个剖析xml的
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
var5 = this.build(parser.parse());
这里的parser.parse()其实就是在解析xml文件,它返回的是一个Configuration对象,而这个对象非常重要,我们需要通过它来读取和检查配置文件的信息,还有定位接口的位置啊,调用接口方法。还有就是创建代理类对象等。
我们获取configuration对象之后,就调用了SqlSessionFactoryBuilder的第二个重载方法来创建SqlSessionFactory对象。
然后就来到第二阶段了
我们的SqlSessionFactory就要通过它的方法openSession来创建SqlSession对象。但是,在创建之前,它需要做的是把jdbc环境信息(其实就是我们用的是mysql还是oracle或者其他数据库,都是通过environment的信息来注入java类对象里面的)的注入,这里其实也包括对数据库的连接,连接池的创建等,然后就是创建事务,创建执行器(其实就是执行语句的一些策略,比如batch这种先打包好多个sql再提交上去)。所以说sqlSession是非常强大的。如果我们需要事务自动提交可以在openSession的重载方法上面加上true。
Environment environment = this.configuration.getEnvironment();
TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
Executor executor = this.configuration.newExecutor(tx, execType);
var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
最后当我们获取mapper之后执行完sqlSession是要立刻关闭的,然后把资源释放。
既然讲到了生命周期,当然也需要讲一下他们的域,也就是可执行的域。通常sqlSession是的域就是在方法域里面,我们在测试方法或者说执行完一个业务之后就需要关闭SqlSession了,而SessionFactory的域是一个全局的域,也就是说它从程序的头到尾都一直存在,为什么呢?因为它需要连接数据库,我们不可能把它关闭了,然后下次又调用,这样耗时耗资源。特别用户多的时候。SqlSessionFactoryBuilder也是方法域,用完就关闭了,后面就没什么用了。
总的来说Mybatis的工具类既是工具类,也很好的描述了Mybatis的生命周期。