MyBatis源码系列之六:执行器Executor的实现
引言
欢迎来到MyBatis源码系列的第六篇文章。在前面的文章中,我们深入探讨了MyBatis的总览和环境准备,配置文件的解析过程,SqlSessionFactory的创建,以及SqlSession的工作原理。本篇文章将继续深入研究MyBatis的底层执行器Executor的实现细节。
执行器Executor的作用
在MyBatis中,执行器Executor是负责执行SQL语句并处理数据库操作的核心组件。它负责与数据库进行交互,执行SQL语句,并将结果映射为Java对象。
MyBatis提供了三种执行器的实现:
- SimpleExecutor:简单执行器,每次执行SQL语句时都会创建一个新的预处理语句和结果集对象。
- ReuseExecutor:可重用执行器,会重用已经创建的预处理语句和结果集对象,提高性能。
- BatchExecutor:批处理执行器,用于批量执行SQL语句,减少与数据库的交互次数。
执行器Executor的实现
我们以SimpleExecutor
为例,展示执行器Executor的主要代码:
public class SimpleExecutor implements Executor {
// ...
@Override
public <E> List<E> query(MappedStatement ms, Object parameter) {
// 从配置对象获取StatementHandler
StatementHandler handler = configuration.newStatementHandler(ms, parameter);
// 获取SQL语句和参数信息
BoundSql boundSql = handler.getBoundSql();
String sql = boundSql.getSql();
// 创建预处理语句和结果集对象
PreparedStatement stmt = null;
ResultSet rs = null;
List<E> resultList = new ArrayList<>();
try {
// 获取数据库连接
Connection conn = getConnection();
// 创建预处理语句对象
stmt = conn.prepareStatement(sql);
// 设置参数
setParameters(stmt, boundSql.getParameterMappings(), parameter);
// 执行查询
rs = stmt.executeQuery();
// 处理结果集
resultList = handleResultSet(rs, ms.getResultMap());
} catch (Exception e) {
// 处理异常
} finally {
// 关闭结果集、预处理语句和数据库连接
closeResultSet(rs);
closeStatement(stmt);
closeConnection();
}
return resultList;
}
// 其他操作方法的实现
}
在query()
方法中,执行器会调用配置对象Configuration
的newStatementHandler()
方法创建一个StatementHandler
对象,用于处理SQL语句的执行。
StatementHandler
负责处理数据库的预编译和执行。在SimpleExecutor
中,我们通过调用getBoundSql()
方法获取SQL语句和参数信息,然后创建预处理语句对象PreparedStatement
,设置参数,执行查询操作,并通过ResultSet
获取查询结果。
最后,我们通过调用handleResultSet()
方法将查询结果映射为Java对象,并返回结果列表。
在整个查询过程中,我们还需要负责获取数据库连接、关闭结果集、关闭语句和关闭连接等资源的管理。
结束语
在本文中,我们深入研究了MyBatis的执行器Executor的实现。我们了解到,执行器是MyBatis中负责执行SQL语句并处理数据库操作的核心组件。
通过了解执行器Executor的实现,我们对MyBatis的底层工作原理有了更深入的理解。在后续的文章中,我们将继续深入研究MyBatis的其他关键组件和功能。
希望本文对您理解执行器Executor的实现有所帮助。如果您有任何问题或者建议,欢迎在评论区留言。在下一篇文章中,我们将继续探索MyBatis源码,深入研究其与数据库交互的底层映射器Mapper的实现细节。