Executor 在 MyBatis 中扮演着至关重要的角色,它是 MyBatis 框架中负责 SQL 执行的核心组件。 你可以将 Executor 理解为 MyBatis 的 SQL 执行引擎。
Executor 的核心作用概括:
Executor 的主要作用是 执行 SQL 语句,并管理 SQL 执行过程中的各种细节,例如 statement 的创建和复用、参数的设置、结果集的处理、事务的管理、以及一级缓存和二级缓存的管理等。 Executor 抽象了底层的 JDBC 操作,为 MyBatis 的其他组件 (如 SqlSession, Mappers) 提供了更高层次的、更易于使用的 SQL 执行接口。
更详细的解释和作用分解:
-
SQL 执行核心:
Executor是 MyBatis 中 真正执行 SQL 语句的组件。 当SqlSession或 Mapper 接口方法被调用时,最终会委托给Executor来执行 SQL 操作。Executor接收来自SqlSession的请求,例如执行select,insert,update,delete操作,然后负责 与数据库进行交互,执行 SQL 语句,并返回执行结果。
-
JDBC 操作的抽象和封装:
Executor抽象和封装了底层的 JDBC 操作细节。 开发者在使用 MyBatis 时,无需直接操作 JDBC API (例如Connection,Statement,ResultSet等),而是通过Executor提供的接口进行数据库交互。Executor内部负责 获取数据库连接 (Connection)、创建Statement对象、设置 SQL 参数、执行 SQL 语句、处理ResultSet、关闭Statement和Connection等繁琐的 JDBC 操作。 开发者只需要关注 SQL 语句本身和输入输出参数,无需关心 JDBC 的细节。- 这种抽象简化了数据库访问代码,提高了开发效率,并降低了代码的复杂性和维护成本.
-
Statement Handler (语句处理器) 的管理:
Executor负责 创建和管理StatementHandler对象。StatementHandler是 MyBatis 中用于 处理 JDBCStatement对象 的组件。StatementHandler负责 prepareStatement (预编译 SQL)、parameterize (设置 SQL 参数)、handleResultSets (处理结果集) 等与 JDBCStatement对象相关的操作。Executor通过StatementHandler将 SQL 语句的预编译、参数设置和结果集处理等操作进一步委托出去,使得Executor自身可以专注于事务管理和缓存管理等更高层次的职责。
-
Result Handler (结果处理器) 的管理:
Executor负责 创建和管理ResultHandler对象。ResultHandler是 MyBatis 中用于 处理ResultSet(结果集) 的组件。ResultHandler负责 逐行遍历ResultSet,并将每一行数据按照ResultMap或resultType定义的映射规则,映射到 Java 对象。Executor通过ResultHandler将结果集的处理和映射操作委托出去,使得Executor自身可以专注于 SQL 执行和缓存管理等职责。
-
事务管理 (Transaction Management):
Executor参与 MyBatis 的事务管理。 虽然事务的开始和提交/回滚通常由SqlSession控制,但Executor负责 与Transaction对象交互,获取和管理数据库连接 (Connection),控制事务的生命周期。Executor会 根据配置的事务管理器 (TransactionFactory和Transaction) 类型,获取合适的Transaction对象。 MyBatis 默认提供了JdbcTransaction(JDBC 事务) 和ManagedTransaction(容器管理事务) 两种事务管理器。Executor会 在事务的生命周期内,重用同一个数据库连接 (Connection),保证事务的原子性。Executor会 在事务结束时,负责关闭Connection对象,并将其归还给连接池 (如果使用了连接池数据源)。
-
一级缓存 (First Level Cache) 管理:
Executor负责 管理 MyBatis 的一级缓存 (也称为本地缓存,Local Cache)。 一级缓存是 SqlSession 级别的缓存,作用域是SqlSession的生命周期。- 一级缓存用于缓存同一个
SqlSession中执行的查询结果。 如果在一个SqlSession中多次执行相同的查询 (SQL 语句和参数相同),第二次及以后的查询可以直接从一级缓存中获取结果,避免重复查询数据库,提高性能。 Executor会 在执行查询前,先检查一级缓存中是否已存在相同查询的结果。 如果缓存命中,则直接返回缓存结果。 如果缓存未命中,则执行数据库查询,并将查询结果添加到一级缓存中。Executor会 在执行更新、插入、删除操作后,清空一级缓存,保证缓存数据的一致性。- 一级缓存默认是开启的,且无法禁用。 但可以通过配置
flushCache="true"或flushCache="false"属性来控制是否在每次 SQL 执行后刷新一级缓存。
-
二级缓存 (Second Level Cache) 的集成和管理:
Executor与 MyBatis 的二级缓存 (也称为全局缓存,Global Cache) 集成。 二级缓存是SqlSessionFactory级别的缓存,作用域是整个应用。- 二级缓存用于跨
SqlSession缓存查询结果。 如果多个SqlSession执行相同的查询 (SQL 语句和参数相同,并且配置了二级缓存),第二次及以后的查询可以从二级缓存中获取结果,进一步提高性能。 - 二级缓存需要显式配置才能启用。 可以在
mybatis-config.xml或 Mapper XML 文件中配置<cache>元素来启用二级缓存。 - 当配置了二级缓存时,
Executor会 在执行查询前,先检查二级缓存中是否已存在相同查询的结果 (如果开启了二级缓存)。 如果二级缓存命中,则直接返回二级缓存结果。 如果二级缓存未命中,则继续查询一级缓存和数据库。 Executor会 负责与Cache对象 (代表二级缓存) 交互,进行缓存的读取、写入和失效操作。- 二级缓存的缓存失效策略需要根据具体的缓存实现来决定。 MyBatis 默认使用
PerpetualCache(永久缓存),也可以配置其他缓存实现 (例如LRU,FIFO,EHCache,Redis等)。
-
ExecutorType (执行器类型) 的选择和控制:
- MyBatis 提供了不同的
ExecutorType(执行器类型),例如SIMPLE,REUSE,BATCH。Executor接口及其实现类定义了这些执行器类型的通用接口和行为。 SqlSession可以指定使用的ExecutorType。 不同的ExecutorType会影响 SQL 执行的性能和行为 (例如是否复用Statement, 是否支持批量操作)。Executor会 根据SqlSession指定的ExecutorType,创建不同类型的StatementHandler和BatchResultHandler,并采用不同的 SQL 执行策略。
- MyBatis 提供了不同的
-
与
SqlSession的关系:委托和协作SqlSession是 MyBatis 对外提供的 API 接口,开发者通过SqlSession进行数据库操作。Executor是 MyBatis 内部的 SQL 执行引擎,SqlSession将 SQL 执行请求委托给Executor来处理。SqlSession负责管理事务的开始和提交/回滚,Executor负责在事务的生命周期内执行 SQL 语句和管理缓存。SqlSession和Executor协同工作,共同完成 MyBatis 的数据库访问任务。SqlSession负责对外接口和事务控制,Executor负责 SQL 执行和底层细节。
ExecutorType (执行器类型):
MyBatis 提供了三种内置的 ExecutorType:
-
SIMPLE(简单执行器):- 特点: 每次执行 SQL 语句都会创建一个新的
Statement对象。 - 适用场景: 简单查询、少量 SQL 操作。 性能相对较低,但实现简单。
- 优点: 实现简单,易于理解和调试。
- 缺点: 性能较低,不适合高并发或批量操作场景。
- 特点: 每次执行 SQL 语句都会创建一个新的
-
REUSE(复用执行器):- 特点: 复用
Statement对象。 对于相同的 SQL 语句 (只是参数不同),可以复用之前创建的Statement对象,减少Statement对象的创建和预编译开销,提高性能。 - 适用场景: 需要重复执行相同 SQL 语句的场景,例如循环查询、分页查询等。 性能比
SIMPLE执行器高。 - 优点: 性能比
SIMPLE执行器高,减少Statement创建和预编译开销。 - 缺点: 某些数据库驱动可能不支持
Statement复用,或者复用效果不佳。
- 特点: 复用
-
BATCH(批量执行器):- 特点: 支持批量执行 SQL 语句。 可以将多条 SQL 语句 (例如多个
INSERT,UPDATE,DELETE语句) 收集起来,一次性发送到数据库执行,减少客户端和数据库之间的网络交互次数,显著提高批量操作的性能。 - 适用场景: 批量插入、批量更新、批量删除等批量操作场景。 性能最高,但需要 SQL 语句支持批量执行。
- 优点: 性能最高,大幅提升批量操作效率,减少网络开销。
- 缺点: 只适用于批量操作场景,对于单条 SQL 执行,性能提升不明显。 需要数据库驱动和 SQL 语句支持批量执行。 批量操作可能会占用较多内存。
- 特点: 支持批量执行 SQL 语句。 可以将多条 SQL 语句 (例如多个
总结 Executor 的作用:
- SQL 执行引擎: MyBatis 中真正执行 SQL 语句的核心组件。
- JDBC 操作抽象: 抽象和封装了底层的 JDBC 操作细节,简化数据库访问。
- StatementHandler 和 ResultHandler 管理: 管理
StatementHandler和ResultHandler,将 SQL 执行和结果处理委托出去。 - 事务管理: 参与 MyBatis 的事务管理,管理数据库连接和事务生命周期.
- 一级缓存管理: 管理 SqlSession 级别的一级缓存,提高查询性能。
- 二级缓存集成: 与二级缓存集成,实现跨 SqlSession 的缓存。
- ExecutorType 控制: 根据
ExecutorType选择不同的执行器类型,影响 SQL 执行策略和性能。 SqlSession的委托者:SqlSession将 SQL 执行请求委托给Executor处理.
Executor 是 MyBatis 框架的核心和灵魂,它负责 SQL 执行的方方面面,并将底层的数据库操作细节隐藏起来,在开发过程中为我们提供了简洁、高效、可配置的数据库访问接口。

360

被折叠的 条评论
为什么被折叠?



