ResultMap的解析入口
由前面的文章分析,mapper文件的解析都是有XMLMapperBuilder完成的。
public void parse() {
if (!configuration.isResourceLoaded(resource)) {
//是否加载过此资源
configurationElement(parser.evalNode("/mapper"));
configuration.addLoadedResource(resource);//把加载过的资源放到Configuration的LoadedResource Set里面,标识加载过此资源
bindMapperForNamespace();
}
parsePendingResultMaps();
parsePendingCacheRefs();
parsePendingStatements();
}
/**
* 解析mapper的配置项
* 1、解析名称空间
* 2、解析cache-ref元素,并把Cache赋给MapperBuilderAssistant
* 3、解析cache元素,并把Cache赋给MapperBuilderAssistant
* 4、当2中元素都存在的时候,以Cache元素为主
* 5、解析parameterMap(不推荐使用,未来可能废弃)
*
* @param context
*/
private void configurationElement(XNode context) {
try {
String namespace = context.getStringAttribute("namespace");//得到名称空间
if (namespace == null || namespace.equals("")) {
throw new BuilderException("Mapper's namespace cannot be empty");
}
builderAssistant.setCurrentNamespace(namespace);//将名称空间赋给辅助对象
cacheRefElement(context.evalNode("cache-ref"));
cacheElement(context.evalNode("cache"));
parameterMapElement(context.evalNodes("/mapper/parameterMap"));
resultMapElements(context.evalNodes("/mapper/resultMap"));
sqlElement(context.evalNodes("/mapper/sql"));
buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
} catch (Exception e) {
throw new BuilderException("Error parsing Mapper XML. Cause: " + e, e);
}
}
由上面的代码可知,resultMap的解析主要有resultMapElement方法完成
resultMapElement
private ResultMap resultMapElement(XNode resultMapNode, List<ResultMapping> additionalResultMappings) throws Exception {
ErrorContext.instance().activity("processing " + resultMapNode.getValueBasedIdentifier());
//得到resultMap的id
String id = resultMapNode.getStringAttribute("id",
resultMapNode.getValueBasedIdentifier());
//得到resultMap的类型
String type = resultMapNode.getStringAttribute("type",
resultMapNode.getStringAttribute("ofType",
resultMapNode.get