Mybatis运行原理源码分析

运行中涉及到的类以及源码剖析

1.1 Resources:MyBatis 中 IO 流的工具类

Mybatis运行的第一步首先需要加载全局配置文件(参照Mybatis官网上的例子,就是mybatis-config.xml这个文件),加载配置文件利用了Resources的getResourceAsStream()方法,这个方法底层是去调用ClassLoaderWrapper类的getResourceAsStream()方法,具体往下自己研究,经过调用以后返回一个IO流InputStream对象。

1.2 SqlSessionFactoryBuilder():构建器

获得InputStream对象以后我们需要去获得SqlSessionFactory这个工厂对象,为了获得这个工厂对象我们这个需要用到SqlSessionFactoryBuilder类,进入这个类里面看,既没有给我们提供静态构造方法,也没有有参构造方法,只有重载了一个bulid()方法,具体看bulid方法,返回的是SqlSessionFactory这个工厂对象,于是我们创建SqlSessionFactoryBuilder类,接着调用bulid方法,传入参数。new SqlSessionFactoryBuilder().build(inputStream);

1.3 XMLConfigBuilder:MyBatis全局配置文件内容构建器类

我们这里来深入研究一下SqlSessionFactoryBuilder类的build方法,进入源码发现传入InputStream对象之后,需要用到XMLConfigBuilder这个类,这个类是干什么的?我们称它为全局配置文件内容的构建器,利用它将最终返回我们需要的SqlSessionFactory工厂对象的实现类DefaultSqlSessionFactory。

1.4 Configuration:封装了全局配置文件所有配置信息.

利用XMLConfigBuilder解析全局配置文件流,剖析源码,我们可以发现这里用到了XPathParser类,这个类帮助我们解析mybatis-config.xml文件中的根标签configuration,封装里面的子标签,然后通过XMLConfigBuilder类中的parseConfiguration方法一一解析里面的子标签,将所有的配置文件信息解析结果存放到Configuration中,将Configuration返回交给SqlSessionFactoryBuilder构建器的build方法,这个方法new一个DefaultSqlSessionFactory对象并返回。

1.5 DefaultSqlSessionFactory 是SqlSessionFactory接口的实现类

当完成了上面的步骤以后,我们操作SqlSessionFactory实际上就是操作DefaultSqlSessionFactory类,在DefaultSqlSessionFactory类里面,实现SqlSessionFactory中的方法openSession()其实就是在调用openSessionFromDataSource()方法。

1.6 Transaction:事务类、1.7 TransactionFactory:事务工厂

在openSessionFromDataSource()方法中,我们要用到一个事务对象Transaction,这个对象通过TransactionFactory事务工厂接收来自configuration的Environment类(存放环境变量)去实例化对象。

1.8 Executor:MyBatis 执行器

同时还要创建SqlSession的执行器Executor,这个执行器也是通过configuration去实例化的。

1.9 DefaultSqlSession 是 SqlSession 接口的实现类

最后,我们根据上面得到的配置信息、事务执行器去实例化DefaultSqlSession,将它传递给SqlSession接口。最后开发者根据项目需求去使用SqlSession接口中的API完成具体的事务操作。如果事务执行成功,将提交数据到数据库中commit(),关闭SqlSession连接,如果失败,抛出相关错误异常,回滚事务rollback()。

1.10 ExceptionFactory:MyBatis 中异常工厂

当产生异常时候,Mybatis提供了异常工厂也就是ExceptionFactory,通过它可以去构建出来自定义的异常信息。有助于开发者在遇到异常的时候能快速找到错误所在。

以上就是MyBatis的运行原理流程,下面贴出北京尚学堂培训的张佳明老师绘制的流程图帮助大家理解: