在上一篇中,我们详细剖析了MyBatis如何通过SqlSessionFactoryBuilder
解析配置文件并创建出SqlSessionFactory
。本篇将继续深入MyBatis的核心运行机制,聚焦于SqlSession
与Executor
这两个关键组件之间的协作关系,揭示它们是如何共同完成对数据库操作请求的处理。
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
: 提交或回滚事务。Executor
的类型及其职责Executor
在MyBatis中扮演着SQL执行器的角色,它是所有数据库操作的实际执行者。MyBatis内置了两种类型的执行器:
SqlSession
生命周期内重用预编译Statement,减少数据库连接资源消耗。SqlSession
接收到用户调用后,将请求转发给其内部持有的Executor
。Executor
根据请求类型(查询、更新等)选择合适的策略执行SQL,包括生成动态SQL(如果有)、准备Statement、设置参数及执行SQL。Executor
负责将结果映射为Java对象,并返回给SqlSession
。当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
还会根据配置信息和请求特性决定是否启用二级缓存、延迟加载等功能。
通过对SqlSession
和Executor
的深入解读,我们更清晰地理解了MyBatis如何高效、灵活地执行SQL并管理数据库事务。接下来的文章将进一步探讨MyBatis的动态SQL构建过程、插件扩展机制以及缓存体系,以便读者能全面掌握MyBatis的工作原理和技术细节。