Mybatis的执行流程

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 编写和强大的结果映射能力,同时通过动态代理和责任链模式(插件)提供了良好的扩展性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值