mybatis执行sql过程
一、配置加载阶段
1. 读取全局配置(mybatis-config.xml)
- 入口类:SqlSessionFactoryBuilder.build()
- 关键组件: - XMLConfigBuilder:解析全局配置文件。
- Configuration:存储所有配置信息(数据源、映射器、插件等)。
 
- 过程: - 解析 <environments>标签,创建DataSource和TransactionFactory。
- 解析 <mappers>标签,加载 Mapper XML 或接口。
 
- 解析 
2. 加载 Mapper 文件(UserMapper.xml)
- 入口类:XMLMapperBuilder.parse()
- 关键组件: - MappedStatement:每个 SQL 操作的抽象(包含 SQL 文本、参数映射、结果映射等)。
- SqlSource:动态 SQL 或静态 SQL 的封装。
 
- 过程: - 解析 <select|insert|update|delete>标签,生成MappedStatement。
- 解析动态 SQL(如 <if>,<foreach>),生成SqlNode语法树。
 
- 解析 
 二、会话创建阶段 
 
1. 创建 SqlSessionFactory
- 实现类:DefaultSqlSessionFactory
- 作用:生产 SqlSession(数据库操作入口)。
2. 创建 SqlSession
- 核心方法:openSession()
- 关键组件: - Executor:执行 SQL 的核心组件(默认实现为 SimpleExecutor)。
- Transaction:事务管理器(JDBC 或 MANAGED)。
 
三、SQL 解析阶段
1. Mapper 接口代理
- 入口:sqlSession.getMapper(UserMapper.class)
- 关键组件: - MapperProxy:动态代理类,拦截接口方法调用。
- MapperMethod:将方法调用转换为 SQL 操作(SELECT|INSERT|UPDATE|DELETE)。
 
2. 生成 BoundSql
- 关键组件: - SqlSource:通过 DynamicSqlSource 或 RawSqlSource 解析 SQL。
- BoundSql:最终可执行的 SQL + 参数映射信息。
 
- 过程: - 替换 ${}占位符(直接文本替换)。
- 解析 #{}占位符,生成?并记录参数映射关系。
 
- 替换 
 四、参数处理阶段 
 
1. 参数绑定
- 关键组件: - ParameterHandler(实现类:DefaultParameterHandler)
- TypeHandler:类型转换处理器(如 StringTypeHandler、DateTypeHandler)。
 
- 过程: - 根据 MappedStatement中的参数映射(ParameterMapping)解析参数。
- 使用 TypeHandler将 Java 对象转换为 JDBC 类型。
- 通过 PreparedStatement.setXXX()设置参数。
 
- 根据 
2. 动态 SQL 处理
- 示例:
<select id="findUsers"> SELECT * FROM users <where> <if test="name != null">AND name = #{name}</if> <if test="age > 18">AND age = #{age}</if> </where> 
</select>- 解析器:XMLScriptBuilder将<if>转换为IfSqlNode。
- 执行逻辑:运行时根据参数值动态拼接 SQL。
 五、SQL 执行阶段 
 
1. 执行器(Executor)工作流程
- 核心类:BaseExecutor → SimpleExecutor(默认)
- 流程: - 检查一级缓存(LocalCache)是否存在结果。
- 未命中缓存时,创建 StatementHandler。
- 调用 StatementHandler.prepare()创建Statement对象。
- 执行 StatementHandler.query()或update()。
 
- 检查一级缓存(
2. StatementHandler 的类型
| 类型 | 说明 | 
| SimpleStatementHandler | 处理普通Statement(无参数) | 
| PreparedStatementHandler | 处理PreparedStatement(预编译,推荐) | 
| CallableStatementHandler | 处理存储过程调用 | 
3. 执行细节
- 预编译优化:
// 生成 PreparedStatement 
Connection conn = session.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
// 设置参数 
parameterHandler.setParameters(ps); 
// 执行查询 
ResultSet rs = ps.executeQuery(); 六、结果映射阶段 
 
1. 结果集处理
- 关键组件: - ResultSetHandler(实现类:DefaultResultSetHandler)
- ResultMap:定义结果集与 Java 对象的映射规则。
 
- 过程: - 遍历 ResultSet的每一行。
- 根据 ResultMap创建目标对象(如User)。
- 使用 TypeHandler将数据库字段值填充到对象属性。
 
- 遍历 
2. 嵌套映射与延迟加载
- 嵌套查询:
<resultMap id="userWithOrders" type="User"> <collection property="orders" column="id" select="selectOrdersByUserId"/> 
</resultMap>- 触发时机:访问 user.getOrders()时执行子查询(需开启延迟加载)。
七、核心组件协作流程图
 
 
八、高级特性扩展
1. 插件机制(Interceptor)
- 拦截点:Executor、StatementHandler、ParameterHandler、ResultSetHandler。
- 应用场景:分页插件、性能监控、SQL 改写。
2. 二级缓存
- 作用范围:Mapper 级别,跨 SqlSession 共享。
- 启用条件:在 Mapper XML 中添加 标签。
3. 延迟加载
- 配置:在 mybatis-config.xml 中设置:
<settings><setting name="lazyLoadingEnabled" value="true"/>
</settings>通过理解 MyBatis 的执行原理,可以更好地优化 SQL 性能、定制插件,并快速定位复杂问题(如缓存失效、动态 SQL 错误等)。
