大家好,继续我们的Java面试系列,用通俗流程+分层拆解,把MyBatis从启动加载、解析配置、初始化环境、构建工厂完整流程讲透,面试直接按顺序背就能高分作答。
面试官提问:谈谈 MyBatis 的启动过程?
一、一句话总体理解
MyBatis 启动本质就是:加载配置文件 → 解析全局配置和Mapper映射 → 封装配置环境 → 构建SqlSessionFactory工厂。
启动阶段只做配置解析和资源初始化,不操作数据库,真正执行SQL是在后续调用Mapper方法时才触发。
二、MyBatis 启动完整七大步骤(面试必背流程)
1. 读取核心全局配置文件 2. 创建 SqlSessionFactoryBuilder构造器3. 通过 XMLConfigBuilder 解析全局配置 4. 依次解析全局内部节点(环境、数据源、插件、别名、Mapper等) 5. 解析所有 Mapper 映射文件/Mapper接口 6. 把所有配置信息封装到 Configuration 全局配置对象 7. 由配置对象构建 SqlSessionFactory 工厂,启动完成
三、逐步骤通俗详细拆解
1. 加载全局配置文件
项目启动时,读取 mybatis-config.xml 核心配置文件;
如果是 SpringBoot 整合,就是读取 application.yml 中 MyBatis 配置、Mapper 路径等。
2. 创建 SqlSessionFactoryBuilder
它是启动入口构造器,专门用来解析配置、建造工厂,用完即弃,不用常驻内存。
3. 进入 XMLConfigBuilder 解析全局配置
MyBatis 底层用 建造器模式,XMLConfigBuilder 负责逐行解析配置标签:
• properties 外部配置 • typeAliases 实体类别名 • plugins 插件 • environments 数据库环境、事务管理器、数据源 • mappers 扫描Mapper接口和XML文件
4. 解析 Mapper 映射(核心重点)
解析 <mappers> 节点:
• 扫描指定包下所有 Mapper 接口 • 加载对应的 Mapper.xml 映射文件 • 解析每一个标签:select、insert、update、delete、resultMap、sql片段 • 把每条 SQL 语句、参数类型、返回值类型 封装成 MappedStatement
关键点:启动时就把所有SQL提前解析好,存入内存,后续调用直接取用,不用重复解析。
5. 封装到 Configuration 全局对象
解析完的所有配置、所有Mapper、所有SQL、插件、数据源
全部统一存入 Configuration 单例对象中。
它相当于 MyBatis 的全局内存仓库,整个容器只有一份。
6. 构建 SqlSessionFactory
拿着 Configuration 配置对象,创建 DefaultSqlSessionFactory 实现类。
SqlSessionFactory 全局单例,整个项目只创建一次。
7. 启动完成,等待业务调用
启动结束后:
• 配置已全部加载到内存 • SQL 已全部解析缓存 • 工厂已就绪
后续业务调用 Mapper 接口方法时,再获取 SqlSession、执行 SQL。
四、关键核心类梳理(面试加分)
• SqlSessionFactoryBuilder:启动入口,负责解析配置、建造工厂 • XMLConfigBuilder:解析全局配置文件 • XMLMapperBuilder:解析 Mapper 映射文件 • Configuration:MyBatis 全局大管家,存放所有配置、Mapper、SQL • MappedStatement:封装每一条 SQL 语句及相关配置 • SqlSessionFactory:生产 SqlSession 的工厂,全局单例
五、手绘逻辑流程(口述版)
加载mybatis-config.xml
↓
SqlSessionFactoryBuilder
↓
XMLConfigBuilder 解析全局配置
↓
解析环境、数据源、插件、别名、mappers
↓
XMLMapperBuilder 解析所有Mapper接口和XML
↓
封装所有信息到 Configuration
↓
构建 SqlSessionFactory
↓
启动完成六、SpringBoot 环境下启动变化(实际开发必说)
原生 MyBatis 需要手动写代码解析配置、创建工厂;
SpringBoot 整合后自动完成:
1. 自动配置类 MybatisAutoConfiguration2. 自动扫描 Mapper 包 3. 自动创建 SqlSessionFactory、SqlSessionTemplate 4. 自动生成 Mapper 代理对象,注入 Spring 容器
开发人员无需关心启动底层流程,框架自动帮我们走完整个初始化。
面试现场回答关键点(精简背诵版)
1. MyBatis 启动核心流程:加载配置 → 解析配置 → 封装Configuration → 构建SqlSessionFactory。 2. 由 SqlSessionFactoryBuilder作为入口,通过XML构造器解析全局配置和Mapper文件。3. 启动时提前解析所有SQL并封装为MappedStatement,缓存到Configuration中。 4. Configuration 是全局配置容器,保存所有环境、插件、Mapper、SQL信息。 5. 最终生成 SqlSessionFactory 单例工厂,启动完成。 6. 启动只做配置解析,不操作数据库;真正执行SQL在业务调用阶段。 7. SpringBoot 环境自动完成整个启动初始化,无需手动编码。
如果你有想优先讲解的面试题,欢迎在评论区留言~
运行效果:
END
夜雨聆风