在 MyBatis 中,当执行一个 SQL 语句时,会涉及到一系列的组件和接口来协同完成这个任务。你提到的 Executor
、ParameterHandler
、ResultSetHandler
和 StatementHandler
是这些组件中的核心部分。以下是这些组件在 MyBatis 中如何协同工作来执行 SQL 语句的简要概述:
1. Executor
Executor
是 MyBatis 的核心执行器,它负责调度和管理 StatementHandler
、ParameterHandler
和 ResultSetHandler
。当你通过 MyBatis 的 API(如 SqlSession
的 selectOne
、selectList
、update
、insert
等方法)来执行 SQL 时,实际上是调用了 Executor
的相应方法。
update
: 执行更新(INSERT、UPDATE、DELETE)操作。query
: 执行查询操作。flushStatements
: 清除缓存中的语句。commit
和rollback
: 提交或回滚事务。getTransaction
: 获取当前事务。close
: 关闭执行器。isClosed
: 检查执行器是否已关闭。
2. StatementHandler
StatementHandler
负责处理 SQL 语句的生成、参数设置、执行和结果集处理。它封装了 JDBC 的 Statement
对象。
prepare
: 准备 SQL 语句(可能包括动态 SQL 的解析和生成)。parameterize
: 设置 SQL 语句的参数。batch
: 添加 SQL 语句到批量操作中。update
和query
: 执行更新或查询操作。
3. ParameterHandler
ParameterHandler
负责处理 SQL 语句的参数。当调用 StatementHandler
的 parameterize
方法时,会由 ParameterHandler
来设置参数。
getParameterObject
: 获取要设置的参数对象。setParameters
: 将参数对象设置到 SQL 语句中。
4. ResultSetHandler
ResultSetHandler
负责处理查询结果集。当执行查询操作时,ResultSetHandler
会处理 JDBC 的 ResultSet
对象,将其转化为 Java 对象(如 List、Map 或自定义的 JavaBean)。
handleResultSets
: 处理结果集,将其转化为 Java 对象。handleOutputParameters
: 处理存储过程的输出参数(如果有的话)。
执行流程
- 调用 MyBatis API(如
SqlSession
的方法)来执行 SQL 语句。 Executor
接收到请求后,根据请求类型(更新或查询)来创建或获取一个StatementHandler
。StatementHandler
准备 SQL 语句(可能包括动态 SQL 的解析和生成),并创建或获取一个ParameterHandler
来处理参数。ParameterHandler
设置 SQL 语句的参数。StatementHandler
执行 SQL 语句。- 对于查询操作,
StatementHandler
创建或获取一个ResultSetHandler
来处理结果集。 ResultSetHandler
将结果集转化为 Java 对象并返回给调用者。
这个流程是一个简化的概述,MyBatis 的实际执行过程可能会更复杂,并涉及到更多的细节和组件。但上述流程应该能帮助你理解 MyBatis 如何协同工作来执行 SQL 语句。