Mybatis源码第一篇:sqlSessionFactory创建流程

 最近因为使用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查询数据库获取数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容