紧接着上一章 Mybatis初探——流程走一遍,得出了文末的结论。
其实我觉得,对于一个框架,最重要的研究透,其中的对象关系。
这个对象关系体现在:这个对象封装了什么,和其他对象的关系是什么?一对一?一对多?……
这一章节开始研究mybatis框架中,各个对象之间的关系。
2. 相关对象
接上文,我们对刚刚过程中StaticSqlSource一波断点操作,我们发现,和sql语句相关的一切信息,都在MappedStatement对象里。
2.1 MappedStatement
这个数据结构维护了单句sql语句的属性。
2.2 Configuration
在 1.2.1executeForMany方法中 ,有个方法,有这么一句话
MappedStatement ms = configuration.getMappedStatement(statement);
这句话揭示了两者之间的关系,我们可以点入configuration的getMappedStatement看一看,发现维护了一个map[String, MappedStatement] 其中 key是mapper中的方法名,xml中的方法的id。
这个configuration对象是和SqlSession有关的,应该是一个sqlSession对应一个configuration对象,我调试发现,所有方法的id都在这个map[String, MappedStatement]里,但又不仅仅是这样。
稍微探究一下这个Map
但是我发现比较奇怪的一点,就是他会把同一个方法存多遍,至于具体原因我尚未明白。这里我可以说一下我发现的事实。
假设我有2个mapperInterface,userInterface, fileInterface,里面同样都有一个insert方法。
在这个map的里会出现下面3个键值对
userInteface.insert -> MappedStatement对象
fileInterface.insert -> MappedStatement对象
insert -> Configuration$StrictMap$Ambiguity
如果看到这个map的定义,会发现,他的类型是StrictMap,而且他定义了一堆其他的StrictMap,这个StrictMap源代码非常好懂,就是在map的基础上,增加了一个名称冲突的情况。大致逻辑就是,默认情况下的key是 包名+方法名,但也会存个简略版,即方法名,如果两个方法名冲突了,这个对象就会成为一个Ambiguity对象,如果直接访问到这种对象,这个map是会抛异常的,提示使用者用全名访问这个map。
这样的可能原因是:省时空复杂度?但可能提升也不是很大吧。。。这个原因还有待发掘
未完待续……