本文主要是介绍【手把手带你玩转MyBatis】深入源码解读MyBatis系列(二):SqlSession与Executor的交互机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
引言
在上一篇中,我们详细剖析了MyBatis如何通过SqlSessionFactoryBuilder
解析配置文件并创建出SqlSessionFactory
。本篇将继续深入MyBatis的核心运行机制,聚焦于SqlSession
与Executor
这两个关键组件之间的协作关系,揭示它们是如何共同完成对数据库操作请求的处理。
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,提高了大量数据插入、更新等操作的性能。
执行过程概览
SqlSession
接收到用户调用后,将请求转发给其内部持有的Executor
。Executor
根据请求类型(查询、更新等)选择合适的策略执行SQL,包括生成动态SQL(如果有)、准备Statement、设置参数及执行SQL。- 执行完毕后,
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. 结论与展望
通过对SqlSession
和Executor
的深入解读,我们更清晰地理解了MyBatis如何高效、灵活地执行SQL并管理数据库事务。接下来的文章将进一步探讨MyBatis的动态SQL构建过程、插件扩展机制以及缓存体系,以便读者能全面掌握MyBatis的工作原理和技术细节。
这篇关于【手把手带你玩转MyBatis】深入源码解读MyBatis系列(二):SqlSession与Executor的交互机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!