配置加载阶段

  • 读取配置文件:加载 mybatis-config.xml(全局配置,如数据源、插件、类型处理器等)。

  • 加载映射文件:解析 Mapper.xml 或注解形式的 SQL 定义,生成 MappedStatement 对象(包含 SQL、参数/结果映射等信息)。

  • 构建 SqlSessionFactory:通过 SqlSessionFactoryBuilder 创建单例的 SqlSessionFactory(核心工厂类)。

创建 SqlSession

  • 通过 SqlSessionFactory.openSession() 创建 SqlSession(核心会话对象,封装了与数据库的交互方法)。

  • 默认使用 Executor 执行器(可能包含一级缓存)。

执行 SQL 流程

获取 Mapper 接口代理对象

  • 调用 sqlSession.getMapper(UserMapper.class) 时,MyBatis 通过动态代理(如 JDK Proxy)生成 Mapper 接口的代理对象。

方法调用触发代理逻辑

  • 代理对象拦截接口方法调用,根据方法名映射到对应的 MappedStatement(通过 namespace + 方法名 定位)。

参数处理

  • 将方法参数转换为 SQL 参数:

    • 使用 TypeHandler 处理 Java 类型与 JDBC 类型的转换。

    • 根据 @Param 注解或参数顺序绑定到 SQL 中的 #{param} 占位符。

SQL 执行

  • Executor 执行

    • SimpleExecutor:每次执行新 SQL(默认)。

    • ReuseExecutor:复用预处理语句(PreparedStatement)。

    • BatchExecutor:批量操作。

    • CachingExecutor(二级缓存):优先查询缓存,未命中则委托给其他执行器。

  • StatementHandler:处理 Statement(如 PreparedStatement)的创建、参数填充。

  • ParameterHandler:将 Java 参数转换为 JDBC 参数。

结果映射

  • ResultSetHandler:将 ResultSet 转换为 Java 对象:

    • 根据 resultType/resultMap 配置映射字段。

    • 使用 TypeHandler 处理类型转换。

    • 支持嵌套查询(association/collection)。