映射文件 包 含 多 种 二 级 节 点 , 比如  ,  以 及<select|insert|update|delete>等。除此之外,还包含了一些三级节点,比如等。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<mapper namespace="xyz.coolblog.dao.AuthorDao">
<cache/>

<resultMap id="authorResult" type="Author">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- ... -->
</resultMap>

<sql id="table">
author
</sql>

<select id="findOne" resultMap="authorResult">
SELECT
id, name, age, sex, email
FROM
<include refid="table"/>
WHERE
id = #{id}
</select>

<!-- <insert|update|delete/> -->
</mapper>

这是一个比较简单的映射文件,还有一些的节点未出现在上面。解析逻辑都封装在了相应的方法中,这些方法由 XMLMapperBuilder 类的configurationElement 方法统一调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void configurationElement(XNode context) {
try {
// 获取 mapper 命名空间
String namespace = context.getStringAttribute("namespace");
if (namespace == null || namespace.equals("")) {
throw new BuilderException("……");
}
// 设置命名空间到 builderAssistant 中
builderAssistant.setCurrentNamespace(namespace);
// 解析 <cache-ref> 节点
cacheRefElement(context.evalNode("cache-ref"));
// 解析 <cache> 节点
cacheElement(context.evalNode("cache"));
// 已废弃配置,这里不做分析
parameterMapElement(context.evalNodes("/mapper/parameterMap"));
// 解析 <resultMap> 节点
resultMapElements(context.evalNodes("/mapper/resultMap"));
// 解析 <sql> 节点
sqlElement(context.evalNodes("/mapper/sql"));
// 解析 <select>、...、<delete> 等节点
buildStatementFromContext(
context.evalNodes("select|insert|update|delete"));
} catch (Exception e) {
throw new BuilderException("……");
}
}

执行流程清晰明了