MyBatis源码解析(一)一MyBatis的初始化过程(续)

xiaoxiao2021-03-01  11

这篇文章是接着上一篇文章进行叙述的,上一篇的文章可以进入此链接查看: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语句的源码分析。

 

转载请注明原文地址: https://www.6miu.com/read-3850117.html

最新回复(0)