请阐述 MyBatis 从启动到执行 SQL 的完整内部流程,包括配置加载、SqlSession 创建、Mapper 代理、SQL 解析与执行等关键步骤,并说明各步骤之间的衔接关系。
考察说明
考查对 MyBatis 核心执行链路的整体理解,包括配置加载、代理生成、SqlSession 与 Executor 的协作机制。
回答思路
- 【回答框架 1】MyBatis 启动时解析 mybatis-config.xml 和映射文件,构建 Configuration 对象,并注册 MappedStatement,每个 MappedStatement 对应一条 SQL 及其参数和结果映射信息。
- 【回答框架 2】通过 SqlSessionFactory 创建 SqlSession,SqlSession 是门面接口,内部封装了 Executor、Transaction 等核心组件。Executor 负责 SQL 执行,包括一级缓存、二级缓存和延迟加载等逻辑。
- 【回答框架 3】Mapper 接口通过 JDK 动态代理生成代理对象,调用接口方法时,代理根据方法签名找到对应的 MappedStatement 的唯一 id(namespace+方法名)。
- 【回答框架 4】执行 SQL 的过程包括:解析动态 SQL 生成 BoundSql,通过 ParameterHandler 设置参数,通过 StatementHandler 创建并执行 Statement,最后通过 ResultSetHandler 将结果集映射为实体对象。
- 【关键点 1】MyBatis 初始化阶段构建 Configuration 并注册 MappedStatement。
- 【关键点 2】SqlSession 是门面,核心执行器是 Executor。
- 【关键点 3】Mapper 接口使用 JDK 动态代理,方法调用映射到 MappedStatement。
- 【关键点 4】SQL 执行经过四大组件:Executor、StatementHandler、ParameterHandler、ResultSetHandler。
- 【关键点 5】动态 SQL 在运行时解析为 BoundSql,参数和结果映射依赖 TypeHandler。
- 【易错点 1】把 SqlSession 的创建误认为是线程安全的,实际上 SqlSession 非线程安全,通常每个线程使用独立实例。
- 【易错点 2】忽略 MappedStatement 的 id 规则,导致找不到 SQL。
- 【易错点 3】混淆一级缓存和二级缓存的作用范围,一级缓存是 SqlSession 级别,二级缓存是 namespace 级别。