MyBatis--解析器模块
解析器模块概述
解析器模块 对应着 parsing 包
解析器模块,主要提供了两个功能
- 对XPath进行封装,为MyBatis初始化时解析mybatis - config.xml 配置文件以及映射配置文件提供支持
- 对了处理动态 sql 语句中的占位符提供支持
XPathParser
基于 Java XPath 解析器,用于解析 MyBatis mybatis-config.xml 和 **Mapper.xml 等 XML 配置文件
//XPathParser.java
// XML Document 对象
private final Document document;
// 是否检验
private boolean validation;
// XML 实体解析器
private EntityResolver entityResolver;
// 变量 Properties 对象
private Properties variables;
// 变量 XPaht对象
private XPath xpath;
- document:XML 被解析后,生成的 org.w3c.dom.Document 对象
- validation:是否校验 XML 一般为true
- entityResolver :XML 实体解析器。默认情况下,对 XML 进行校验时,会基于 XML 文档开始位置指定的 DTD 文件或 XSD 文件
- variables :变量 Properties 对象,用来替换需要动态配置的属性值
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
variables 的来源,即可以在常用的 Java Properties 文件中配置,也可以使用 MyBatis的 < property /> 标签中配置
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
- xpath : 用于查询 XML 中的节点和元素
构造方法
XPathParser 有16个构造方法
// XPathParser.java
/*
@param xml 文件地址
@param validation 是否检验XML
@param variables 变量 Properties 对象
@param entityResolver XML 实体解析器
*/
public XPathParser(String xml, boolean validation, Properties variables, EntityResolver entityResolver) {
// 公用的构造方法
commonConstructor(validation, variables, entityResolver);
// 将 XML 文件解析成 Document 对象
this.document = createDocument(new InputSource(new StringReader(xml)));
}
private void commonConstructor(boolean validation, Properties variables, EntityResolver entityResolver) {
this.validation = validation;
this.entityResolver = entityResolver;
this.variables = variables;
// 创建 XPathFactory 对象
XPathFactory factory = XPathFactory.newInstance();
this.xpath = factory.newXPath();
}
private Document createDocument(InputSource inputSource) {
// important: this must only be called AFTER common constructor
// 只能在公共构造函数之后调用
try {
// 创建 DocumentBuilderFactory 对象
// 用于创建DOM模式的解析器对象DocumentBuilderFactory是一个抽象工厂类,它提供了一个newInstance方法
// 这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
// 设置是否验证 XML
factory.setValidating(validation);
factory.setNamespaceAware(false);
factory.setIgnoringComments(true);
factory.setIgnoringElementContentWhitespace(false);
factory.setCoalescing(false);
factory.setExpandEntityReferences(true);
// 创建 DocumentBuilder 对象
DocumentBuilder builder = factory.newDocumentBuilder();
builder.setEntityResolver(entityResolver); // 设置实体解析器
builder.setErrorHandler(new ErrorHandler() {