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

发布时间:2024年01月22日

引言

在上一篇中,我们详细剖析了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的工作原理和技术细节。

文章来源:https://blog.csdn.net/qq_58366795/article/details/135732730
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。