MyBatis 执行流程深度解析

MyBatis 执行流程深度解析

一、概述

MyBatis 是一款优秀的持久层框架,它封装了 JDBC,让开发者只需关注 SQL 本身。本文从源码角度深入分析 MyBatis 的完整执行流程。

二、核心组件

2.1 SqlSessionFactoryBuilder

负责构建 SqlSessionFactory,主要通过 XML 配置文件来构建。

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);

2.2 SqlSessionFactory

SqlSession 的工厂类,负责创建 SqlSession 实例。

public interface SqlSessionFactory {
    SqlSession openSession();
    SqlSession openSession(boolean autoCommit);
}

2.3 SqlSession

是 MyBatis 工作的主入口,类似 JDBC 中的 Connection。

public interface SqlSession {
    <T> T selectOne(String statement);
    <T> T selectOne(String statement, Object parameter);
    <E> List<E> selectList(String statement);
    int insert(String statement);
    int update(String statement);
    int delete(String statement);
}

2.4 Executor

SqlSession 的内部实现,负责 SQL 语句的执行,是 MyBatis 调度的核心。

三、执行流程

3.1 整体架构

SqlSession 是 MyBatis 工作的主入口,Executor 是 SQL 执行的调度中心。

执行链路:

selectOne() 
  └─> DefaultSqlSession.selectOne()
        └─> executor.query()
              ├─> CachingExecutor.query() [二级缓存]
              │     └─> BaseExecutor.query()
              │           ├─> 一级缓存查询
              │           └─> doQuery()
              │                 └─> SimpleExecutor.doQuery()
              │                       └─> PreparedStatementHandler.query()
              │                             ├─> ParameterHandler.setParameters()
              │                             └─> Statement.execute()
              │
              └─> ResultSetHandler.handleResultSets()

3.2 详细执行步骤

第一步:构建 SqlSessionFactory

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);

第二步:打开 SqlSession

SqlSession sqlSession = factory.openSession();

第三步:执行查询

User user = sqlSession.selectOne("com.example.UserMapper.selectById", 1);

四、缓存机制

4.1 一级缓存(SqlSession 级别)

一级缓存是 SqlSession 级别的缓存,默认开启。在同一个 SqlSession 中执行相同查询时,数据存入一级缓存,后续查询直接从缓存获取。

失效场景:

  • SqlSession 关闭
  • 调用 clearCache()
  • 执行 update/insert/delete
  • 事务提交或回滚

4.2 二级缓存(Mapper 级别)

二级缓存是 Mapper 级别的缓存,需在 Mapper.xml 中配置 cache 标签。

<mapper namespace="com.example.UserMapper">
    <cache evictionPolicy="LRU" flushInterval="60000" size="512"/>
</mapper>

五、插件机制

MyBatis 提供插件机制,可拦截四大核心对象:

拦截对象 说明
Executor SQL 执行
StatementHandler SQL 预编译
ParameterHandler 参数处理
ResultSetHandler 结果集处理

插件示例

@Intercepts({
    @Signature(type = StatementHandler.class, method = "parameterize", args = {Statement.class})
})
public class ExampleInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("执行前拦截...");
        Object result = invocation.proceed();
        System.out.println("执行后拦截...");
        return result;
    }
}

六、总结

MyBatis 执行流程分层清晰:

  1. SqlSessionFactoryBuilder → 配置解析和工厂构建
  2. SqlSessionFactory → 管理 SqlSession 生命周期
  3. SqlSession → 面向用户的 API
  4. Executor → SQL 执行的调度中心
  5. StatementHandler → SQL 预编译和执行
  6. ParameterHandler/ResultSetHandler → 参数和结果转换

理解这些核心组件的交互,是深入掌握 MyBatis 的关键。


参考版本:MyBatis 3.5.x

posted @ 2026-05-06 09:41  fitch_liu  阅读(3)  评论(0)    收藏  举报