单纯使用Mybatis进行数据库交互的时候,通过下面代码可以看到,我想过要创建SqlSession对象首先要解析配置文件,然后创建工厂通过工厂创建SqlSession对象
所以把创建Session的过程分解成下面三个部分
- Configuration创建过程
- SqlSessionFactory实例的创建过程
- SqlSession实例化过程
创建Configuration
- 描述Mybatis配置信息,例如<settings>标签配置的参数信息
- 作为容器注册Mybatis其他组件,例如TypeHandler,MappedStatement等组件
-
提供工厂方法,创建ResultSetHandler,StatementHandler,Executor等组件实例
创建Configuration的时机是在SqlSessionFactoryBuilder对象的builder方法中进行的,Mybatis通过XMLConfigBuilder类的parse()方法完成Configuration对象的创建,接下来看一下XMLConfigBuilder的parse()方法。
在parse()方法中首先调用XPathParser对象的evalNode()方法获取XML配置文件中<configuration>节点对应的XNode对象,接着调用parseCofiguration()解析XNode对象中其它配置信息,在parseConfiguration()方法中,对于<configuration>标签的子节点都有一个单独的处理方法进行处理。
SqlSessionFactory创建过程
Mybatis中的SqlSession实例使用工厂模式创建,所以在创建SqlSession对象之前需要创建SqlSessionFactory工厂对象,然后调用SqlSessionFactory对象的openSession()方法进行创建SqlSession实例对象
在创建SqlSessionFactory对象之前,首先创建一个SqlSessionFactoryBuilder对象,然后以Mybatis主配置文件输入流作为参数,调用SqlSessionFactoryBuilder对象的builder方法创建SqlSessionFactory对象。
创建SqlSession实例
上面已经解析完了SqlSessionFactory实例的创建过程,通过Configuration作为参数创建了SqlSessionFactory的默认实现类DefaultSqlSessionFactory,SqlSession的创建时通过DefaultSqlSessionFactory调用openSession()方法创建的。接下来看下openSession()方法的实现
通过上面执行过程可以看出,首先通过Configuration对象获取Mybatis的配置文件的环境信息,然后根据配置中的事务管理器级别创建对应的事务管理器工厂。在Mybatis中存在两种事务管理器,JdbcTransaction和ManagedTransaction。JdbcTransaction表示事务使用Jdbc中的连接对象进行管理,ManagedTransaction表示事务由外部容器进行管理。
获取到主配置文件的环境信息和创建完事务管理器后,调用Configuration对象的newExecutor()方法,通过配置的类型创建对应的Executor对象,最后通过Executor、Configuration最为参数new了一个DefaultSqlSession对象。