MyBatis源码分析篇---会话工厂SqlSessionFactory

1,341 阅读2分钟

1、源起

  • MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,简化我们的开发;
  • 所有的开源项目都会有自己的顶级域名,我们这里访问MyBatis的中文官网地址;
  • 中文官网地址

2、主要工作流程

3、 解析配置文件,参考下篇博文

4、创建会话工厂类SqlSessionFactory

  • 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

  • String resource = "mybatis-config.xml";//全局配置文件路径
    InputStream inputStream = Resources.getResourceAsStream(resource);//读取xml文件
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//构建会话工厂类
    
  • 基于以上代码我们查看分析源码

5、源码分析(以下源码基于mybatis-3.5.4

5.1 SqlSessionFactoryBuilder#build(InputStream)
  • 首先我们需要用SqlSessionFactoryBuilderbuild方法去构建SqlSessionFactory,如下图:
  • build方法中,在new XMLConfigBuilder中初始化了Configuration,这是至为重要的一个类,之后MyBatis解析的所有配置信息都会存储在这个类中;
5.2 new Configuration
  • 现在我们可以看下在new Configuration的时候做了什么操作;
  • 我们可以从下面的代码截图中看出,其实,他只是做了部分别名的存储;
5.3 XMLConfigBuilder#parse
  • 当我们再SqlSessionFactoryBuilderbuild方法中获取到了XMLConfigBuilder之后,调用了其parse()方法;
  • 而我们看到parse()方法中调用了parseConfiguration(XNode root)这个方法才是真正执行mybatis全局配置文件解析的方法。
  • parseConfiguration(XNode root)方法中解析了<properties>、配置节点<settings>、别名配置节点<typeAliases>、插件扩展<plugins>、对象工厂节点<objectFactory>、环境配置节点<environments>、类型处理器节点<typeHandlers>、映射器节点<mappers>等;
  • parse()执行配置文件解析后将配置信息保存至Configuration对象中。
  • 其中相对而言最需要我们关注的是:org.apache.ibatis.builder.xml.XMLConfigBuilder#mapperElement方法,初始化了MappedStatement对象,其中保存了映射文件等SQL执行所需的必要信息;可参考上一篇博文:初始化解析配置文件
  • 代码运行时序图

SqlSessionFactory

至此:已经获取到了会话工厂类实例SqlSessionFactory ,我们可以从会话工厂中获取session会话,从而操作数据库

结语

​ 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的,我们获取到了会话工厂类,就相当于拿到了制作操作数据库钥匙的机器,而我们现在只需要拿着这个机器去制造钥匙,然后去打开MyBatis 操作数据库的大门。