1. XMLMapperBuilder 如何将 SQL 语句解析成可执行对象 (MappedStatement):
XMLMapperBuilder 解析 <select>, <insert>, <update>, <delete> 等 SQL 语句元素时,并不仅仅是简单地读取 SQL 文本,而是要将 SQL 语句和相关的配置信息 封装成 MappedStatement 对象,MappedStatement 对象才是 MyBatis 运行时真正可执行的 SQL 对象。 这个过程主要涉及以下几个关键步骤:
-
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 = ...

最低0.47元/天 解锁文章
911

被折叠的 条评论
为什么被折叠?



