【12.MyBatis源码剖析与架构实战】16.1 if和where标签执⾏过程剖析-MyBatis初始化时

张开发
2026/4/19 1:02:08 15 分钟阅读

分享文章

【12.MyBatis源码剖析与架构实战】16.1 if和where标签执⾏过程剖析-MyBatis初始化时
MyBatis 初始化阶段 foreach 标签执行过程剖析一、概述在 MyBatis 初始化阶段,foreach标签会被解析为ForEachSqlNode对象,并纳入动态 SQL 的语法树(SqlNode Tree)中。整个解析过程由XMLScriptBuilder类主导,采用策略模式为每个动态标签分配对应的NodeHandler进行递归解析。二、完整流程图三、逐层源码剖析3.1 入口层:XMLScriptBuilder.parseScriptNode()MyBatis 初始化时,XMLMapperBuilder解析 mapper 文件,每条 SQL 语句(select、insert等)最终会交给XMLScriptBuilder处理。publicSqlSourceparseScriptNode(){// 1. 解析 SQL 节点,生成 MixedSqlNode 并判断是否为动态 SQLMixedSqlNoderootSqlNode=parseDynamicTags(context);// 2. 根据是否包含动态标签,创建对应的 SqlSourceif(isDynamic){returnnewDynamicSqlSource(configuration,rootSqlNode);}else{returnnewRawSqlSource(configuration,rootSqlNode,parameterType);}}3.2 解析层:parseDynamicTags() 递归解析parseDynamicTags是核心解析方法,遍历 SQL 语句节点的所有子节点,递归构建SqlNode列表:privateListSqlNodeparseDynamicTags(XNodenode){ListSqlNodecontents=newArrayList();NodeListchildren=node.getNode().getChildNodes();for(inti=0;ichildren.getLength();i++){XNodechild=node.newXNode(children.item(i));if(child.getNode().getNodeType()==Node.CDATA_SECTION_NODE||child.getNode().getNodeType()==Node.TEXT_NODE){// 文本节点处理:直接封装为 SqlNodeStringdata=child.getStringBody("");TextSqlNodetextSqlNode=newTextSqlNode(data);

更多文章