1. 三种执行器类型及特点
| 执行器类型 | 缓存机制 | 适用场景 | 优缺点 |
|---|---|---|---|
| SimpleExecutor | 不缓存 Statement 对象 | 常规查询 | 轻量级,但频繁创建/关闭 Statement |
| ReuseExecutor | 复用预处理 Statement 对象(按SQL) | 同SQL频繁执行(如批量插入) | 减少预处理开销,但需手动清理缓存 |
| BatchExecutor | 批量操作,非实时执行 | 大批量增删改 | 大幅提升批量性能,但需 |
2. 具体区别与示例
(1) SimpleExecutor(默认)
-
行为:每次执行 SQL 都会创建新的
PreparedStatement,执行完后立即关闭。 -
示例:
// 连续执行两次相同SQL List<User> users1 = sqlSession.selectList("selectUsers"); // 创建新Statement List<User> users2 = sqlSession.selectList("selectUsers"); // 再次创建新Statement结果:两次查询均独立执行,无缓存优化。
(2) ReuseExecutor
-
行为:缓存相同的 SQL 对应的
PreparedStatement,避免重复预处理。 -
示例:
// 配置使用ReuseExecutor SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.REUSE); // 同一SQL执行两次 List<User> users1 = sqlSession.selectList("selectUsers"); // 预处理并缓存Statement List<User> users2 = sqlSession.selectList("selectUsers"); // 复用缓存的Statement结果:第二次查询复用预处理对象,减少数据库开销。
(3) BatchExecutor
-
行为:将多个更新操作(INSERT/UPDATE/DELETE)攒成一批,统一提交。
-
示例:
// 配置使用BatchExecutor SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 批量插入(不会立即执行) mapper.insertUser(new User(1, "Alice")); mapper.insertUser(new User(2, "Bob")); // 手动提交时一次性执行 sqlSession.commit(); // 发送批量SQL到数据库结果:两条 INSERT 合并为一次网络请求,性能显著提升。
3. 如何选择执行器?
| 场景 | 推荐执行器 | 原因 |
|---|---|---|
| 高频单条查询 | SimpleExecutor | 无缓存开销,适合简单场景 |
| 同SQL频繁执行(如循环插入) | ReuseExecutor | 复用预处理对象,减少数据库压力 |
| 大批量数据插入/更新 | BatchExecutor | 合并网络请求,性能提升10倍以上 |
4. 配置方式
(1) 全局配置(mybatis-config.xml)
<settings>
<setting name="defaultExecutorType" value="REUSE"/> <!-- 默认SIMPLE -->
</settings>
(2) 局部指定(SqlSession级别)
// 创建SqlSession时指定
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
总结
SimpleExecutor:默认选择,适合大多数查询场景。
ReuseExecutor:优化同SQL重复执行,减少预处理开销。
BatchExecutor:批量操作神器,但需手动提交。
建议:在批量场景中主动使用 BatchExecutor,其他情况默认即可。


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



