涉及到的类包括:
MapperBuilderAssistant:Mapper文件解析辅助类,包括了解析各种节点的方法。
BaseBuilder:XMLMapperBuilder与MapperBuilderAssistant的父类,保存了Configuration、TypeAliasRegistry、TypeHandlerRegistry三个属性。
TypeAliasRegistry:别名对应关系,保存了字符串与类的对应信息,例如“String”字符串对应 String.class
TypeHandlerRegistry:注册java.lang与java.sql类型对应关系
Configuration:Mapper文件解析节点完成后,存储解析后的属性信息。
XMLStatementBuilder:解析SQL语句节点类,解析后存储在Configuration下的mappedStatements属性
XMLMapperBuilder用于解析Mapper文件,包括namespace、parameterMap、resultMap以及各种SQL(insert/uppdate/delete/select)
解析过程中主要是parse()方法,
解析Mapper文件后会存储在MapperBuilderAssistant以及它父类BaseBuilder的实例下,主要是Configuration类
private final MapperBuilderAssistant builderAssistant;
构造方法 //第一个参数是Mapper.xml的InputStream输入流 //第二个参数是配置信息 //第三个参数是Mapper.xml资源位置信息 //第四个参数是从Mapper.xml解析出来的XML片段 public XMLMapperBuilder(InputStream inputStream, Configuration configuration, String resource, Map<String, XNode> sqlFragments) { this(new XPathParser(inputStream, true, configuration.getVariables(), new XMLMapperEntityResolver()), configuration, resource, sqlFragments); }
解析方法: public void parse() { //判断Mapper文件是否已经加载过 if (!configuration.isResourceLoaded(resource)) { //解析Mapper文件 configurationElement(parser.evalNode("/mapper")); configuration.addLoadedResource(resource); bindMapperForNamespace(); } parsePendingResultMaps(); parsePendingCacheRefs(); parsePendingStatements(); }
//解析Mapper文件方法: (解析后的大部分内容都存储在MapperBuilderAssistant-》BaseBuilder-》Configuration对象中 Configuration类下的属性: ) 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); //解析cache-ref节点 cacheRefElement(context.evalNode("cache-ref")); //解析cache节点 cacheElement(context.evalNode("cache")); //解析parameterMap节点 parameterMapElement(context.evalNodes("/mapper/parameterMap")); //解析resultMap节点 resultMapElements(context.evalNodes("/mapper/resultMap")); //解析sql节点 sqlElement(context.evalNodes("/mapper/sql")); //解析select|insert|update|delete节点 buildStatementFromContext(context.evalNodes("select|insert|update|delete")); } catch (Exception e) { throw new BuilderException("Error parsing Mapper XML. The XML location is '" + resource + "'. Cause: " + e, e); } }