详细步骤
调用sqlSessionFactoryBuilder类的build方法,然后从return build(parser.parse());进入
XMLConfigBuilder类的parse方法
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
XMLConfigBuilder类的parse,从parseConfiguration(parser.evalNode("/configuration"));进入parseConfiguration方法
public Configuration parse() {
if (parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
}
parsed = true;
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
}
parseConfiguration 从这里可以看见Mybatis的配置文件中各项信息
【settings】【mapperElement】等等
private void parseConfiguration(XNode root) {
try {
Properties settings = settingsAsPropertiess(root.evalNode("settings"));
//issue #117 read properties first
propertiesElement(root.evalNode("properties"));
loadCustomVfs(settings);
typeAliasesElement(root.evalNode("typeAliases"));
pluginElement(root.evalNode("plugins"));
objectFactoryElement(root.evalNode("objectFactory"));
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
reflectorFactoryElement(root.evalNode("reflectorFactory"));
settingsElement(settings);
// read it after objectFactory and objectWrapperFactory issue #631
environmentsElement(root.evalNode("environments"));
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
typeHandlerElement(root.evalNode("typeHandlers"));
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
现在基本上已经进入轨道了,接下来不在插入代码块了,纯文字构画出过程:
从XMLConfigBuilder中parseConfiguration方法中进入mapperElement[映射文件信息]
在mapperElement方法中将根据配置文件中的< mappers >的注册方式分两种情况
1、以包形式注册
mapperElement方法中configuration.addMappers()方法,经过各种解析,筛选出需要的xml映射文件【省略其中步骤】---->MapperRegistry类中addMapper方法中parser.parse()【创建解析】—>MapperAnnotationBuilder类parse方法中loadXmlResource【开始解析xml映射文件】---->XMLMapperBuilder类parse方法中configurationElement(parser.evalNode("/mapper"));
---->XMLMapperBuilder类configurationElement方法中buildStatementFromContext【准备解析CRUD操作】buildStatementFromContext方法statementParser.parseStatementNode()【解析CRUD方法的参数】---->
XMLStatementBuilder类parseStatementNode方法【所有参数解析后调用】
---->builderAssistant类中addMappedStatement方法【将MappedStatement添加到configuration中】【每一个MappedStatement对应一条SQL语句】
---->XMLMapperBuilder类parse方法【将configuration进行返回】
2、非包形式注册
XMLConfigBuilder类mapperElement方法中mapperParser.parse();–>XMLMapperBuilder类parse[configurationElement(parser.evalNode("/mapper"));
–>XMLMapperBuilder类configurationElement方法中buildStatementFromContext【准备解析CRUD操作】buildStatementFromContext方法statementParser.parseStatementNode()【解析CRUD方法的参数】---->
XMLStatementBuilder类parseStatementNode方法【所有参数解析后调用】
---->builderAssistant类中addMappedStatement方法【将MappedStatement添加到configuration中】【每一个MappedStatement对应一条SQL语句】
---->XMLMapperBuilder类parse方法【将configuration进行返回】
**
- ---->代表执行顺序,文字叙述不易读,如果读不懂的话,可以在这些类中的方法上加断点,执行一遍。
- 高亮处是两种方式的不同点