在Java企业级应用开发中,MyBatis以其灵活的SQL映射能力成为持久层框架的重要选择。理解其启动过程,有助于我们更好地驾驭这门“以SQL为剑,对象为鞘”的技艺。本文将用清晰的脉络,为你拆解MyBatis从初始化到可用的完整旅程。
第一重:筑基篇 · 寻经觅典
启动之初,MyBatis需要找到它的核心配置文件——通常名为 mybatis-config.xml。这个文件如同内功心法的总纲,定义了数据源、事务管理器、环境配置以及后续映射文件的路径等核心信息。
开发者通过以下代码,加载这份“秘籍”:
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
Resources.getResourceAsStream 方法负责从类路径下读取配置文件,并将其转换为输入流,为后续的解析做好准备。
第二重:凝气篇 · 构建丹田
获取配置流后,需要一个“建造者”来解析它并构建出核心工厂。这个角色就是 SqlSessionFactoryBuilder。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactoryBuilder 的 build 方法会完整地解析 XML 配置文件,最终创建出一个重量级的 SqlSessionFactory 对象。这个工厂对象是MyBatis运行时的心脏,它包含了所有配置信息,并且是线程安全的,在整个应用生命周期中通常只需一个实例。它的主要职责包括创建 SqlSession、管理数据库连接池等。
第三重:化形篇 · 映射成阵
配置文件中的 <mappers> 部分指向了具体的Mapper XML文件,这些文件定义了SQL语句与Java对象方法之间的映射关系,如同详细的武功招式图。
<mapper namespace="com.dao.UserDao">
<select id="selectUser" resultType="com.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
在构建 SqlSessionFactory 的过程中,MyBatis会使用 XMLMapperBuilder 等解析器来读取这些Mapper文件。解析过程包括:
- 将SQL语句解析为可执行的命令。
- 建立参数(
#{}或${})与Java方法参数之间的映射规则。
- 定义结果集如何封装到指定的结果类型(
resultType 或 resultMap)。
第四重:通脉篇 · 接口贯通
现代MyBatis开发更推荐使用Mapper接口配合注解或XML。我们需要让MyBatis知道这些接口的位置。
- XML配置方式:在
mybatis-config.xml 中使用 <mapper> 标签。
- 注解配置方式(常用):在Spring Boot项目中,使用
@MapperScan(“com.xxx.dao”) 注解。
接口定义如下:
public interface UserDao {
User selectUser(int id);
}
MyBatis通过 MapperRegistry 组件来管理所有已知的Mapper接口。其核心魔法在于动态代理:当应用程序调用 UserDao.selectUser(1) 时,实际调用的是MyBatis为该接口生成的代理对象的方法。这个代理对象负责找到对应的SQL语句并执行,完美实现了接口声明与SQL实现的解耦。
第五重:出鞘篇 · 利剑出鞘
核心工厂准备就绪后,就可以获取执行具体数据库操作的会话了。SqlSession 提供了执行命令、获取映射器、管理事务的方法,可以将其视为一次具体的“数据库对话”。
try (SqlSession session = sqlSessionFactory.openSession()) {
UserDao mapper = session.getMapper(UserDao.class);
User user = mapper.selectUser(1);
}
sqlSessionFactory.openSession():从工厂获取一个新的 SqlSession 实例。它代表一次请求的生命周期,使用后必须关闭(推荐用try-with-resources语法)。
session.getMapper(UserDao.class):从当前会话中获取UserDao接口的动态代理实现。
mapper.selectUser(1):调用代理方法,触发SQL执行,并将结果映射返回为User对象。
核心特性点睛
在启动和运行过程中,MyBatis的以下特性发挥了关键作用:
- 延迟加载:关联对象只有在真正被访问时才会发出查询,类似于“按需加载”,能有效优化性能。
- 缓存机制:MyBatis提供了一级缓存(SqlSession级别)和二级缓存(Mapper命名空间级别),将查询结果暂存,减少对数据库的直接压力。
- 插件机制:通过拦截器(Interceptor),可以深入到MyBatis执行过程的四大核心对象(Executor, StatementHandler, ParameterHandler, ResultSetHandler)进行功能扩展,实现如分页、性能监控等通用逻辑。
总结而言,MyBatis的启动是一条清晰的流水线:定位并解析全局配置 -> 构建核心工厂 -> 加载并解析SQL映射 -> 注册Mapper接口代理 -> 最终通过SqlSession提供数据服务。 掌握这个过程,不仅能让你在面试中应对自如,更能帮助你在实际开发中精准定位配置和运行时的相关问题。