Mybatis中mapper的xml解析详解

上一篇文章分析了mapper注解关键类MapperAnnotationBuilder,今天来看mapper的项目了解析关键类XMLMapperBuilder。

基础介绍

回顾下之前是在分析configuration的初始化过程,已经进行到了最后一步mapperElement(root.evalNode("mappers")),这个方法里有两种解析mapper的方法,一种是解析类,一种是解析xml文件,上一篇文章在讲解析类中的注解,今天说到的就是解析xml的流程,关键代码如下:

解析mapper有4种情况可以分成根据类解析和根据xml文件解析两类,这次是后面这类,主体方法还是比较简单。

首先根据inputStream,configuration, resource或url,configuration.getSqlFragments()四个参数初始化一个XMLMapperBuilder;

然后执行XMLMapperBuilder对象的parse方法;

初始化XMLMapperBuilder

初始化过程源码已在上图的右侧部分,初始化XMLMapperBuilder方法的流程与加载mybatis的配置文件关键类XMLConfigBuilder及其相似,都是通过xml文件创建XPathParser对象作为XMLMapperBuilder对象的parse属性。最后执行parse方法去解析xml文件内容。

实际上XMLMapperBuilder与XMLConfigBuilder都继承BaseBuilder类,通过名字也可以看出来他们采用的是构建者模式,在结合他们的使用流程就能够更加理解mybatis采用构建者模式对不同的xml解析过程

在初始化方法中又出现了一个关键类MapperBuilderAssistant,这个在上一篇分析MapperAnnotationBuilder类是发现MapperAnnotationBuilder解析了所有的注解然后把解析的内容给到MapperBuilderAssistant对象,然后通过MapperBuilderAssistant对象生成的对象具体sql的MappedStatement对象。

这里可以大胆猜测XMLMapperBuilder应该也是一样,解析出xml中所有信息然后给到MapperBuilderAssistant去生产MappedStatement对象

XMLMapperBuilder和MapperAnnotationBuilder都是工具人,MapperBuilderAssistant才是真正生成MappedStatement对象的类

parse方法

parse方法比较简单在上图中也已经把源码贴出来了,主要分四步:验证重复加载、加载mapper节点并解析、绑定名称空间、解决未处理的方法。

第一三步比较简单就不在详细说了,而第四步是也就是parse方法最后三行代码,他的主要作用是解决在第二步解析mapper时不能处理的一些数据进行处理,代码比较简单不在详细分析了,源码如下:

configurationElement方法

可以看出来最最关键的方法还是parse方法的configurationElement方法,他才是真正解析mapper.xml的方法,方法源码如下图:

方法比较简单,就是读取对应节点的数据,进行解析,重点是调用的这些解析方法,可以看到一些我们平时最常见的比如mapper节点上的namespace属性,还有常见的resultMap节点、sql节点等。

这里我简单点就只看最后一行解析具体的select|insert|update|delete节点的方法,因为他们对应的就是我们具体的sql了。根据上图可以看到获取所有的这类节点,然后遍历生成了一个XMLStatementBuilder的对象并执行parseStatementNode方法。接下来来看XMLStatementBuilder类。

XMLStatementBuilder类

XMLStatementBuilder的源码如下图:

XMLStatementBuilder与XMLMapperBuilder一样都是继承BaseBuilder类,它的XNode类型属性context对应mapper文件中一个select、update等节点。初始化方法没什么说的,主要看parseStatementNode方法,上图中已经截图一部分,剩下部分如下图:

parseStatementNode方法并不复杂,都是在读取context的数据,主要是最后圈出来的代码,和上一篇解析MapperAnnotationBuilder类最后调用的是同一方法。

前面猜错了啊,XMLMapperBuilder连工具人都算不上,XMLStatementBuilder才算生成MappedStatement的工具人。不过仔细一想也是对的,XMLMapperBuilder对应的是一个mapper.xml文件,而要生成的MappedStatement对应的是具体的一条CRUD语句,一个xml是包含多条CRUD语句的。

总结

一个XMLMapperBuilder对应一个mapper.xml文件,而XMLMapperBuilder能够从xml文件中获取多个CRUD语句对应的节点,每个节点对应生成一个XMLStatementBuilder对象,XMLStatementBuilder解析节点中所有信息后与MapperAnnotationBuilder解析出注解中包含的信息一样交给MapperBuilderAssistant去生成一个MappedStatement。

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

(0)

相关推荐

  • spring与mybatis整合详解

    spring与mybatis整合详解 在数据库dbmis中创建student表: 建立Maven项目,创建Dao层,POJO层,Controller层,并配置Mapper.applicationCon ...

  • Mybatis中mapper相关注解解析类详解

    上一篇文章分析发现解读mapper关键是两个类MapperAnnotationBuilder和XMLMapperBuilder,今天先来看MapperAnnotationBuilder. 基础介绍 根 ...

  • (三)MyBatis从入门到入土——使用详解

    MyBatis使用详解 上篇我们手动开发了一个MyBatis项目,但是我们仅仅是编写了代码,对于整个项目是如何运行以及每个代码的意义都没有仔细的分析和说明,那么接下来我们就开始分析每个代码的意义以及如 ...

  • 排列组合中的“分组分配”问题详解

    高中史地政 高中文综历史,地理,政治三大学科学习公众号,专为高中文综服务 5篇原创内容 Official Account 不同种元素 分组问题 将n个不同元素按照某些条件分成k组,称为分组问题.分组问 ...

  • 八字神煞空亡解析详解,在四柱的意义解析

    八字神煞包括有哪些?八字神煞空亡解析内容如何?八字神煞中有神和煞,神表示吉,而煞表示凶.神煞当中有天赦.金匮.铁扫.外桃花.内桃花.正桃花等等.空亡是八字神煞之一,其原名是叫做旬空,空的意思就是无,没 ...

  • 透视干货!先码!!手绘街景中透视原理及画法详解 !

    透视干货!先码!!手绘街景中透视原理及画法详解 !

  • 人防工程施工过程中常见问题汇总(图文详解)

    人防工程施工过程中常见问题汇总(图文详解)

  • 每日中考题2020-09-25补推详解篇

    题目 分享这道题是因为前两天学生在解这道题的时候不明白第二小问的范围的存在性和恒成立问题,这个到以后高中数学的难题会经常遇到,如果不能准确判断是哪一种,那么肯定就会出错.所以今天这道题希望同学们能够记 ...

  • AUTOSAR中CAN通信协议栈配置详解

    AUTOSAR的通信协议栈是由BSW通信服务,通信硬件抽象和通信驱动程序组成. 图1 AUTOSAR 通信协议栈的组件 COM模块 AUTOSAR COM是位于RTE和PduR之间的服务层模块,主要用 ...

  • 历代佛画名作中菩萨像的画法详解

    菩萨为何低眉? 金刚怒目,所以降服四魔: 菩萨低眉,所以慈悲六道. --弘一法师 佛教,尤其是大乘佛教,最显著的特点是其菩萨思想. 菩萨,是梵文音译"菩提萨埵"的略称,意思是使众生 ...