languagedriver 是 mybatis 将 sql 配置转为 sqlsource 的核心接口,其实现类 xmllanguagedriver 通过 xmlscriptbuilder 解析动态标签生成 sqlnode 树,静态 sql 返回 rawsqlsource,动态 sql 返回 dynamicsqlsource,并提供 createparameterhandler 方法解耦参数绑定。

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











