在 MyBatis 中,Executor
是负责执行 SQL 语句的核心组件之一,它直接与数据库进行交互。Executor
的主要任务是执行数据库操作并处理结果,支持增、删、改、查(CRUD)操作。MyBatis 中的 Executor
是一个接口,通常有几种不同的实现方式,每种实现方式适用于不同的场景。
Executor
概述
Executor
是 MyBatis 框架中执行 SQL 语句的主要接口。它处理 SQL 会话的生命周期,负责查询、插入、更新和删除操作。Executor
的实现通过执行缓存、事务控制、结果映射等功能进行优化。
Executor
接口的主要方法
Executor
接口有多个方法,主要有以下几种:
-
update(MapperStatement ms, Object parameter)
:- 执行更新操作,如
INSERT
、UPDATE
或DELETE
。 MapperStatement
包含 SQL 语句和相关元数据,parameter
是传递给 SQL 语句的参数。- 返回值是执行的记录数。
- 执行更新操作,如
-
query(MapperStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler)
:- 执行查询操作,返回查询结果。
RowBounds
用于分页控制,ResultHandler
用于处理查询结果。
-
batch(MapperStatement ms, List<Object> parameters)
:- 执行批量操作。这个方法通常用于批量插入、更新或删除。
-
commit(boolean required)
:- 提交事务。如果事务是由当前
Executor
管理的,则提交事务。
- 提交事务。如果事务是由当前
-
rollback(boolean required)
:- 回滚事务。如果事务是由当前
Executor
管理的,则回滚事务。
- 回滚事务。如果事务是由当前
-
flushStatements()
:- 刷新所有缓存的 SQL 语句并执行它们。
-
getTransaction()
:- 获取当前执行器的事务管理器。
Executor
的实现类
Executor
接口有几个不同的实现类,分别适用于不同的场景:
-
SimpleExecutor
:- 是 MyBatis 中最基本的
Executor
实现,每次执行 SQL 语句时都会重新创建一个Statement
(如PreparedStatement
),并立即执行 SQL 语句。 - 适用于对性能要求不高、对事务控制要求较简单的场景。
- 它不使用缓存,每次执行都会查询数据库。
- 是 MyBatis 中最基本的
-
ReuseExecutor
:- 这个实现会缓存已创建的
Statement
(即PreparedStatement
),下次相同 SQL 会复用该Statement
。 - 可以提高性能,避免重复解析相同的 SQL。
- 适用于重复执行相同 SQL 的场景。
- 这个实现会缓存已创建的
-
BatchExecutor
:- 该实现将多个 SQL 操作合并为一个批量操作,通过
addBatch
和executeBatch
来减少数据库交互的次数,适用于批量操作。 - 适用于批量插入、更新、删除的场景。
- 该实现将多个 SQL 操作合并为一个批量操作,通过
事务管理与 Executor
Executor
通常与 MyBatis 的事务管理紧密结合。Executor
的事务控制方法,如 commit()
和 rollback()
,与数据库事务密切相关。MyBatis 提供了一个统一的事务管理接口,并通过 Executor
来执行事务提交与回滚。
- 在事务模式下,
Executor
会在每次执行 SQL 语句时检查是否需要开启新事务,或者在同一事务内执行。 Executor
会根据事务的提交和回滚状态,确保数据库操作的一致性。
Executor
和 StatementHandler
的关系
Executor
与 StatementHandler
之间有着密切的关系。StatementHandler
负责准备 SQL 语句及其参数,而 Executor
负责执行这些语句。
-
执行查询时:
Executor
调用StatementHandler
来准备Statement
,设置参数,然后执行 SQL 查询。
-
执行更新时:
Executor
会通过StatementHandler
准备好PreparedStatement
,并执行更新操作。
执行 SQL 的流程
下面是 Executor
执行 SQL 的简化流程:
-
创建 Executor:根据配置选择
SimpleExecutor
、ReuseExecutor
或BatchExecutor
。 -
创建 StatementHandler:
Executor
会为每一个 SQL 语句创建一个StatementHandler
,负责处理 SQL 的准备和参数的绑定。 -
执行 SQL:
Executor
会调用StatementHandler
来准备 SQL 语句和参数,然后执行 SQL 操作。
-
处理结果:
Executor
会处理StatementHandler
返回的结果(如ResultSet
),并将结果映射为 Java 对象。
-
提交事务/回滚事务:在事务管理下,
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 操作,处理事务提交/回滚,以及缓存和批量操作的优化。- 它的实现类(如
SimpleExecutor
、ReuseExecutor
和BatchExecutor
)适用于不同的使用场景,提供了不同的性能优化和事务控制方式。 Executor
通常与StatementHandler
一起协作,StatementHandler
负责 SQL 语句的创建和参数绑定,而Executor
负责执行这些语句并处理事务。
Executor
是 MyBatis 中的核心部分,理解它的工作原理对于深入学习 MyBatis 框架至关重要。