Mybatis源码分析——Executor

在 MyBatis 中,Executor 是负责执行 SQL 语句的核心组件之一,它直接与数据库进行交互。Executor 的主要任务是执行数据库操作并处理结果,支持增、删、改、查(CRUD)操作。MyBatis 中的 Executor 是一个接口,通常有几种不同的实现方式,每种实现方式适用于不同的场景。

Executor 概述

Executor 是 MyBatis 框架中执行 SQL 语句的主要接口。它处理 SQL 会话的生命周期,负责查询、插入、更新和删除操作。Executor 的实现通过执行缓存、事务控制、结果映射等功能进行优化。

Executor 接口的主要方法

Executor 接口有多个方法,主要有以下几种:

  1. update(MapperStatement ms, Object parameter)

    • 执行更新操作,如 INSERTUPDATEDELETE
    • MapperStatement 包含 SQL 语句和相关元数据,parameter 是传递给 SQL 语句的参数。
    • 返回值是执行的记录数。
  2. query(MapperStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler)

    • 执行查询操作,返回查询结果。
    • RowBounds 用于分页控制,ResultHandler 用于处理查询结果。
  3. batch(MapperStatement ms, List<Object> parameters)

    • 执行批量操作。这个方法通常用于批量插入、更新或删除。
  4. commit(boolean required)

    • 提交事务。如果事务是由当前 Executor 管理的,则提交事务。
  5. rollback(boolean required)

    • 回滚事务。如果事务是由当前 Executor 管理的,则回滚事务。
  6. flushStatements()

    • 刷新所有缓存的 SQL 语句并执行它们。
  7. getTransaction()

    • 获取当前执行器的事务管理器。

Executor 的实现类

Executor 接口有几个不同的实现类,分别适用于不同的场景:

  1. SimpleExecutor

    • 是 MyBatis 中最基本的 Executor 实现,每次执行 SQL 语句时都会重新创建一个 Statement(如 PreparedStatement),并立即执行 SQL 语句。
    • 适用于对性能要求不高、对事务控制要求较简单的场景。
    • 它不使用缓存,每次执行都会查询数据库。
  2. ReuseExecutor

    • 这个实现会缓存已创建的 Statement(即 PreparedStatement),下次相同 SQL 会复用该 Statement
    • 可以提高性能,避免重复解析相同的 SQL。
    • 适用于重复执行相同 SQL 的场景。
  3. BatchExecutor

    • 该实现将多个 SQL 操作合并为一个批量操作,通过 addBatchexecuteBatch 来减少数据库交互的次数,适用于批量操作。
    • 适用于批量插入、更新、删除的场景。

事务管理与 Executor

Executor 通常与 MyBatis 的事务管理紧密结合。Executor 的事务控制方法,如 commit()rollback(),与数据库事务密切相关。MyBatis 提供了一个统一的事务管理接口,并通过 Executor 来执行事务提交与回滚。

  • 在事务模式下,Executor 会在每次执行 SQL 语句时检查是否需要开启新事务,或者在同一事务内执行。
  • Executor 会根据事务的提交和回滚状态,确保数据库操作的一致性。

ExecutorStatementHandler 的关系

ExecutorStatementHandler 之间有着密切的关系。StatementHandler 负责准备 SQL 语句及其参数,而 Executor 负责执行这些语句。

  1. 执行查询时

    • Executor 调用 StatementHandler 来准备 Statement,设置参数,然后执行 SQL 查询。
  2. 执行更新时

    • Executor 会通过 StatementHandler 准备好 PreparedStatement,并执行更新操作。

执行 SQL 的流程

下面是 Executor 执行 SQL 的简化流程:

  1. 创建 Executor:根据配置选择 SimpleExecutorReuseExecutorBatchExecutor

  2. 创建 StatementHandlerExecutor 会为每一个 SQL 语句创建一个 StatementHandler,负责处理 SQL 的准备和参数的绑定。

  3. 执行 SQL

    • Executor 会调用 StatementHandler 来准备 SQL 语句和参数,然后执行 SQL 操作。
  4. 处理结果

    • Executor 会处理 StatementHandler 返回的结果(如 ResultSet),并将结果映射为 Java 对象。
  5. 提交事务/回滚事务:在事务管理下,Executor 会处理事务的提交和回滚。

代码示例:Executor 的简化使用

public class MyBatisExecutorExample {
    public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = ... // 获取 SqlSessionFactory
        try (SqlSession session = sqlSessionFactory.openSession()) {
            // 获取 Executor
            Executor executor = session.getExecutor();

            // 创建 MapperStatement
            MapperStatement ms = ...; // 用于描述 SQL 语句

            // 执行查询操作
            List<MyObject> result = executor.query(ms, null, RowBounds.DEFAULT, null);

            // 执行更新操作
            int rowsAffected = executor.update(ms, new Object());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

总结

  • Executor 是 MyBatis 中执行 SQL 操作的核心接口,负责执行 CRUD 操作,处理事务提交/回滚,以及缓存和批量操作的优化。
  • 它的实现类(如 SimpleExecutorReuseExecutorBatchExecutor)适用于不同的使用场景,提供了不同的性能优化和事务控制方式。
  • Executor 通常与 StatementHandler 一起协作,StatementHandler 负责 SQL 语句的创建和参数绑定,而 Executor 负责执行这些语句并处理事务。

Executor 是 MyBatis 中的核心部分,理解它的工作原理对于深入学习 MyBatis 框架至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值