MyBatis 的执行流程是指从客户端发起数据库操作请求到获取结果的完整过程,核心是通过 SqlSession、Executor、StatementHandler 等组件协同工作,完成 SQL 解析、参数处理、执行和结果映射。以下是详细流程:
一、执行流程总览
MyBatis 执行流程可分为 6 大核心步骤:
初始化配置 → 创建 SqlSession → 获取 Mapper 代理 → 执行 SQL 方法 → 处理结果 → 关闭资源
二、详细步骤解析
1. 初始化配置(应用启动时)
MyBatis 启动时会加载配置文件(mybatis-config.xml
)和 Mapper 映射文件(*.xml
),并初始化核心组件:
- Configuration:全局配置对象,存储所有配置信息(数据源、映射器、插件等)。
- SqlSessionFactory:通过
SqlSessionFactoryBuilder
解析配置文件后创建,用于生成SqlSession
。
// 初始化示例
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
2. 创建 SqlSession(操作数据库时)
SqlSession
是 MyBatis 与数据库交互的会话对象,通过 SqlSessionFactory
创建,包含事务管理和执行器(Executor):
- 默认开启事务(未提交状态),可通过参数指定自动提交(
autoCommit=true
)。
SqlSession sqlSession = sqlSessionFactory.openSession(); // 非自动提交
3. 获取 Mapper 代理对象
MyBatis 通过 JDK 动态代理 生成 Mapper 接口的代理对象,代理对象负责将方法调用转换为 SQL 执行:
- 客户端调用 Mapper 接口方法(如
userMapper.selectById(1)
)时,实际是调用代理对象的方法。
UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 获取代理对象
4. 解析并执行 SQL(核心步骤)
代理对象触发 SQL 执行,底层由 Executor
(执行器)、StatementHandler
(语句处理器)等组件完成:
(1)匹配 MappedStatement
根据 Mapper 接口全类名 + 方法名,从 Configuration
中找到对应的 MappedStatement
(封装 SQL 语句、参数类型、结果类型等元信息)。
例如,UserMapper.selectById
对应 Mapper XML 中 id="selectById"
的 <select>
标签。
(2)处理参数
- 解析方法参数(如
#{id}
),通过ParameterHandler
将参数值设置到 SQL 中。 #{}
会被替换为?
占位符,通过PreparedStatement
安全传入参数(防止 SQL 注入)。
(3)执行 SQL
Executor
调用StatementHandler
创建PreparedStatement
(或Statement
),并执行 SQL。- 执行结果由
ResultSetHandler
处理。
5. 结果映射(Result Mapping)
ResultSetHandler
将数据库返回的 ResultSet
(结果集)通过以下方式映射为 Java 对象:
- 若指定
resultType
:自动映射(列名与属性名匹配)。 - 若指定
resultMap
:按<resultMap>
标签定义的规则手动映射(支持关联对象、集合等复杂类型)。
6. 事务处理与资源关闭
- 若操作成功,调用
sqlSession.commit()
提交事务;失败则调用sqlSession.rollback()
回滚。 - 最终需关闭
SqlSession
释放资源(建议用try-with-resources
自动关闭)。
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.selectById(1); // 执行查询
sqlSession.commit(); // 提交事务
}
三、核心组件协作关系
组件 | 作用 |
---|---|
SqlSessionFactory | 创建 SqlSession 的工厂类 |
SqlSession | 数据库会话对象,管理事务和 Mapper 代理 |
Executor | 执行器,负责 SQL 执行的核心逻辑 |
MappedStatement | 存储 SQL 语句及映射信息的元对象 |
StatementHandler | 处理 SQL 语句的预编译和执行 |
ParameterHandler | 处理参数绑定 |
ResultSetHandler | 处理结果集映射为 Java 对象 |
总结
MyBatis 的执行流程围绕 “配置解析→会话管理→SQL 执行→结果映射” 展开,通过分层设计(接口层、核心处理层、基础支撑层)实现了 SQL 与 Java 代码的解耦。核心优势在于灵活的 SQL 编写和强大的结果映射能力,同时通过动态代理和责任链模式(插件)提供了良好的扩展性。