parseConfiguration<br>
propertiesElement<br>解析<properties>元素
Properties defaults = context.getChildrenAsProperties();<br>添加子元素内容至defaults
defaults =Resources.getResourceAsProperties(resource)<br>读取外部properties文件内容至defaults
parser.setVariables(defaults);<br>XPathParser添加变量信息<br>
configuration.setVariables(defaults)
settingsAsProperties<br>解析<settings>元素<br>mybatis全局设置
Properties props = context.getChildrenAsProperties();<br>获取子元素内容
metaConfig.hasSetter(String.valueOf(key)<br>校验子元素是否合法
typeAliasesElement<br>解析<typeAliases>元素<br>类型别名<br>
pluginElement<br>解析<plugIns>元素<br>插件
获取拦截器<br>child.getStringAttribute("interceptor");<br>
获取属性<br>child.getChildrenAsProperties()<br>
创建拦截器实例<br>Interceptor interceptorInstance = <br>(Interceptor) resolveClass(interceptor).getDeclaredConstructor().newInstance(); <br>
添加拦截器至configuration全局变量中<br> configuration.addInterceptor(interceptorInstance)<br>
objectFactoryElement<br>解析<objectFactory>元素
objectWrapperFactoryElement<br>解析<objectWrapperFactory>元素
reflectorFactoryElement<br>解析<reflectorFactory>元素
settingsElement<br>将<settings>元素内容填充至configuration对象中
将<settings>元素配置的全局属性添加至configuration中
configuration.setCacheEnabled(booleanValueOf(props.getProperty("cacheEnabled"), true)); <br>
configuration.setMapUnderscoreToCamelCase(booleanValueOf(props.getProperty("mapUnderscoreToCamelCase"), false)); <br>
....
databaseIdProviderElement<br>解析<databaseIdProvider>元素<br>数据库厂商标识<br>
typeHandlerElement<br>解析<typeHandlers>元素<br>
mapperElement<br>解析<mappers>元素<br>
package
configuration.addMappers(mapperPackage)
MapperRegistry-><br>addMappers(packageName);<br>
resolverUtil.find(new ResolverUtil.IsA(superType), packageName);<br>解析指定包中Class
addMapper(mapperClass);
knownMappers.put(type, new MapperProxyFactory<>(type));<br>添加MapperProxy代理对象
MapperAnnotationBuilder->parse()<br>解析Mapper接口中定义的注解
MapperAnnotationBuilder-><br>loadXmlResource();<br>加载xml映射文件<br>
InputStream inputStream = type.getResourceAsStream("/" + xmlResource);
inputStream = Resources.getResourceAsStream(type.getClassLoader(), xmlResource);
XMLMapperBuilder xmlParser = new XMLMapperBuilder(inputStream, assistant.getConfiguration(), xmlResource, configuration.getSqlFragments(), type.getName());<br> xmlParser.parse();
MapperAnnotationBuilder-><br>parseStatement(method);<br>
MapperBuilderAssistant-><br>addMappedStatement<br>
mapper
resource<br>url<br>
Resources.getResourceAsStream(resource)<br>加载资源文件为流
XMLMapperBuilder-><br>parse()<br>解析<mapper>元素
configurationElement
namespace
cacheRefElement<br>解析cache-ref属性<br>
cacheElement<br>解析cache属性<br>
parameterMapElement<br>/mapper/parameterMap<br>
builderAssistant.addParameterMap
resultMapElements<br>/mapper/resultMap<br>
sqlElement<br>/mapper/sql<br>
buildStatementFromContext<br>select|insert|update|delete<br>
XMLStatementBuilder-><br>parseStatementNode();<br>
解析xml元素
MapperBuilderAssistant-><br>addMappedStatement<br>
MappedStatement statement = statementBuilder.build();
configuration.addMappedStatement(statement);
bindMapperForNamespace
builderAssistant.getCurrentNamespace()
configuration.addLoadedResource("namespace:" + namespace); <br>
configuration.addMapper(boundType);
parsePendingResultMaps
parsePendingCacheRefs
parsePendingStatements
class
Resources.classForName(mapperClass);
configuration.addMapper(boundType);