XML如何转换为ASTNode
在上面的ONGL中,讲到了如下的方法是所有动态sql的执行
我们先挑一个简单的例子
<select id="getParentWithComplex" resultMap="personMapComplex">
SELECT id, firstName, lastName, parent_id, parent_firstName, parent_lastName
<if test="1+1">
FROM ${'Person' + ''}
</if>
WHERE firstName = #{firstName,jdbcType=VARCHAR}
AND lastName = #{lastName,jdbcType=VARCHAR}
LIMIT 1
</select>
它将被构造为MixedSqlNode
,MixedSqlNode
就是类似S表达式的数组结构
// MixedSqlNode
public class MixedSqlNode implements SqlNode {
private final List<SqlNode> contents;
}
在如下位置通过XML反序列化,一个用Map维护Tag的Pattern Match
org.apache.ibatis.scripting.xmltags.XMLScriptBuilder#parseDynamicTags
最终样式为
(text (if test text) text)
在执行时将从左到右进行深度优先遍历