MyBatis Executor 的作用是什么?

Executor 在 MyBatis 中扮演着至关重要的角色,它是 MyBatis 框架中负责 SQL 执行的核心组件。 你可以将 Executor 理解为 MyBatis 的 SQL 执行引擎

Executor 的核心作用概括:

Executor 的主要作用是 执行 SQL 语句,并管理 SQL 执行过程中的各种细节,例如 statement 的创建和复用、参数的设置、结果集的处理、事务的管理、以及一级缓存和二级缓存的管理等。 Executor 抽象了底层的 JDBC 操作,为 MyBatis 的其他组件 (如 SqlSession, Mappers) 提供了更高层次的、更易于使用的 SQL 执行接口。

更详细的解释和作用分解:

  1. SQL 执行核心:

    • Executor 是 MyBatis 中 真正执行 SQL 语句的组件。 当 SqlSession 或 Mapper 接口方法被调用时,最终会委托给 Executor 来执行 SQL 操作。
    • Executor 接收来自 SqlSession 的请求,例如执行 select, insert, update, delete 操作,然后负责 与数据库进行交互,执行 SQL 语句,并返回执行结果。
  2. JDBC 操作的抽象和封装:

    • Executor 抽象和封装了底层的 JDBC 操作细节。 开发者在使用 MyBatis 时,无需直接操作 JDBC API (例如 Connection, Statement, ResultSet 等),而是通过 Executor 提供的接口进行数据库交互。
    • Executor 内部负责 获取数据库连接 (Connection)、创建 Statement 对象、设置 SQL 参数、执行 SQL 语句、处理 ResultSet、关闭 StatementConnection 等繁琐的 JDBC 操作。 开发者只需要关注 SQL 语句本身和输入输出参数,无需关心 JDBC 的细节。
    • 这种抽象简化了数据库访问代码,提高了开发效率,并降低了代码的复杂性和维护成本.
  3. Statement Handler (语句处理器) 的管理:

    • Executor 负责 创建和管理 StatementHandler 对象StatementHandler 是 MyBatis 中用于 处理 JDBC Statement 对象 的组件。
    • StatementHandler 负责 prepareStatement (预编译 SQL)、parameterize (设置 SQL 参数)、handleResultSets (处理结果集) 等与 JDBC Statement 对象相关的操作。
    • Executor 通过 StatementHandler 将 SQL 语句的预编译、参数设置和结果集处理等操作进一步委托出去,使得 Executor 自身可以专注于事务管理和缓存管理等更高层次的职责。
  4. Result Handler (结果处理器) 的管理:

    • Executor 负责 创建和管理 ResultHandler 对象ResultHandler 是 MyBatis 中用于 处理 ResultSet (结果集) 的组件。
    • ResultHandler 负责 逐行遍历 ResultSet,并将每一行数据按照 ResultMapresultType 定义的映射规则,映射到 Java 对象。
    • Executor 通过 ResultHandler 将结果集的处理和映射操作委托出去,使得 Executor 自身可以专注于 SQL 执行和缓存管理等职责。
  5. 事务管理 (Transaction Management):

    • Executor 参与 MyBatis 的事务管理。 虽然事务的开始和提交/回滚通常由 SqlSession 控制,但 Executor 负责 Transaction 对象交互,获取和管理数据库连接 (Connection),控制事务的生命周期。
    • Executor根据配置的事务管理器 (TransactionFactoryTransaction) 类型,获取合适的 Transaction 对象。 MyBatis 默认提供了 JdbcTransaction (JDBC 事务) 和 ManagedTransaction (容器管理事务) 两种事务管理器。
    • Executor在事务的生命周期内,重用同一个数据库连接 (Connection),保证事务的原子性。
    • Executor在事务结束时,负责关闭 Connection 对象,并将其归还给连接池 (如果使用了连接池数据源)。
  6. 一级缓存 (First Level Cache) 管理:

    • Executor 负责 管理 MyBatis 的一级缓存 (也称为本地缓存,Local Cache)。 一级缓存是 SqlSession 级别的缓存,作用域是 SqlSession 的生命周期。
    • 一级缓存用于缓存同一个 SqlSession 中执行的查询结果。 如果在一个 SqlSession 中多次执行相同的查询 (SQL 语句和参数相同),第二次及以后的查询可以直接从一级缓存中获取结果,避免重复查询数据库,提高性能。
    • Executor在执行查询前,先检查一级缓存中是否已存在相同查询的结果。 如果缓存命中,则直接返回缓存结果。 如果缓存未命中,则执行数据库查询,并将查询结果添加到一级缓存中。
    • Executor在执行更新、插入、删除操作后,清空一级缓存,保证缓存数据的一致性。
    • 一级缓存默认是开启的,且无法禁用。 但可以通过配置 flushCache="true"flushCache="false" 属性来控制是否在每次 SQL 执行后刷新一级缓存。
  7. 二级缓存 (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 等)。
  8. ExecutorType (执行器类型) 的选择和控制:

    • MyBatis 提供了不同的 ExecutorType (执行器类型),例如 SIMPLE, REUSE, BATCHExecutor 接口及其实现类定义了这些执行器类型的通用接口和行为。
    • SqlSession 可以指定使用的 ExecutorType 不同的 ExecutorType 会影响 SQL 执行的性能和行为 (例如是否复用 Statement, 是否支持批量操作)。
    • Executor根据 SqlSession 指定的 ExecutorType,创建不同类型的 StatementHandlerBatchResultHandler,并采用不同的 SQL 执行策略。
  9. SqlSession 的关系:委托和协作

    • SqlSession 是 MyBatis 对外提供的 API 接口,开发者通过 SqlSession 进行数据库操作。
    • Executor 是 MyBatis 内部的 SQL 执行引擎,SqlSession 将 SQL 执行请求委托给 Executor 来处理。
    • SqlSession 负责管理事务的开始和提交/回滚,Executor 负责在事务的生命周期内执行 SQL 语句和管理缓存。
    • SqlSessionExecutor 协同工作,共同完成 MyBatis 的数据库访问任务。 SqlSession 负责对外接口和事务控制,Executor 负责 SQL 执行和底层细节。

