这篇文章是接着上一篇文章进行叙述的,上一篇的文章可以进入此链接查看:https://blog.csdn.net/tebtebtebteb/article/details/82774599
上次说到了创建好了XMLMapperBuilder后,便可进入解析<mapper>的过程,也对代码进行了大概的分析,下面接着进行解析:
public void parse() {
//若当前的Mapper.xml没有被解析,则开始解析
if (!this.configuration.isResourceLoaded(this.resource)) {
//解析<mapper>节点
this.configurationElement(this.parser.evalNode("/mapper"));
//将该Mapper.xml添加至configuration的LoadResource容器中,下回无需再解析
this.configuration.addLoadedResource(this.resource);
//将该Mapper.xml对应的Mapper Class注册进configuration的mapperRegistry容器中
this.bindMapperForNamespace();
}
this.parsePendingResultMaps();
this.parsePendingCacheRefs();
this.parsePendingStatements();
1. 下面来看看configurationElement()方法:
private void configurationElement(XNode context) {
try {
//获取<mapper>节点中的namespace属性,这个属性必须存在,不然会报错,表示当前的映射文件对应的是哪个Mapper Class文件
String namespace = context.getStringAttribute("namespace");
if (namespace != null && !namespace.equals("")) {
//把namespace属性赋给builderAssistant
this.builderAssistant.setCurrentNamespace(namespace);
//解析cache-ref节点
this.cacheRefElement(context.evalNode("cache-ref"));
//解析cache节点
this.cacheElement(context.evalNode("cache"));
//解析parameterMap节点
this.parameterMapElement(context.evalNodes("/mapper/parameterMap"));
//解析resultMap节点
this.resultMapElements(context.evalNodes("/mapper/resultMap"));
//解析sql节点
this.sqlElement(context.evalNodes("/mapper/sql"));
//解析sql语句
this.buildStatementFromContext
(context.evalNodes("select|insert|update|delete"));
} else {
throw new BuilderException("Mapper's namespace cannot be empty");
}
} catch (Exception var3) {
throw new BuilderException("Error parsing Mapper XML. Cause: " + var3, var3);
}
}
2.SqlSessionFactory对象的创建
说了那么多,最终目的是生成SqlSessionFactory对象,见一下代码:
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
//调用build()方法创建SqlSessionFactory对象
var5 = this.build(parser.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException var13) {
;
}
}
return var5;
}
调用SqlSessionFactoryBuilder的build()方法创建SqlSessionFactory对象
public SqlSessionFactory build(Configuration config) {
//返回DefaultSqlSessionFactory对象
return new DefaultSqlSessionFactory(config);
}
这里返回的是DefaultSqlSessionFactory的对象,他是SqlSessionFactory的一个实现类。至此,SqlSessionFactory创建完毕。
后续会附上通过SqlSessionFactory获取Session对象以及执行Sql语句的源码分析。