对Mybatis的Executor执行器种类的个人解读

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,其他情况默认即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值