mybatis中xml的$符号是什么时候替换的

问题场景

xml中某sql语句如下,其中变量使用${}括起来,而不#{}

select * from base_collect_model ${condition}

目前存在的是事实是,如果使用#{},mybatis底层会先对#{}占位符进行解析,将每个参数包装为ParameterMapping对象,同时将#{}占位符替换为"?",最后设置实际参数时,将有"?"的地方,根据ParameterMapping信息替换为实际的值。

现在我们使用的是${},根据上述分析,mybatis解析时无法找到#{}占位符,于是就没有ParameterMapping对象了。那么最后设置实际参数时,mybatis是怎么做的呢?

分析

select * from base_collect_model ${condition}

mybatis会在将其包装为DynamicSqlSource对象,该对象内部持有TextSqlNode,代表实际的sql语句

当查询时要先获取BoundSql,于是进入DynamicSqlSource的如下方法
在这里插入图片描述
第一个红框:包含替换${}的逻辑。
第二个红框:当使用#{}时,每个参数被包装为ParameterMapping对象并被替换为"?",由于此时使用的是${},所以这里不会做处理。

我们看第一个红框,其内部实现时,最终会进入TextSqlNode类的如下handleToken方法
在这里插入图片描述

此时就是真正替换${}符号的过程:使用OGNL表达式,将${condition}替换为实际的condition变量的值。


版权声明:本文为qq_39002724原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。