天天看點

Mybatis源碼之Statement處理器SimpleStatementHandler(四)

SimpleStatementHandler就是使用基本的Statement來執行query、batch、update等操作,其實作還是比較簡單的,當然在執行過程中會涉及keyGenerator和ResultHandler操作,這些我們會在接下來的部落格中進行詳解。SimpleStatementHandler用于執行簡單的sql語句,這裡簡單的sql語句是指sql語句中沒有變量,不會通過外部進行參數傳入的sql語句。

/**
 * @author Clinton Begin
 */
public class SimpleStatementHandler extends BaseStatementHandler {

  public SimpleStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
    super(executor, mappedStatement, parameter, rowBounds, resultHandler, boundSql);
  }

  @Override
  public int update(Statement statement) throws SQLException {
  //獲得sql語句 
    String sql = boundSql.getSql();
  //獲得參數
    Object parameterObject = boundSql.getParameterObject();
    KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
    int rows;
  //statement執行sql語句傳回更新數目
    if (keyGenerator instanceof Jdbc3KeyGenerator) {
      statement.execute(sql, Statement.RETURN_GENERATED_KEYS);
      rows = statement.getUpdateCount();
      keyGenerator.processAfter(executor, mappedStatement, statement, parameterObject);
    } else if (keyGenerator instanceof SelectKeyGenerator) {
      statement.execute(sql);
      rows = statement.getUpdateCount();
      keyGenerator.processAfter(executor, mappedStatement, statement, parameterObject);
    } else {
    //如果沒有keyGenerator,直接調用Statement.execute和Statement.getUpdateCount
      statement.execute(sql);
      rows = statement.getUpdateCount();
    }
    return rows;
  }

  @Override
  public void batch(Statement statement) throws SQLException {
  //批處理
    String sql = boundSql.getSql();
    statement.addBatch(sql);
  }

  //ResultHandler resultHandler這個參數好像沒用啊
  @Override
  public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException {
    String sql = boundSql.getSql();
  //statement執行sql語句
    statement.execute(sql);
    return resultSetHandler.<E>handleResultSets(statement);
  }

  //執行個體化Statement
  @Override
  protected Statement instantiateStatement(Connection connection) throws SQLException {
    if (mappedStatement.getResultSetType() != null) {
      return connection.createStatement(mappedStatement.getResultSetType().getValue(), ResultSet.CONCUR_READ_ONLY);
    } else {
      return connection.createStatement();
    }
  }

  @Override
  public void parameterize(Statement statement) throws SQLException {
    // N/A
  }

}