目录
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 都会创建一个新的 Statement 对象,执行完毕后立即关闭。
-
简单直接,但频繁创建和销毁 Statement 可能影响性能。
-
SimpleExecutor: 多次预编译、多次传参处理、多次执行
适用场景:
-
常规单条 SQL 执行。
-
不需要复用 Statement 或批量操作的场景。
代码示例:
2、ReuseExecutor(可重用执行器)
特点:
-
缓存同一个 SQL 对应的 Statement 对象,避免重复创建。
-
以 SQL 语句为 Key 缓存 Statement,同一会话(SqlSession)内相同 SQL 可复用。statementMap.put(sql, stmt);
-
性能优于 SimpleExecutor(减少创建 Statement 的开销)
-
ReuseExecutor: 一次预编译、多次传参处理、多次执行
注意事项:
-
在事务提交或回滚时,会自动关闭缓存的 Statement。
-
不适用于多线程环境(SqlSession 非线程安全)
适用场景:
- 同一会话中多次执行相同 SQL
代码示例:
3、BatchExecutor(批量执行器)
特点:
-
将多个 UPDATE/INSERT/DELETE 操作批量提交,减少数据库交互次数。
-
通过 addBatch() 缓存操作,调用 flushStatements() 时一次性提交。
-
对 SELECT 无效,SELECT 会立即执行。
-
BatchExecutor: 一次预编译、多次传参处、一次执行
注意事项:
-
需手动调用 flushStatements() 或通过事务提交触发批量执行。
-
需结合事务管理,避免部分失败导致数据不一致。
适用场景:
- 批量插入、更新或删除操作(如导入数据)
代码示例: