源码地址:https://github.com/mybatis/mybatis-3/
仓库地址:https://gitcode.net/qq_42665745/mybatis/-/tree/15-dynamic-sql
动态Sql
解析动态Sql分为两部分
1.解析XML中Sql的时候,要将其解析成不同的SqlNode节点,但是不进行具体处理,然后根据是否有动态标签创建RawSqlSource还是DynamicSqlSource,有以下几种SqlNode:
- StaticTextSqlNode:解析纯文本Sql
- TextSqlNode:解析带有 ${} 或 #{} 的动态 Sql
- TrimSqlNode:解析标签
- IfSqlNode:解析标签
2.defaultSqlSession中执行query会调用sqlSource.getBoundSql(parameter)方法,这里会进行解析,首先不管是RawSqlSource还是DynamicSqlSource都会创建动态上下文处理,只是静态的直接获取其中的Sql就行,动态的需要将List节点集合解析并组装成一个完整的Sql然后再获取,值得注意的是TextSqlNode会在这一步处理掉${},后面的处理都一样了,使用sqlSourceParser将Sql的#{}替换成?,生成JDBC 可执行的 SQL 语句,再封装成一个BoundSql对象