网站首页 > 精选教程 正文
上一篇文章分析了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程序员日常学习笔记,如理解有误欢迎各位交流讨论!
- 上一篇: Java中toString该如何转json呢?
- 下一篇: 一个高效的Java对象映射库Orika
猜你喜欢
- 2024-12-26 Mybatis配置文件XML全貌详解,再不懂我也没招了
- 2024-12-26 【预警通报】关于Xstream存在多个高危漏洞的预警通报
- 2024-12-26 一文了解 Maven 的 settings.xml 配置文件
- 2024-12-26 MyBatis 入门教程-配置MyBatis XML映射文件
- 2024-12-26 MyBatis-XML配置教程,这也太详细了吧
- 2024-12-26 Java对接微信、支付宝、银联第三方支付
- 2024-12-26 JAVA导出EXCEL表格
- 2024-12-26 Java对象的序列化与反序列化
- 2024-12-26 Java对象实例化的7种方式
- 2024-12-26 5、请介绍一下 XMLHTTPrequest 对象及常用方法和属性(必 会)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)