mybatis源码4-StatementHandler

一 RoutingStatementHandler

  • Executor执行query或update方法时,调用Configuration的初始化函数创建RoutingStatementHandler,并创建statementHandler的插件代理。
public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
  StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);
  statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);
  return statementHandler;
}
  • 根据mappedStatement.statementType创建实际的StatementHandler,默认为StatementType.PREPARED
类型 StatementHandler
StatementType.PREPARED PreparedStatementHandler
StatementType.STATEMENT SimpleStatementHandler
StatementType.CALLABLE CallableStatementHandler

二 PreparedStatementHandler

  • 初始化
public PreparedStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
  super(executor, mappedStatement, parameter, rowBounds, resultHandler, boundSql);
}
  • 继承自BaseStatementHandler,构造函数实例化
  • 初始化parameterHandler的实现类DefaultParameterHandler,并进行插件代理
  • 初始化resultSetHandler的实现类DefaultResultSetHandler,并进行插件代理
protected BaseStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
  this.configuration = mappedStatement.getConfiguration();
  this.executor = executor;
  this.mappedStatement = mappedStatement;
  this.rowBounds = rowBounds;

  this.typeHandlerRegistry = configuration.getTypeHandlerRegistry();
  this.objectFactory = configuration.getObjectFactory();

  if (boundSql == null) { // issue #435, get the key before calculating the statement
    generateKeys(parameterObject);
    boundSql = mappedStatement.getBoundSql(parameterObject);
  }

  this.boundSql = boundSql;

  this.parameterHandler = configuration.newParameterHandler(mappedStatement, parameterObject, boundSql);
  this.resultSetHandler = configuration.newResultSetHandler(executor, mappedStatement, rowBounds, parameterHandler, resultHandler, boundSql);
}

2.1 DefaultParameterHandler

  • 参数处理
  • parameterize()调用处理非out参数
    parameterHandler.setParameters((PreparedStatement) statement);

2.2 DefaultResultSetHandler

  • 结果处理

2.3 prepare(Connection connection)预处理

  • instantiateStatement(connection);
    支持insert对象,可获取指定自增key的值。
protected Statement instantiateStatement(Connection connection) throws SQLException {
  String sql = boundSql.getSql();
  if (mappedStatement.getKeyGenerator() instanceof Jdbc3KeyGenerator) {
    String[] keyColumnNames = mappedStatement.getKeyColumns();
    if (keyColumnNames == null) {
      return connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
    } else {
      return connection.prepareStatement(sql, keyColumnNames);
    }
  } else if (mappedStatement.getResultSetType() != null) {
    return connection.prepareStatement(sql, mappedStatement.getResultSetType().getValue(), ResultSet.CONCUR_READ_ONLY);
  } else {
    return connection.prepareStatement(sql);
  }
}
  • 设置查询语句超时时间setStatementTimeout(statement);
  • 设置一次取的行数setFetchSize(statement)

2.4 update

  • 支持自增key在插入后的值更新到参数对象中。
public int update(Statement statement) throws SQLException {
  PreparedStatement ps = (PreparedStatement) statement;
  ps.execute();
  int rows = ps.getUpdateCount();
  Object parameterObject = boundSql.getParameterObject();
  KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
  keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);
  return rows;
}

三 SimpleStatementHandler

  • instantiateStatement
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();
  }
}
  • update
public int update(Statement statement)
    throws SQLException {
  String sql = boundSql.getSql();
  Object parameterObject = boundSql.getParameterObject();
  KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
  int rows;
  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 {
    statement.execute(sql);
    rows = statement.getUpdateCount();
  }
  return rows;
}
  • parameterize不做任何处理

四 CallableStatementHandler

  • 查询和更新中多了一步resultSetHandler.handleOutputParameters(cs);
  • parameterize
    registerOutputParameters((CallableStatement) statement);处理out参数
    parameterHandler.setParameters((CallableStatement) statement);处理非out类型参数

你可能感兴趣的:(mybatis源码4-StatementHandler)