MyBatis 中的三种执行器(Executor)

在 MyBatis 中,Executor 是一个重要的接口,它负责执行实际的数据库操作。MyBatis 提供了三种不同的 Executor 执行器类型,以满足不同的性能需求和场景。下面我会详细解释这三种 Executor,以及如何选择和配置它们。

1. MyBatis 中的三种执行器(Executor)

(1) SimpleExecutor(简单执行器)
  • 特点

    • 每执行一次数据库操作(如 updateselect),就会创建一个新的 Statement 对象(即数据库连接的 SQL 执行对象)。
    • 执行完后,Statement 对象立刻关闭。
    • 适用于每次操作的开销较低,但在频繁执行 SQL 时效率较低,因为每次都要创建和关闭 Statement
  • 适用场景

    • 单次执行 SQL 查询,性能要求较低,或者每次 SQL 操作独立时。
  • 工作原理: 每次执行 SQL 时,SimpleExecutor 都会创建一个新的 Statement 对象,执行完后立刻关闭它。

  • 代码示例

    • 如果你没有特殊配置,MyBatis 默认会使用 SimpleExecutor 执行单个 SQL 操作。
(2) ReuseExecutor(重复使用执行器)
  • 特点

    • 通过 SQL 做为 key 来缓存 Statement 对象,避免每次执行时都重新创建 Statement 对象。
    • 如果存在相同的 SQL,直接复用缓存的 Statement,而不是每次都关闭后重新创建。
    • 这种方式可以提高性能,因为避免了重复创建和关闭 Statement 对象。
    • Statement 对象在执行完成后不会关闭,而是放入 Map 中缓存,等待下次使用。
  • 适用场景

    • 当多次执行相同 SQL(即查询或更新)时,复用 Statement 对象可以节省创建和销毁 Statement 的开销。
  • 工作原理

    • 执行 SQL 时,ReuseExecutor 会根据 SQL 判断是否已有缓存的 Statement 对象,如果有,就复用它;如果没有,则创建新的 Statement 并缓存。
    • 执行后,Statement 不会关闭,保持在缓存中。
(3) BatchExecutor(批处理执行器)
  • 特点

    • 用于批量执行 SQL,尤其是多次 update 操作。
    • 将多个 SQL 语句通过 addBatch() 方法添加到批处理中,直到所有 SQL 语句都添加完毕,再通过 executeBatch() 方法统一执行。
    • 这种方式会缓存多个 Statement 对象,避免频繁提交,每次提交是一个批处理(批量操作的方式)。
    • 批处理的优势在于,能够一次性提交多条 SQL,减少了与数据库的交互次数,提高了性能。
  • 适用场景

    • 适用于批量处理操作,如批量插入、批量更新等场景,可以显著提高性能。
  • 工作原理

    • 执行时,所有的 SQL 都被添加到批处理中,等所有 SQL 都准备好后再统一提交。通过 executeBatch() 执行所有待处理的 SQL。
  • 代码示例

    SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
    try {
        session.insert("insertData", data1);
        session.insert("insertData", data2);
        session.flushStatements();  // 执行批处理
    } finally {
        session.close();
    }
    

2. Executor 的作用范围

每种 Executor 执行器的作用范围是严格限定在 SqlSession 生命周期 内的。也就是说,Executor 对象在每个 SqlSession 中都会创建,并且与 SqlSession 绑定。一个 SqlSession 内的操作会使用同一个 Executor 执行器。

3. 如何在 MyBatis 中指定使用哪一种 Executor 执行器?

MyBatis 允许你在配置文件中或者在创建 SqlSession 时指定使用哪种 Executor 执行器。你可以根据应用的需求选择合适的执行器。

(1)在 MyBatis 配置文件中指定执行器

在 MyBatis 的配置文件 mybatis-config.xml 中,你可以指定 Executor 的类型。例如,下面的配置将使用 BatchExecutor 来执行批处理:


    
        
    

  • defaultExecutorType 可以设置为以下几种类型:
    • SIMPLE:使用 SimpleExecutor(默认值)。
    • REUSE:使用 ReuseExecutor
    • BATCH:使用 BatchExecutor
(2)在创建 SqlSession 时指定执行器

除了在配置文件中指定外,你还可以在代码中创建 SqlSession 时指定 ExecutorType

SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.REUSE);

这样,在这个 SqlSession 的生命周期内,会使用 ReuseExecutor 执行 SQL。

4. 总结

执行器类型 主要特点 使用场景
SimpleExecutor 每次执行 SQL 时创建新的 Statement,用完立即关闭。 单次执行 SQL 查询,性能要求不高。
ReuseExecutor 缓存 Statement,相同 SQL 复用已创建的 Statement 多次执行相同 SQL,减少 Statement 创建销毁的开销。
BatchExecutor 将多个 SQL 语句批量执行,减少与数据库的交互次数。 批量操作,如批量插入、批量更新等。

通过选择不同的执行器,MyBatis 可以适应不同的性能需求,开发者可以根据实际场景优化数据库操作的效率。

同时,MyBatis 并不会在运行时自动将 SimpleExecutor 切换到 ReuseExecutor。执行器类型在 SqlSession 的创建时就已经确定,一旦选择了某种执行器,整个 SqlSession 生命周期内都会使用该执行器。

解释:

  • SimpleExecutorReuseExecutor 是两种独立的执行器类型,你需要在配置 SqlSession 时明确选择使用哪一个。如果你没有特别指定,MyBatis 会默认使用 SimpleExecutor
  • 如果你希望在多次执行相同 SQL 时复用 Statement,减少每次创建和销毁的开销,那么你需要显式地指定使用 ReuseExecutor

示例:

  1. 默认的 SimpleExecutor

    SqlSession sqlSession = sqlSessionFactory.openSession();  // 默认使用 SimpleExecutor
    
  2. 使用 ReuseExecutor

    SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.REUSE);  // 使用 ReuseExecutor
    
  • 如果你希望提高性能,并且多次执行相同的 SQL,可以在创建 SqlSession 时指定使用 ReuseExecutor
  • MyBatis 不会自动从 SimpleExecutor 切换到 ReuseExecutor,你需要手动选择执行器类型。

你可能感兴趣的:(面试,mybatis,java,数据库)