接上回# Mybatis源码主流程串讲(二):Configuration对象 上文书我们已经讲了mybatis的三大组件、以及串联全局的Configuration对象是如何解析并装配生成的,同时也介绍了mapper.xml文件是怎么解析形成sql用于执行的。这次我们将介绍一旦我们在代码里调用mapper方法,mybatis具体是如何执行的。
相信使用过mybatis这个框架的同学们都知道,我们并不需要实现具体的执行方法,只需要编写好接口和相关方法与xml文件中的方法名对应上就可以了。执行中,程序是无法直接执行接口的,需要有具体的实现类。那么这个类是谁帮我们生成的呢?不卖关子,当然是mybatis利用动态代理帮助我们生成的代理对象,执行的时候实际上走的是这个代理对象的逻辑。生成代理对象的方法是这个:MapperProxyFactory
可以看到有两个参数:mapperInterface 和 methodCache。其中mapperInterface用于存储这个factroy用于生成那个接口的代理对象,methodCache用于缓存这个接口的各个方法和xml文件里的sql的映射。那么这两个值又是咋来的呢?按住ctrl单击方法逐层向上找,可以看到最后又回到了XMLConfigBuilder方法,这里面会扫描配置的包或者有@Mapper注解的类,通过反射解析并存储到Configuration对象里,而后调用MapperRegistry的addMappers方法。
现在mybatis帮我们生成了代理对象,那么具体的执行方法就在Proxy类里的invoke,这个方法相对简单:
那么我们就看看我们用的最多的那种配置模式,请看execute方法:
我们进入executeForMap看一下:
会进入sqlSession.selectMap,继续往下看:
执行过程中会有很多缓存,最终会走到SimpleStatementHandler的doQuery方法内:
statement的具体实现与你引入的driver有关,
至此,整个mybatis执行主流程就梳理完成了。后续还有很重要的一部分内容:缓存,我们将在下一轮讨论。(未完待续......)