01|架构设计

image.png

  • 接口层:对外提供操作数据库数据的API,MyBatis提供了两种方式与数据库进行交互:
    • 基于Statement ID
    • 基于Mapper代理接口
  • 核心层:负责具体SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作
  • 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理等

    02|执行流程

    image.png

    1. 加载配置并初始化
    1. 接收调用请求
    1. 处理操作请求
      • 根据SQL的ID查找对应的MappedStatement对象
      • 根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数
      • 获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果
      • 根据MappedStatement对象中的结果映射配置对得到的结果执行进行转换处理,并得到最终的处理结果
      • 释放连接资源
    1. 返回处理结果

      03|四大核心组件

      Executor

      一个SqlSession对应一个Executor,负责增删改查的具体操作
      SimpleExecutor.png
  • Executor:执行器顶层接口,定义了update、query、commit、rollback等方法

    • BaseExecutor:是使用模版设计模式对Executor的基础实现类,定义了doUpdate、doQuery等抽象方法交由子类实现
      • SimpleExecutor:默认使用的执行器
      • ReuseExecutor:可重用的执行器,可重用的对象为Statement,在执行器内部提供一个Map映射,执行SQL作为key,value为Statement
      • BatchExecutor:批量提交的执行器
    • CachingExecutor:支持结果缓存的SQL执行器,其内部持有Executor对象(可以是具体执行器的任意一个)作为具体执行器

      StatementHandler

      image.png
      StatementHandler是mybatis创建Statement的处理器,负责Statement的创建工作。
  • SimpleStatementHandler:对应java.sql.Statement对象的处理,处理不带动态参数运行的SQL

  • PrepareStatementHandler:对应java.sql.PrepareStatement对象的处理,处理SQL中的占位符动态参数赋值操作
  • CallableStatementHandler:处理存储过程的执行
  • RoutingStatementHandler:依据MappedStatement的StatementType属性选择对应的Handler

    1. public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
    2. switch (ms.getStatementType()) {
    3. case STATEMENT:
    4. delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
    5. break;
    6. case PREPARED:
    7. delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
    8. break;
    9. case CALLABLE:
    10. delegate = new CallableStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
    11. break;
    12. default:
    13. throw new ExecutorException("Unknown statement type: " + ms.getStatementType());
    14. }
    15. }

ParameterHandler

image.png
mybatis提供的参数处理器,用于PreparedStatement参数解析时使用

ResultSetHandler

image.png
负责处理Statement返回的结果,根据定义返回类型进行封装返回