Mybatis三大执行器

目录


1、执行器介绍

  • 执行器的选择入口

  • 设置执行器两种方式

    • 全局配置(不建议)

    • 局部设置(建议)


2、三个执行器区别

  • SimpleExecutor

  • ReuseExecutor

  • BatchExecutor

  • 总结


3、效率测试


4、平时开发使用


一、执行器介绍

Mybatis中执行器关系如上图所示,真正生效并在最后执行中有着不同效果的只有三个执行器:

  • SimpleExecutor:默认的执行器, 对每条sql进行预编译->设置参数->执行等操作

  • ReuseExecutor:重用执行器会重用预处理语句(prepared statements)

  • BatchExecutor:批量执行器, 对相同sql进行一次预编译, 然后设置参数, 最后统一执行操作


1、执行器的选择入口

执行器的选择就在获取SqlSession的时候

内部会调用DefaultSqlSessionFactory.openSessionFromDataSource:

可以会根据ExecutorType来选择获取某种类型执行器,我们平时不会传参,所以默认就是SimpleExecutor

ExecutorType有三种类型,正好与三种执行器对应


2、设置执行器两种方式


a、全局配置(不建议)

在XML配置文件中全局设置


b、局部设置(建议)

就是在获取SqlSession的时候传参,指定该SqlSession采用某种执行器执行


二、三个执行器区别


1、SimpleExecutor(默认执行器)


特点:

  • 每次执行 SQL 都会创建一个新的 PreparedStatement对象【预编译对象】,执行完毕后立即关闭。

  • 简单直接,但频繁创建和销毁 PreparedStatement对象可能影响性能。

  • SimpleExecutor: 多次预编译、多次传参处理、多次执行


适用场景:

  • 常规单条 SQL 执行。

  • 不需要复用 PreparedStatement对象【预编译对象】或 批量操作的场景。


代码示例:


2、ReuseExecutor(可重用执行器)


特点:

  • 以 SQL 语句为 Key 缓存 PreparedStatement对象,同一会话(SqlSession)内相同 SQL 可复用PreparedStatement对象【预编译对象】避免重复创建,statementMap.put(sql, stmt);

  • 性能优于 SimpleExecutor(减少创建 PreparedStatement对象 的开销)

  • ReuseExecutor: 一次预编译、多次传参处理、多次执行


注意事项:

  • 在事务提交或回滚时,会自动关闭缓存的 PreparedStatement对象

  • 不适用于多线程环境(SqlSession 非线程安全)


适用场景:

  • 同一会话中多次执行相同 SQL


代码示例:


3、BatchExecutor(批量执行器)


特点:

  • 将多个 update/insert/delete 操作批量提交,减少数据库交互次数。

  • 将所有sql都添加到 addBatch() 批处理中缓存起来,调用 flushStatements() 时一次性提交。

  • select 无效,select 会立即执行。

  • BatchExecutor: 一次预编译、多次传参处、一次执行


注意事项:

  • 需手动调用 flushStatements() 或 通过事务提交触发批量执行。

  • 需结合事务管理,避免部分失败导致数据不一致。


适用场景:

  • 批量插入、更新或删除操作(如导入数据)


代码示例:

posted @ 2025-03-27 17:16  jock_javaEE  阅读(89)  评论(0)    收藏  举报