MyBatis SQL 节点解析:从 SqlSource 到 BoundSql 的完整流程
MyBatis 中 SQL 节点(<select>/<insert>等)的解析是 SQL 执行的基础环节。从 Mapper 配置文件中的 SQL 文本,到最终可执行的数据库语句,中间经历了 “SQL 节点→SqlSource→BoundSql” 的转换过程。本文将深入解析SqlSource接口及其实现类的职责,以及BoundSql的核心作用,揭示 MyBatis 处理静态与动态 SQL 的底层逻辑。
SqlSource:SQL 语句的 “源容器”
SqlSource是 MyBatis 中封装 SQL 语句及其解析逻辑的接口,它的核心职责是根据传入的参数对象,生成可执行的BoundSql对象(包含最终 SQL、参数映射等信息)。
SqlSource 接口定义
1 | public interface SqlSource { |
SqlSource的关键作用是隔离 SQL 的静态结构与动态解析逻辑:无论是静态 SQL(无动态标签)还是动态 SQL(含<if>/<foreach>等),都通过统一的getBoundSql方法提供可执行的 SQL 信息,简化了后续执行器(Executor)的处理逻辑。
SqlSource 的四大实现类:分工与场景
MyBatis 提供 4 种SqlSource实现类,分别对应不同类型的 SQL 定义(静态 / 动态 / 注解提供等),形成了完整的 SQL 解析体系。
1. DynamicSqlSource:动态 SQL 的解析器
核心职责:处理包含动态标签(<if>/<when>/<foreach>/<trim>等)的 SQL 语句,需要根据参数动态生成最终 SQL。
适用场景:
包含动态逻辑的 SQL(如 “根据条件拼接查询条件”):