Mybatis源码深入理解三——一条Sql语句执行流程

77 阅读1分钟

前言

上文我们讲到了mybatis启动的时候会解析配置文件,做好各种字段的初始化,并将其封装到Configuration中。 然后就通过这个全局的Configuration来创建核心的接口SqlSession。

今天我们就从SqlSession开始讲起,探索一条Sql语句的执行流程。

正文

执行流程图

image.png

步骤解析

进入到getMapper()方法,进入到DefaultSqlSession的getMapper() image.png

一步一步进入方法,来到MapperRegistry中的getMapper(),发现有以下步骤:

image.png

进入到newInstance(),发现最终是通过JDK动态代理,生成了一个代理对象。
这就意味着我们在调用被代理对象的方法时,会执行代理对象的invoke(),我们就可以就可以在invoke()中执行一些我们自己的逻辑。

image.png

我们进入到MapperProxy类中的invoke方法,在里面打上断点。跳到下一个断点,程序将会停留在此处。 image.png

进入到execute()

image.png

再进入到executeForMany()

image.png

继续沿着方法一步步往下,最终调用SqlSession中的Executor来执行查询

image.png

来到了BaseExecutor中

image.png

继续跟进到doQuery方法,由StatementHandler执行查询方法

image.png

最终由Java原生的PrepareStatement来执行Sql.

image.png

至此,一条SQL语句的执行过程就完成了。

总结:

mybatis执行SQL的链路还是非常清晰的。通过动态代理,最终使用原生的Statement来执行解析好的Sql语句。其中还有其他的组件来对这个过程进行辅助。比如参数解析器、语句处理器、返回结果处理器等等。