映射文件 包 含 多 种 二 级 节 点 , 比如 , , , 以 及<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("……"); } }
|
执行流程清晰明了