MappedStatement类中的getBoundSql()
主要作用解析标签节点,如where、if等组成动态SQL的标签。
方法内部分析:
-
40行:根据configuration解析的配置信息和手动传入的参数列表生成DynamicContext,稍后用于动态sql拼接
-
41行:对动态sql的标签进行解析,并对sql进行拼接。此时getBoundSql()方法入口传入的map集合,进行动态sql拼接时,判断map中的key是否在动态sql的条件表达式中存在,存在则将条件中的sql进行拼接。倘若故意将map替换为null作为参数传入。好像不影响其他结果,但是sql将不会完整,因为map为null,在进行sql动态条件判断时,判断结果都为false,将不会对条件中的sql进行拼接。
实际上有的实现类是对标签中条件的判断
拼接结果:
- 42行: 初始化BaseBuilder时将配置解析类Configuration、数据别名注册类TypeAliasRegistry、数据类型转换注册类TypeHandlerRegistry也进行初始化
-
43行:获取存储参数容器的类型
-
44行:对上面拼接好的sql中的参数替代成?表示
在此方法中注意return 返回语句中有一个handler.getParamterMappings(); 此方法将sql语句中替代成?的参数取出了
如下:
具体是如何取出?
在parse()所在类中有一个静态内部类。
String sql = parser.parse(originalSql);进入parse方法。
可见它是将#{}表达式中的字符串取出并放入expression变量中。
再通过parse中的第78行handler.handleToken方法放入parameterMappings变量名的List集合中。
- 45行:通过sqlSource.getBoundSql(parameterObject);将配置解析类、带有?的SQL、从sql解析出的参数列表以及最开始传入的参数列表统统封装给BoundSql。
最后通过BoundSql.getParameterMappings();可以获取有序的动态SQL中的参数名。
这篇文章介绍了Mybatis获取有序参数列表的过程,下一篇文章会介绍Mybatis获取完整的执行SQL。