SqlSession 创建过程

单纯使用Mybatis进行数据库交互的时候,通过下面代码可以看到,我想过要创建SqlSession对象首先要解析配置文件,然后创建工厂通过工厂创建SqlSession对象


image.png

所以把创建Session的过程分解成下面三个部分

  • Configuration创建过程
  • SqlSessionFactory实例的创建过程
  • SqlSession实例化过程

创建Configuration

  • 描述Mybatis配置信息,例如<settings>标签配置的参数信息
  • 作为容器注册Mybatis其他组件,例如TypeHandler,MappedStatement等组件
  • 提供工厂方法,创建ResultSetHandler,StatementHandler,Executor等组件实例


    image.png

创建Configuration的时机是在SqlSessionFactoryBuilder对象的builder方法中进行的,Mybatis通过XMLConfigBuilder类的parse()方法完成Configuration对象的创建,接下来看一下XMLConfigBuilder的parse()方法。


image.png
image.png

在parse()方法中首先调用XPathParser对象的evalNode()方法获取XML配置文件中<configuration>节点对应的XNode对象,接着调用parseCofiguration()解析XNode对象中其它配置信息,在parseConfiguration()方法中,对于<configuration>标签的子节点都有一个单独的处理方法进行处理。

SqlSessionFactory创建过程

Mybatis中的SqlSession实例使用工厂模式创建,所以在创建SqlSession对象之前需要创建SqlSessionFactory工厂对象,然后调用SqlSessionFactory对象的openSession()方法进行创建SqlSession实例对象

在创建SqlSessionFactory对象之前,首先创建一个SqlSessionFactoryBuilder对象,然后以Mybatis主配置文件输入流作为参数,调用SqlSessionFactoryBuilder对象的builder方法创建SqlSessionFactory对象。


image.png

image.png

创建SqlSession实例

上面已经解析完了SqlSessionFactory实例的创建过程,通过Configuration作为参数创建了SqlSessionFactory的默认实现类DefaultSqlSessionFactory,SqlSession的创建时通过DefaultSqlSessionFactory调用openSession()方法创建的。接下来看下openSession()方法的实现


调用openSession.png

调用openSessionFromDataSource.png

通过ExecutorType和事务级别创建SqlSession.png

通过上面执行过程可以看出,首先通过Configuration对象获取Mybatis的配置文件的环境信息,然后根据配置中的事务管理器级别创建对应的事务管理器工厂。在Mybatis中存在两种事务管理器,JdbcTransaction和ManagedTransaction。JdbcTransaction表示事务使用Jdbc中的连接对象进行管理,ManagedTransaction表示事务由外部容器进行管理。
获取到主配置文件的环境信息和创建完事务管理器后,调用Configuration对象的newExecutor()方法,通过配置的类型创建对应的Executor对象,最后通过Executor、Configuration最为参数new了一个DefaultSqlSession对象。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。