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
}
}