前言
上文我们讲到了mybatis启动的时候会解析配置文件,做好各种字段的初始化,并将其封装到Configuration中。 然后就通过这个全局的Configuration来创建核心的接口SqlSession。
今天我们就从SqlSession开始讲起,探索一条Sql语句的执行流程。
正文
执行流程图
步骤解析
进入到getMapper()方法,进入到DefaultSqlSession的getMapper()
一步一步进入方法,来到MapperRegistry中的getMapper(),发现有以下步骤:
进入到newInstance(),发现最终是通过JDK动态代理,生成了一个代理对象。
这就意味着我们在调用被代理对象的方法时,会执行代理对象的invoke(),我们就可以就可以在invoke()中执行一些我们自己的逻辑。
我们进入到MapperProxy类中的invoke方法,在里面打上断点。跳到下一个断点,程序将会停留在此处。
进入到execute()
再进入到executeForMany()
继续沿着方法一步步往下,最终调用SqlSession中的Executor来执行查询
来到了BaseExecutor中
继续跟进到doQuery方法,由StatementHandler执行查询方法
最终由Java原生的PrepareStatement来执行Sql.
至此,一条SQL语句的执行过程就完成了。
总结:
mybatis执行SQL的链路还是非常清晰的。通过动态代理,最终使用原生的Statement来执行解析好的Sql语句。其中还有其他的组件来对这个过程进行辅助。比如参数解析器、语句处理器、返回结果处理器等等。