【手把手带你玩转MyBatis】深入源码解读MyBatis系列(二):SqlSession与Executor的交互机制

引言

在上一篇中,我们详细剖析了MyBatis如何通过SqlSessionFactoryBuilder解析配置文件并创建出SqlSessionFactory。本篇将继续深入MyBatis的核心运行机制,聚焦于SqlSessionExecutor这两个关键组件之间的协作关系,揭示它们是如何共同完成对数据库操作请求的处理。

1. SqlSession的角色与功能

SqlSession 是MyBatis对外提供的主要API,它代表了一个与数据库的会话,提供了执行SQL、获取映射结果以及管理事务的方法。每个SqlSession实例都与一个数据库连接关联,并且内部持有Executor对象来实际执行SQL语句。

// 从SqlSessionFactory获取SqlSession实例
SqlSession sqlSession = sqlSessionFactory.openSession();

try {
    // 使用SqlSession执行SQL并获取结果
    User user = sqlSession.selectOne("org.mybatis.example.UserMapper.selectById", 1);
} finally {
    // 关闭SqlSession以释放资源
    sqlSession.close();
}

核心方法

  • select*: 执行查询语句,返回映射后的对象或集合。
  • insert, update, delete: 执行增删改操作。
  • commit, rollback: 提交或回滚事务。

2. Executor的类型及其职责

Executor 在MyBatis中扮演着SQL执行器的角色,它是所有数据库操作的实际执行者。MyBatis内置了两种类型的执行器:

  • SimpleExecutor: 简单执行器,每次执行SQL都会开启一个新的预编译Statement进行操作。
  • ReuseExecutor: 可重用执行器,在同一个SqlSession生命周期内重用预编译Statement,减少数据库连接资源消耗。
  • BatchExecutor: 批量执行器,支持批量提交SQL,提高了大量数据插入、更新等操作的性能。

执行过程概览

  1. SqlSession接收到用户调用后,将请求转发给其内部持有的Executor
  2. Executor根据请求类型(查询、更新等)选择合适的策略执行SQL,包括生成动态SQL(如果有)、准备Statement、设置参数及执行SQL。
  3. 执行完毕后,Executor负责将结果映射为Java对象,并返回给SqlSession

3. 源码层面的交互分析

SqlSession调用如selectOne这样的方法时,实际上是对内部Executor发起委托请求。

public <E> E selectOne(String statement, Object parameter) {
    List<E> list = this.executor.query(statement, parameter, RowBounds.DEFAULT, Executor.NO_RESULT_HANDLER);
    if (list.size() > 1) {
        throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
    } else if (list.size() == 1) {
        return list.get(0);
    } else {
        return null;
    }
}

上述代码片段展示了SqlSession如何通过Executor执行查询请求,并对结果进行处理。在实际执行过程中,Executor还会根据配置信息和请求特性决定是否启用二级缓存、延迟加载等功能。

4. 结论与展望

通过对SqlSessionExecutor的深入解读,我们更清晰地理解了MyBatis如何高效、灵活地执行SQL并管理数据库事务。接下来的文章将进一步探讨MyBatis的动态SQL构建过程、插件扩展机制以及缓存体系,以便读者能全面掌握MyBatis的工作原理和技术细节。

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈大狗Ayer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值