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>

它将被构造为MixedSqlNodeMixedSqlNode就是类似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)

在执行时将从左到右进行深度优先遍历