MyBatis的SQL解析也是一个很是重要的一部分。对应的类XMLMapperBuilder,在下面咱们只是列出相应的方法,具体分析在后面文章介绍:
java
1 属性sql
/** 解析XML文档转换成DOM对象 */ private XPathParser parser; private MapperBuilderAssistant builderAssistant; private Map<String, XNode> sqlFragments; private String resource;
继承了MyBatis整合Spring的实现(2)中1.2父类XMLConfigBuilder的属性。其它属性具体的功能能够后来补充。
缓存
2 XMLMapperBuilder实例化:app
public XMLMapperBuilder(InputStream inputStream, Configuration configuration, String resource, Map<String, XNode> sqlFragments) { this(new XPathParser(inputStream, true, configuration.getVariables(), new XMLMapperEntityResolver()), configuration, resource, sqlFragments); } private XMLMapperBuilder(XPathParser parser, Configuration configuration, String resource, Map<String, XNode> sqlFragments) { super(configuration); this.builderAssistant = new MapperBuilderAssistant(configuration, resource); this.parser = parser; this.sqlFragments = sqlFragments; this.resource = resource; }
这里只是对属性的赋值,还有建立了MapperBuilderAssistant对象。ui
3 MapperBuilderAssistant
this
3.1 属性spa
/** 当前命名空间 */ private String currentNamespace; /** 资源 */ private String resource; /** 当前缓存 */ private Cache currentCache; private boolean unresolvedCacheRef;
此类也继承了MyBatis整合Spring的实现(2)中1.2父类XMLConfigBuilder的属性。
.net
上图就是此对象中的一个方法,原来此类的功能主要是获取对应的Mapping的,这里获取了ResultMapping,还有ParameterMapping等等,这里后面再具体分析。
code
4 具体解析代码:对象
public void parse() { if (!configuration.isResourceLoaded(resource)) { configurationElement(parser.evalNode("/mapper")); configuration.addLoadedResource(resource); bindMapperForNamespace(); } parsePendingResultMaps(); parsePendingChacheRefs(); parsePendingStatements(); } private void configurationElement(XNode context) { try { String namespace = context.getStringAttribute("namespace"); if (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); } }
代码就分解到这个程度,下面的文章对代码中每一个方法进行分析。