美文网首页
Mybatis源码第一篇:sqlSessionFactory创建

Mybatis源码第一篇:sqlSessionFactory创建

作者: cjp1016 | 来源:发表于2018-04-19 11:26 被阅读0次

     最近因为使用spring-boot整合mybatis出现了一系列的小问题,而且看到网上有很多解析Mybatis的源码文章。网络上也有两本书:《深入浅出Mybatis技术原理与实战》,《Mybatis从入门到精通》

    网络博客地址:Mybatis源码分析 、Mybatis系列


    纸上得来终觉浅,绝知此事要躬行

    于是开启了我的Mybatis源码分析和笔记之路,以目前最新的Mybats3.4.6源码。于是根据源代码追踪,得出以下时序图(画的肯定不怎么好,因为不专业)

    mybatis加载xml时序图

    我看着这种图,感觉都懵了。还是得用文字解释下。Mybatis解析xml生成SqlSessionFactory解析说明

    当单独引入mybatis的jar包时,采用读取mybatis-config.xml配置文件,创建SqlSessionFactory 

    创建sqlSessionFactory入口

    1:SqlSessionFactoryBuilder.build() 方法详解

    创建sqlSessionFactory详解

    这个build是个多态方法,有两种方式读取xml解析,java.io下面两个抽象类,InputStream(字节流)和Reader(字符流),使用Reader读取出来的是char数组或者String,使用InputStream读取出来的是byte数组。

    创建sqlSessionFactory详解2

    2:XMLConfigBuilder类解析

    从build方法中看到XMLConfigBuilder类,从类名得知是mybatis的config建造类。继承了抽象类:BaseBuilder

    这个类的public方法是7个,其中有6个构造方法,1个parse解析方法

    XMLConfigBuilder解析

    具体看下构造方法和解析。1.设置XPathparser解析,2.使用构造方法使用了super关键字,采用的是基类BaseBuilder的构造方法,初始化Configuration类。3.解析xml的configuration节点。

    XMLConfigBuilder核心方法

    通过上述代码,得知mybatis解析xml采用的是xpath方式,使用了基类BaseBuilder共享Configuration类信息。最后解析xml的configuration配置返回最终的Configuration对象,给SqlSessionFactoryBuilder类,进行创建SqlSessionFactory。new DefaultSqlSessionFactory(config);形成了一个闭环。因此重点在于XMLConfigBuilder的解析方法。

    后面开启Session,执行的入口就是从DefaultSqlSessionFactory开始,下一篇着重分析。

    3:BaseBuilder基类解析

    为啥要分析这个类,因为这个类是XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、XMLScriptBuilder等所有类的基类。因此非常重要!!!

    BaseBuilder基类和所有父类概况

    比较简单,公开的就两个方法,一个构造方法,一个是获取Configuration。三个重要属性:

    Configuration :mybatis核心配置类

    TypeAliasRegistry:mybatis的别名依赖注册类

    TypeHandlerRegistry:mybatis类型处理注册类

    其他方法:创建对象实例,返回依赖的类,类型处理器

    BaseBuilder的其他方法

    4:XMLConfigBuilder核心方法parseConfiguration

    继续回来XMLConfigBuilder类,核心方法:parseConfiguration(parser.evalNode("/configuration"));这个函数作用非常重要,先解析xml的configure配置,分别是:读取properties数据库配置、解析settings节点,加载VFS实现,类别名加载,插件加载,设置databaseId(多数据库支持),类型映射处理器。

    XMLConfigBuilder核心方法parseConfiguration

    1.Environment 数据库环境,采用建造者模式构建。里面有数据库配置信息

    Environment 对象创建

    2.Interceptor:拦截器插件,实现分页拦截

    拦截器

    3.DatabaseIdProvider:数据库供应商id解析,mysql,oracle动态个性化语句

    datasourceId

    4.核心解析:XMLMapperBuilder解析mapper节点信息。

    XMLMapperBuilder解析

    5:XMLMapperBuilder类

    这个类的使用有点类似XMLConfigBuilder的构造,解析过程。

    XMLMapperBuilder构造方法和parse

    MapperBuilderAssistant类和核心方法configurationElement(XNode context)

    configurationElement

    涉及到解析resultMap节点,sql节点,select|insert|update|delete节点。

    parameterMap resultMap sql片段

    核心是:buildStatementFromContext,引出了XMLStatementBuilder类

    XMLStatementBuilder

    5:XMLStatementBuilder类

    也是BaseBuilder的子类,同样的构造方式,同样的解析语句节点。

    1 2

    核心方法langDriver.createSqlSource,引出来:XMLLanguageDriver来生成SqlSource

    @Override

    public SqlSource createSqlSource(Configuration configuration, XNode script, Class parameterType) {

    XMLScriptBuilder builder =new XMLScriptBuilder(configuration, script, parameterType);

    return builder.parseScriptNode();

    }

    得出sql语句的解析流程

    6:XMLScriptBuilder解析sql语句

    XMLScriptBuilder

    核心方法:MixedSqlNode parseDynamicTags(XNode node)

    动态标签

    7.SqlNode接口解析

    动态标签:if、where、foreach等动态标签解析

    SqlNode接口实现 SqlNote


    8:DynamicContext类

    采用ognl表达式

    dynamicContext

    9:GenericTokenParser和TokenHandler

    通用标记解析器和标记处理器,通用标记解析器处理的是SQL脚本中#{parameter}、${parameter}参数,根据给定TokenHandler(标记处理器)来进行处理,TokenHandler是标记真正的处理器

    标记处理器

    最终得到Configuration类,生成:DefaultSqlSessionFactory类

    第二篇重点分析,创建session查询数据库获取数据

    相关文章

      网友评论

          本文标题:Mybatis源码第一篇:sqlSessionFactory创建

          本文链接:https://www.haomeiwen.com/subject/nqzymttx.html