LanguageDriver 是 MyBatis 将 SQL 配置转为 SqlSource 的核心接口,其实现类 XMLLanguageDriver 通过 XMLScriptBuilder 解析动态标签生成 SqlNode 树,静态 SQL 返回 RawSqlSource,动态 SQL 返回 DynamicSqlSource,并提供 createParameterHandler 方法解耦参数绑定。

LanguageDriver 是 MyBatis 中负责将 SQL 配置(XML 或注解)转换为可执行 SqlSource 对象的核心入口。它本身是接口,真正干活的是其实现类,比如处理 XML 的 XMLLanguageDriver。
XMLLanguageDriver 触发解析流程
当 MyBatis 解析一个 <select>、<update> 等标签时,会调用:
XMLLanguageDriver#createSqlSource(Configuration, XNode, Class)- 该方法内部创建
XMLScriptBuilder实例,并调用其parseScriptNode()
XMLScriptBuilder 构建 SqlNode 树
这是动态 SQL 解析的关键阶段:把 XML 标签逐层翻译成内存中的对象结构。
- 初始化时注册好各标签对应的 NodeHandler,例如:
"if" → IfHandler、"where" → WhereHandler、"foreach" → ForEachHandler等 - 遍历 XML 节点,遇到动态标签(如
<if test="id!=null">)就交由对应 Handler 处理,生成具体类型的 SqlNode(如IfSqlNode) - 嵌套结构(比如
<where>里套多个<if>)会被构造成树形的MixedSqlNode,根节点代表整个 SQL 片段
生成 SqlSource 对象
解析完成后,XMLScriptBuilder 返回一个 SqlSource 实现类:
立即学习“Java免费学习笔记(深入)”;
- 如果 SQL 中不含任何动态标签(纯静态),返回
RawSqlSource - 只要出现
<if>、<foreach>等,就返回DynamicSqlSource,它持有一个rootSqlNode和Configuration -
DynamicSqlSource#getBoundSql(Object)是延迟执行的:运行时才调用rootSqlNode.apply(context),逐层展开节点,拼出最终 SQL 字符串
LanguageDriver 还承担参数处理职责
除了构建 SqlSource,LanguageDriver 接口还定义了 createParameterHandler 方法:
- 在 SQL 执行前,由它创建
ParameterHandler,负责将 Java 参数填入#{}占位符 - 这使得 SQL 解析与参数绑定逻辑解耦,也便于扩展(比如支持 Velocity 模板语言时,重写 LanguageDriver 即可)


















