上一篇文章分析了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程序员日常学习笔记,如理解有误欢迎各位交流讨论!

解析xml_Mybatis中mapper的xml解析详解相关推荐

  1. mysql映射mapper_Mybatis中Mapper映射文件使用详解

    紧接上文所述,在这篇文章中我将对Mapper映射文件进行详细的说明. Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看 ...

  2. mapper注解的主要作用_Mybatis中mapper的xml解析详解

    上一篇文章分析了mapper注解关键类MapperAnnotationBuilder,今天来看mapper的项目了解析关键类XMLMapperBuilder. 基础介绍 回顾下之前是在分析config ...

  3. python accept解析_python中requests库使用方法详解

    一.什么是Requests Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库.它⽐ urllib 更加⽅便,可以节约我们⼤量的 ...

  4. linux端口解析,linux中查看和开放端口详解

    装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理.于是请教百度大神,在费一番周折后,总结步骤如下: 1.修改文件/etc/sysconfig/iptables [[email prote ...

  5. python中getitem_Python类中方法getitem和getattr详解

    1.getitem 方法 使用这个方法最大的印象就是调用对象的属性可以像字典取值一样使用中括号['key'] 使用中括号对对象中的属性进行取值.赋值或者删除时,会自动触发对应的__getitem__. ...

  6. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

       本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...

  7. php xml 实例教程,php解析xml方法实例详解,解析xml实例详解_PHP教程

    php解析xml方法实例详解,解析xml实例详解 本文以实例形式详细讲述了php解析xml方法.分享给大家供大家参考.具体分析如下: books.xml文件如下: Harry Potter J K. ...

  8. resultmap的写法_mybatis的mapper.xml中resultMap标签的使用详解

    1.前言 最近博主在做一个ssm框架的共享汽车管理系统,其中,数据库字段设计的有下划线方式,a_username,然后在写mapper.xml里面的sql语句的时候,一直出现查询语句查询的值为null ...

  9. Java中四种XML解析技术之不完全测试

    Java中四种XML解析技术之不完全测试 <script language=javascript src=""></script> 在平时工作中,难免会遇到 ...

最新文章

  1. 单板计算机倍受欢迎 廉价的ARM计算机能干嘛
  2. 成功解决for循环语句中,后几次循环输出数据一直全部为空
  3. 阿云搭建php博客,阿云的应聘故事
  4. Python介绍与特点(自学python知识整理)
  5. Activiti6.0教程 Eclipse安装Activiti Diagram插件(一)
  6. 博客园贵团队可以给个解释么?
  7. mysql多数据源切换_CI 多数据库操作 切换数据库
  8. 中国条码解码器市场趋势报告、技术动态创新及市场预测
  9. python处理excel表格-Python读写Excel表格(简单实用)
  10. 将已发送的短信写入短信数据库
  11. 华为云备份会上传私密相册吗_华为、小米都是国产手机,为啥文件夹却是“英文”?哪些能删除?...
  12. 如何结束vbs的代码
  13. 变频器压频比的正确设置方法
  14. 常见的windows蓝屏代码查询及处理
  15. LeetCode常见报错解释
  16. Endnote IEEE TRANSACTIONS ON INDUSTRIAL ELECTRONICS/TIE/TPEL 参考文献格式模板
  17. JAVA 获取零时区时间
  18. MusicTools下载 v3.4.0 全网免费无损音乐下载器
  19. 《GRACE: Gradient Harmonized and Cascaded Labeling for Aspect-based Sentiment Analysis》阅读笔记
  20. 浅谈电动汽车V2G系统中的漏电问题

热门文章

  1. 使用Apex进行混合精度训练
  2. miniui展示日历能点击_2020年日历设计,除了366天有新字体,还有新形式
  3. php项目实战流程_一个完整的php流程管理实例代码分享
  4. thymealf 高级用法_Thymeleaf
  5. easyui java管理系统_EasyUI 后台管理系统
  6. 【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入
  7. Ambari系统架构
  8. 移动站应该尝试百度MIP的五个原因
  9. Android4.0设置界面修改总结
  10. 自建CDN Xnign产品指标