0
点赞
收藏
分享

微信扫一扫

这MyBatis究竟底层的实现原理是啥啊?

AbrahamW 2022-03-12 阅读 63

> 自己钻研钻研

这MyBatis是如何通过接口找到对应的xml文件的啊?
好家伙,直接开始扒源码
![image.png](/upload/2022/03/image-652aa953b425411d824c272a1adec12a.png)

朝getMapper往里点。 

![image.png](/upload/2022/03/image-eb0c3d49e69e4229a28cbbad127b794e.png)

进入到了DefaultSqlSession.class,哪里不会点哪里继续点。

![image.png](/upload/2022/03/image-0af96404954743d3b398d3584cbeaff8.png)

又来一个,继续点

![image.png](/upload/2022/03/image-b7755756d3664273b2b5bdf89bad5e3c.png)![image.png](/upload/2022/03/image-e2407a9224674da89126d230a8872493.png)

这会儿终于出现逻辑代码了,硬着头皮开始看。
这个函数分两部分来看,首先是从map集合中获取接口代理,map集合的来源,第二部分获取代理后实例化,获取接口的方法,执行sql。
其中第一部分的集合是如何导入的,就得从addMapper方法说起了

![image.png](/upload/2022/03/image-728cf8e4d1de49418aa81a1679a24c96.png)

往上追溯该方法的调用是在SqlSessionFactory.build();时对配置文件的解析,其中对节点mappers的解析。

![image.png](/upload/2022/03/image-d579ed3ab09949e78864b19505faeeb5.png)

这步是通过全路径来查找对应的xml。
第二部分的代码主要就是通过动态代理获取接口名字来对应xml中的id。
最后则是在MapperProxy.java中进行方法的执行,通过invoke,实际调用了excute进行对sql语句的执行。

**总结**

    1)解析xml文件时,将Mapper type和MapperProxyFactory的对应关系封装到Configuration中,以备后面使用

    2)在SqlSession.getMapper(type)时,就是从Configuration中获取type对应的MapperProxyFactory

    3)MapperProxyFactory用于获取MapperProxy

    4)MapperProxy是一个动态代理类,真正的实现还是交由SqlSession来处理
 

举报

相关推荐

0 条评论