Mybatis初探——对象关系

紧接着上一章 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。

这样的可能原因是:省时空复杂度?但可能提升也不是很大吧。。。这个原因还有待发掘


未完待续……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值