- `${}`参数占位符解析过程
- 总结
当动态SQL配置中存在${}参数占位符时,MyBatis会使用TextSqlNode对象描述对应的SQL节点,在调用TextSqlNode对象的apply()方法时会完成动态SQL的解析
也就是说,${}参数占位符的解析是在TextSqlNode类的apply()方法中完成的
在TextSqlNode类的apply()方法中,首先调用createParser()方法 创建一个 GenericTokenParser对象
通过 GenericTokenParser对象 解析${}参数占位符,然后通过 BindingTokenParser对象 处理 参数占位符的内容
createParser()方法返回一个 GenericTokenParser对象,指定 openToken属性为${,closeToken属性为},TokenHandler(入参)为BindingTokenParser对象
GenericTokenParser对象的parse方法 遍历获取所有${}参数占位符的内容,然后调用 BindingTokenParser对象的handleToken()方法 对 参数占位符内容 进行替换
在BindingTokenParser类的handleToken()方法中,根据参数占位符名称获取对应的参数值,然后替换为对应的参数值
总结使用#{}参数占位符时,占位符内容会被替换成?,然后通过PreparedStatement对象的setXXX()方法为参数占位符设置值
${}参数占位符内容会被直接替换为参数值
使用#{}参数占位符能够有效避免SQL注入问题,所以可以优先考虑使用#{}占位符,当#{}参数占位符无法满足需求时,才考虑使用${}参数占位符



