[MyBatis源码分析 - 解析器模块]
解析器模块的作用是解析XML文件,虽然mybatis全局配置和SQL Mapper配置都可以使用类注解方式配置,并且在一些功能上使用类配置更方便,但是从总体上看可读性、可维护性没有使用XML好,所以还是提倡用XML配置,解析器模块就为XML文件的解析提供了底层支持。
一、功能概要
解析器模块,主要提供了两个功能:
1、解析XML文件:包括mybatis全局配置文件和SQL Mapper映射文件
2、处理占位符:包括普通变量占位${}
和SQL语句需要经过预编译的变量占位#{}
二、XPathParser
该类的类图如下所示:
该类封装了加载XML文件生成的Document
对象,并封装了使用javax.xml.xpath.XPath
对象对Document
对象中的DOM节点进行操作的方法,XPathParser
的详细源码分析见:[MyBatis源码详解 - 解析器模块 - 组件二] XPathParser
三、XNode
mybatis将XML文档加载成Document对象后,每个XML标签节点就对应一个org.w3c.dom.Node
对象,为了方便处理Node
对象,mybatis封装了XNode
对象,对外提供的方法主要有:
- 1、获取节点数据、节点路径
- 2、获取节点、子节点属性集合
- 3、获取唯一表示节点的识别码
- 4、从节点树上下层节点获取的层面:获取父节点、获取子节点列表
- 5、
get*Attribute()
方法族:获取节点属性值,并将其转化为其他数据类型 - 6、
get*Body()
方法族:获取节点数据,并将其转化为其他数据类型 - 7、
eval*()
方法族:调用XPathParser方法在当前节点下寻找符合表达式条件的节点
XNode
的源码解析详见:[MyBatis源码详解 - 解析器模块 - 组件一] XNode
四、PropertyParser
由于在XML配置文件中,经常使用变量占位来动态配置变量属性值,如下所示:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
这些变量通过mybatis-config.xml
的<properties>
标签引入,引入的方式可以是properties文件,或者定义<property>
子标签,如下所示:
<properties resource="jdbc.properties"/>
<properties>
<property name="database.driver" value="com.mysql.jdbc.Driver"/>
<property name="database.url" value="jdbc:mysql://localhost:3306/chapter4"/>
<property name="database.username" value="root"/>
<property name="database.password" value="root"/>
</properties>
当解析的属性值是一个变量占位时,就需要调用PropertyParser
去解析对应的值,PropertyParser
封装了org.apache.ibatis.parsing.GenericTokenParser
,解析占位变量名主要由该类完成,例如将上述的的username
、password
解析出来,PropertyParser
的静态方法parse(String string, Properties variables)
会传入一个variables
参数(对应上面的<properties>
标签的内容),解析出来的变量就从该参数中获取对应的参数值root
、root
。
mybatis允许多个变量占位来赋予同一个变量值如:${username}_${password}
,最终解析出来的值就是:root_root
,除此之外还要带转义符等情况,源码详情见:[MyBatis源码详解 - 解析器模块 - 组件三] PropertyParser。