1.1. 解析 SQL 语句文本 (SqlSource):
XMLMapperBuilder
会读取 <select>
, <insert>
, <update>
, <delete>
元素体内的 SQL 语句文本。 SQL 语句文本可能包含:
- 静态 SQL: 普通的 SQL 语句,不包含任何动态 SQL 标签或占位符。
-
动态 SQL: 包含 MyBatis 的动态 SQL 标签 (例如
<if>
,<choose>
,<foreach>
,<where>
,<set>
,<trim>
,${}
,#{}
等)。 -
参数占位符:
#{}
和${}
占位符,用于在运行时动态地替换参数值。
XMLMapperBuilder
会根据 SQL 语句文本的类型,创建不同的 SqlSource
对象来表示 SQL 语句的来源和处理方式。 SqlSource
接口是 MyBatis 中表示 SQL 语句来源的抽象接口,它有以下几种实现类:
-
RawSqlSource
: 用于表示 静态 SQL。 对于静态 SQL,SQL 语句文本在解析时就已经确定,运行时无需动态构建。 -
DynamicSqlSource
: 用于表示 动态 SQL。 对于动态 SQL,SQL 语句文本在运行时需要根据参数值进行动态构建。DynamicSqlSource
会负责解析和处理动态 SQL 标签,并生成最终的可执行 SQL 语句。 -
ProviderSqlSource
: 用于表示 基于 Provider 类的 SQL。 SQL 语句不是直接写在 XML 文件中,而是通过一个 Java Provider 类动态生成。
XMLMapperBuilder
会根据 SQL 语句是否包含动态 SQL 标签来判断创建 RawSqlSource
还是 DynamicSqlSource
。 如果 SQL 语句中使用了动态 SQL 标签,则创建 DynamicSqlSource
,否则创建 RawSqlSource
。 如果是基于 Provider 类的 SQL,则创建 ProviderSqlSource
。
示例代码 (简化版,展示 XMLMapperBuilder
如何创建 SqlSource
):
// 假设 XMLMapperBuilder 解析 <select id="getUserById"> 元素
XNode selectNode = ...; // 代表 <select> 元素的 XNode 对象
String sqlText = selectNode.getStringBody(); // 获取 <select> 元素体内的 SQL 语句文本
SqlSource sqlSource;
if (sqlTextContainsDynamicSqlTags(sqlText)) { // 检查 SQL 文本是否包含动态 SQL 标签 (简化判断逻辑)
sqlSource = new DynamicSqlSource(configuration, selectNode); // 创建 DynamicSqlSource
} else {
sqlSource = new RawSqlSource(configuration, selectText); // 创建 RawSqlSource
}