# 精尽 MyBatis 源码分析 —— SQL 初始化(上)之 SqlNode # 1. 概述 本文,我们来分享 MyBatis 的脚本模块,对应 `scripting` 包。如下图所示:[![`scripting` 包](19-mybatis-SQL 初始化(上)之 SqlNode.assets/01.png)](http://static.iocoder.cn/images/MyBatis/2020_02_22/01.png)`scripting` 包 在 [《精尽 MyBatis 源码解析 —— 项目结构一览》](http://svip.iocoder.cn/MyBatis/intro) 中,简单介绍了这个模块如下: > 拼凑 SQL 语句是一件烦琐且易出错的过程,为了将开发人员从这项枯燥无趣的工作中 解脱出来,MyBatis 实现**动态 SQL 语句**的功能,提供了多种动态 SQL语句对应的节点。例如`` 节点、`` 节点、`` 节点等 。通过这些节点的组合使用, 开发人 员可以写出几乎满足所有需求的动态 SQL 语句。 > > MyBatis 中的 `scripting` 模块,会根据用户传入的实参,解析映射文件中定义的动态 SQL 节点,并形成数据库可执行的 SQL 语句。之后会处理 SQL 语句中的占位符,绑定用户传入的实参。 - 总结来说,`scripting` 模块,最大的作用,就是实现了 MyBatis 的**动态 SQL 语句**的功能。关于这个功能,对应文档为 [《MyBatis 文档 —— 动态 SQL》](http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html) 。 本文涉及的类如下图所示:[![类图](19-mybatis-SQL 初始化(上)之 SqlNode.assets/02.png)](http://static.iocoder.cn/images/MyBatis/2020_02_22/02.png)类图 - LanguageDriver - SqlSource - SqlNode - NodeHandler - 基于 OGNL 表达式 下面,我们来逐个来瞅瞅。 # 2. LanguageDriver `org.apache.ibatis.scripting.LanguageDriver` ,语言驱动接口。代码如下: ``` // LanguageDriver.java public interface LanguageDriver { /** * Creates a {@link ParameterHandler} that passes the actual parameters to the the JDBC statement. * * 创建 ParameterHandler 对象。 * * @param mappedStatement The mapped statement that is being executed * @param parameterObject The input parameter object (can be null) * @param boundSql The resulting SQL once the dynamic language has been executed. * @return * @author Frank D. Martinez [mnesarco] * @see DefaultParameterHandler */ ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql); /** * Creates an {@link SqlSource} that will hold the statement read from a mapper xml file. * It is called during startup, when the mapped statement is read from a class or an xml file. * * 创建 SqlSource 对象,从 Mapper XML 配置的 Statement 标签中,即