ExecutorType (执行器类型):

MyBatis 提供了三种内置的 ExecutorType

  • SIMPLE (简单执行器):

    • 特点: 每次执行 SQL 语句都会创建一个新的 Statement 对象。
    • 适用场景: 简单查询、少量 SQL 操作。 性能相对较低,但实现简单。
    • 优点: 实现简单,易于理解和调试。
    • 缺点: 性能较低,不适合高并发或批量操作场景。
  • REUSE (复用执行器):

    • 特点: 复用 Statement 对象。 对于相同的 SQL 语句 (只是参数不同),可以复用之前创建的 Statement 对象,减少 Statement 对象的创建和预编译开销,提高性能。
    • 适用场景: 需要重复执行相同 SQL 语句的场景,例如循环查询、分页查询等。 性能比 SIMPLE 执行器高。
    • 优点: 性能比 SIMPLE 执行器高,减少 Statement 创建和预编译开销。
    • 缺点: 某些数据库驱动可能不支持 Statement 复用,或者复用效果不佳。
  • BATCH (批量执行器):

    • 特点: 支持批量执行 SQL 语句。 可以将多条 SQL 语句 (例如多个 INSERT, UPDATE, DELETE 语句) 收集起来,一次性发送到数据库执行,减少客户端和数据库之间的网络交互次数,显著提高批量操作的性能。
    • 适用场景: 批量插入、批量更新、批量删除等批量操作场景。 性能最高,但需要 SQL 语句支持批量执行。
    • 优点: 性能最高,大幅提升批量操作效率,减少网络开销。
    • 缺点: 只适用于批量操作场景,对于单条 SQL 执行,性能提升不明显。 需要数据库驱动和 SQL 语句支持批量执行。 批量操作可能会占用较多内存。

总结 Executor 的作用:

  • SQL 执行引擎: MyBatis 中真正执行 SQL 语句的核心组件。
  • JDBC 操作抽象: 抽象和封装了底层的 JDBC 操作细节,简化数据库访问。
  • StatementHandler 和 ResultHandler 管理: 管理 StatementHandlerResultHandler,将 SQL 执行和结果处理委托出去。
  • 事务管理: 参与 MyBatis 的事务管理,管理数据库连接和事务生命周期.
  • 一级缓存管理: 管理 SqlSession 级别的一级缓存,提高查询性能。
  • 二级缓存集成: 与二级缓存集成,实现跨 SqlSession 的缓存。
  • ExecutorType 控制: 根据 ExecutorType 选择不同的执行器类型,影响 SQL 执行策略和性能。
  • SqlSession 的委托者: SqlSession 将 SQL 执行请求委托给 Executor 处理.

Executor 是 MyBatis 框架的核心和灵魂,它负责 SQL 执行的方方面面,并将底层的数据库操作细节隐藏起来,在开发过程中为我们提供了简洁、高效、可配置的数据库访问接口。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值