上一篇分析了SqlSession执行sql的过程,其中并没有分析sql是从哪里来的,今天就来仔细分析下。
Sql来源
从上一篇的最后一步执行sql那里倒推sql的来源,源码主要过程如下图:

可以看到最后是通过BoundSql直接获取的sql,然后往前倒推最后发现是通过MappedStatement的getBoundSql方法返回的。MappedStatement在之前分析mapper的时候知道一个执行sql对应一个MappedStatement对象,它封装有mybatis中需要执行一条sql的所有信息,所以从这里获取也是理所应当的。
MappedStatement的getBoundSql方法
那么就来看下MappedStatement的getBoundSql方法吧,源码如下图:

首先是右边MappedStatement的getBoundSql方法,这次改了下sql传递了两个参数,但是对程序基本没什么影响。可以看到BoundSql是通过SqlSource创建的,通过debug知道是DynamicSqlSource对象。
左边是DynamicSqlSource的getBoundSql方法,可以先看后面的创建BoundSql对象,是通过Sql

本文详细分析了Mybatis中SqlSession执行sql的来源,从MappedStatement的getBoundSql方法开始,探讨了DynamicSqlSource、TextSqlNode如何处理sql,以及GenericTokenParser如何将占位符替换为实际参数,最终构建完整的sql。
最低0.47元/天 解锁文章
2967

被折叠的 条评论
为什么被折叠?



