1. 概述
本文,我们来分享 SQL 执行的第二部分,statement
包。整体类图如下:
- 我们可以看到,整体是以 StatementHandler 为核心。所以,本文主要会看到的就是 StatementHandler 对 JDBC Statement 的各种操作。
而 StatementHandler 在整个 SQL 执行过程中,所处的位置如下:
2. StatementHandler
org.apache.ibatis.executor.statement.StatementHandler
,Statement 处理器,其中 Statement 包含 java.sql.Statement
、java.sql.PreparedStatement
、java.sql.CallableStatement
三种。代码如下:
// StatementHandler.java
public interface StatementHandler {
/** * 准备操作,可以理解成创建 Statement 对象 * * @param connection Connection 对象 * @param transactionTimeout 事务超时时间 * @return Statement 对象 */ Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException;
/** * 设置 Statement 对象的参数 * * @param statement Statement 对象 */ void parameterize(Statement statement) throws SQLException; /** * 添加 Statement 对象的批量操作 * * @param statement Statement 对象 */ void batch(Statement statement) throws SQLException; /** * 执行写操作 * * @param statement Statement 对象 * @return 影响的条数 */ int update(Statement statement) throws SQLException; /** * 执行读操作 * * @param statement Statement 对象 * @param resultHandler ResultHandler 对象,处理结果 * @param <E> 泛型 * @return 读取的结果 */ <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException; /** * 执行读操作,返回 Cursor 对象 * * @param statement Statement 对象 * @param <E> 泛型 * @return Cursor 对象 */ <E> Cursor<E> queryCursor(Statement statement) throws SQLException;
/** * @return BoundSql 对象 */ BoundSql getBoundSql(); /** * @return ParameterHandler 对象 */ ParameterHandler getParameterHandler();
}
|
StatementHandler 有多个子类,如下图所示:
- 左边的三个实现类,分别对应
java.sql.Statement
、java.sql.PreparedStatement
、java.sql.CallableStatement
三种不同的实现类。
- 右边的 RoutingStatementHandler 实现类,负责将不同的 Statement 类型,路由到上述三个实现类上。
下面,我们先看右边的实现类,再看左边的实现类。
3. RoutingStatementHandler
org.apache.ibatis.executor.statement.RoutingStatementHandler
,实现 StatementHandler 接口,路由的 StatementHandler 对象,根据 Statement 类型,转发到对应的 StatementHandler 实现类中。
3.1 构造方法
// RoutingStatementHandler.java
/** * 被委托的 StatementHandler 对象 */ private final StatementHandler delegate;
public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { // 根据不同的类型,创建对应的 StatementHandler 实现类 switch (ms.getStatementType()) { case STATEMENT: delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); break; case PREPARED: delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); break; case CALLABLE: delegate = new CallableStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); break; default: throw new ExecutorException("Unknown statement type: " + ms.getStatementType()); } }
|