📄 sqlexecutor.java
字号:
hasMoreResults = moveToNextResultsIfPresent(stmt);
}
return rs;
}
private boolean moveToNextResultsIfPresent(Statement stmt) throws SQLException {
boolean moreResults;
// This is the messed up JDBC approach for determining if there are more results
moreResults = !(((moveToNextResultsSafely(stmt) == false) && (stmt.getUpdateCount() == -1)));
return moreResults;
}
private boolean moveToNextResultsSafely(Statement stmt) throws SQLException {
if (!stmt.getConnection().getMetaData().supportsMultipleResultSets()) {
return false;
}
return stmt.getMoreResults();
}
private void handleResults(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
try {
request.setResultSet(rs);
ResultMap resultMap = request.getResultMap();
if (resultMap != null) {
// Skip Results
if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
if (skipResults > 0) {
rs.absolute(skipResults);
}
} else {
for (int i = 0; i < skipResults; i++) {
if (!rs.next()) {
return;
}
}
}
// Get Results
int resultsFetched = 0;
while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults) && rs.next()) {
Object[] columnValues = resultMap.resolveSubMap(request, rs).getResults(request, rs);
callback.handleResultObject(request, columnValues, rs);
resultsFetched++;
}
}
} finally {
request.setResultSet(null);
}
}
private void retrieveOutputParameters(RequestScope request, CallableStatement cs, ParameterMapping[] mappings, Object[] parameters, RowHandlerCallback callback) throws SQLException {
for (int i = 0; i < mappings.length; i++) {
BasicParameterMapping mapping = ((BasicParameterMapping) mappings[i]);
if (mapping.isOutputAllowed()) {
if ("java.sql.ResultSet".equalsIgnoreCase(mapping.getJavaTypeName())) {
ResultSet rs = (ResultSet) cs.getObject(i + 1);
ResultMap resultMap;
if (mapping.getResultMapName() == null) {
resultMap = request.getResultMap();
handleOutputParameterResults(request, resultMap, rs, callback);
} else {
ExtendedSqlMapClient client = (ExtendedSqlMapClient) request.getSession().getSqlMapClient();
resultMap = client.getDelegate().getResultMap(mapping.getResultMapName());
DefaultRowHandler rowHandler = new DefaultRowHandler();
RowHandlerCallback handlerCallback = new RowHandlerCallback(resultMap, null, rowHandler);
handleOutputParameterResults(request, resultMap, rs, handlerCallback);
parameters[i] = rowHandler.getList();
}
rs.close();
} else {
parameters[i] = mapping.getTypeHandler().getResult(cs, i + 1);
}
}
}
}
private void registerOutputParameters(CallableStatement cs, ParameterMapping[] mappings) throws SQLException {
for (int i = 0; i < mappings.length; i++) {
BasicParameterMapping mapping = ((BasicParameterMapping) mappings[i]);
if (mapping.isOutputAllowed()) {
if (null != mapping.getTypeName() && !mapping.getTypeName().equals("")) { //@added
cs.registerOutParameter(i + 1, mapping.getJdbcType(), mapping.getTypeName());
} else {
if (mapping.getNumericScale() != null && (mapping.getJdbcType() == Types.NUMERIC || mapping.getJdbcType() == Types.DECIMAL))
{
cs.registerOutParameter(i + 1, mapping.getJdbcType(), mapping.getNumericScale().intValue());
} else {
cs.registerOutParameter(i + 1, mapping.getJdbcType());
}
}
}
}
}
private void handleOutputParameterResults(RequestScope request, ResultMap resultMap, ResultSet rs, RowHandlerCallback callback) throws SQLException {
ResultMap orig = request.getResultMap();
try {
request.setResultSet(rs);
if (resultMap != null) {
request.setResultMap(resultMap);
// Get Results
while (rs.next()) {
Object[] columnValues = resultMap.resolveSubMap(request, rs).getResults(request, rs);
callback.handleResultObject(request, columnValues, rs);
}
}
} finally {
request.setResultSet(null);
request.setResultMap(orig);
}
}
/**
* Clean up any batches on the session
*
* @param session - the session to clean up
*/
public void cleanup(SessionScope session) {
Batch batch = (Batch) session.getBatch();
if (batch != null) {
batch.cleanupBatch(session);
session.setBatch(null);
}
}
private PreparedStatement prepareStatement(SessionScope session, Connection conn, String sql, Integer rsType) throws SQLException {
SqlMapExecutorDelegate delegate = ((ExtendedSqlMapClient)session.getSqlMapExecutor()).getDelegate();
if (session.hasPreparedStatementFor(sql)) {
return session.getPreparedStatement((sql));
} else {
PreparedStatement ps = conn.prepareStatement(sql, rsType.intValue(), ResultSet.CONCUR_READ_ONLY);
session.putPreparedStatement(delegate, sql, ps);
return ps;
}
}
private CallableStatement prepareCall(SessionScope session, Connection conn, String sql, Integer rsType) throws SQLException {
SqlMapExecutorDelegate delegate = ((ExtendedSqlMapClient)session.getSqlMapExecutor()).getDelegate();
if (session.hasPreparedStatementFor(sql)) {
return (CallableStatement) session.getPreparedStatement((sql));
} else {
CallableStatement cs = conn.prepareCall(sql, rsType.intValue(), ResultSet.CONCUR_READ_ONLY);
session.putPreparedStatement(delegate, sql, cs);
return cs;
}
}
private static PreparedStatement prepareStatement(SessionScope session, Connection conn, String sql) throws SQLException {
SqlMapExecutorDelegate delegate = ((ExtendedSqlMapClient)session.getSqlMapExecutor()).getDelegate();
if (session.hasPreparedStatementFor(sql)) {
return session.getPreparedStatement((sql));
} else {
PreparedStatement ps = conn.prepareStatement(sql);
session.putPreparedStatement(delegate, sql, ps);
return ps;
}
}
private CallableStatement prepareCall(SessionScope session, Connection conn, String sql) throws SQLException {
SqlMapExecutorDelegate delegate = ((ExtendedSqlMapClient)session.getSqlMapExecutor()).getDelegate();
if (session.hasPreparedStatementFor(sql)) {
return (CallableStatement) session.getPreparedStatement((sql));
} else {
CallableStatement cs = conn.prepareCall(sql);
session.putPreparedStatement(delegate, sql, cs);
return cs;
}
}
private static void closeStatement(SessionScope session, PreparedStatement ps) {
if (ps != null) {
if (!session.hasPreparedStatement(ps)) {
try {
ps.close();
} catch (SQLException e) {
// ignore
}
}
}
}
/**
* @param rs
*/
private static void closeResultSet(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// ignore
}
}
}
private static void setStatementTimeout(MappedStatement mappedStatement, Statement statement) throws SQLException {
if (mappedStatement.getTimeout() != null) {
statement.setQueryTimeout(mappedStatement.getTimeout().intValue());
}
}
//
// Inner Classes
//
private static class Batch {
private String currentSql;
private List statementList = new ArrayList();
private List batchResultList = new ArrayList();
private int size;
/**
* Create a new batch
*/
public Batch() {
this.size = 0;
}
/**
* Getter for the batch size
*
* @return - the batch size
*/
public int getSize() {
return size;
}
/**
* Add a prepared statement to the batch
*
* @param request - the request scope
* @param conn - the database connection
* @param sql - the SQL to add
* @param parameters - the parameters for the SQL
* @throws SQLException - if the prepare for the SQL fails
*/
public void addBatch(RequestScope request, Connection conn, String sql, Object[] parameters) throws SQLException {
PreparedStatement ps = null;
if (currentSql != null && sql.hashCode() == currentSql.hashCode() && sql.length() == currentSql.length()) {
int last = statementList.size() - 1;
ps = (PreparedStatement) statementList.get(last);
} else {
ps = prepareStatement(request.getSession(), conn, sql);
setStatementTimeout(request.getStatement(), ps);
currentSql = sql;
statementList.add(ps);
batchResultList.add(new BatchResult(request.getStatement().getId(), sql));
}
request.getParameterMap().setParameters(request, ps, parameters);
ps.addBatch();
size++;
}
/**
* TODO (Jeff Butler) - maybe this method should be deprecated in some release,
* and then removed in some even later release. executeBatchDetailed gives
* much more complete information.
* <p/>
* Execute the current session's batch
*
* @return - the number of rows updated
* @throws SQLException - if the batch fails
*/
public int executeBatch() throws SQLException {
int totalRowCount = 0;
for (int i = 0, n = statementList.size(); i < n; i++) {
PreparedStatement ps = (PreparedStatement) statementList.get(i);
int[] rowCounts = ps.executeBatch();
for (int j = 0; j < rowCounts.length; j++) {
if (rowCounts[j] == Statement.SUCCESS_NO_INFO) {
// do nothing
} else if (rowCounts[j] == Statement.EXECUTE_FAILED) {
throw new SQLException("The batched statement at index " + j + " failed to execute.");
} else {
totalRowCount += rowCounts[j];
}
}
}
return totalRowCount;
}
/**
* Batch execution method that returns all the information
* the driver has to offer.
*
* @return a List of BatchResult objects
* @throws BatchException (an SQLException sub class) if any nested
* batch fails
* @throws SQLException if a database access error occurs, or the drive
* does not support batch statements
* @throws BatchException if the driver throws BatchUpdateException
*/
public List executeBatchDetailed() throws SQLException, BatchException {
List answer = new ArrayList();
for (int i = 0, n = statementList.size(); i < n; i++) {
BatchResult br = (BatchResult) batchResultList.get(i);
PreparedStatement ps = (PreparedStatement) statementList.get(i);
try {
br.setUpdateCounts(ps.executeBatch());
} catch (BatchUpdateException e) {
StringBuffer message = new StringBuffer();
message.append("Sub batch number ");
message.append(i + 1);
message.append(" failed.");
if (i > 0) {
message.append(" ");
message.append(i);
message.append(" prior sub batch(s) completed successfully, but will be rolled back.");
}
throw new BatchException(message.toString(), e, answer, br.getStatementId(), br.getSql());
}
answer.add(br);
}
return answer;
}
/**
* Close all the statements in the batch and clear all the statements
*
* @param session
*/
public void cleanupBatch(SessionScope session) {
for (int i = 0, n = statementList.size(); i < n; i++) {
PreparedStatement ps = (PreparedStatement) statementList.get(i);
closeStatement(session, ps);
}
currentSql = null;
statementList.clear();
batchResultList.clear();
size = 0;
}
}
private void setupResultObjectFactory(RequestScope request) {
ExtendedSqlMapClient client = (ExtendedSqlMapClient) request.getSession().getSqlMapClient();
ResultObjectFactoryUtil.setResultObjectFactory(client.getResultObjectFactory());
ResultObjectFactoryUtil.setStatementId(request.getStatement().getId());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -