Merge branch '5.1.x'

This commit is contained in:
Juergen Hoeller 2019-02-28 11:14:49 +01:00
commit c41616e82d
1 changed files with 37 additions and 40 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -31,7 +31,6 @@ import java.sql.Statement;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -1150,12 +1149,12 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
logger.trace("CallableStatement.execute() returned '" + retVal + "'"); logger.trace("CallableStatement.execute() returned '" + retVal + "'");
logger.trace("CallableStatement.getUpdateCount() returned " + updateCount); logger.trace("CallableStatement.getUpdateCount() returned " + updateCount);
} }
Map<String, Object> returnedResults = createResultsMap(); Map<String, Object> results = createResultsMap();
if (retVal || updateCount != -1) { if (retVal || updateCount != -1) {
returnedResults.putAll(extractReturnedResults(cs, updateCountParameters, resultSetParameters, updateCount)); results.putAll(extractReturnedResults(cs, updateCountParameters, resultSetParameters, updateCount));
} }
returnedResults.putAll(extractOutputParameters(cs, callParameters)); results.putAll(extractOutputParameters(cs, callParameters));
return returnedResults; return results;
}); });
Assert.state(result != null, "No result map"); Assert.state(result != null, "No result map");
@ -1173,7 +1172,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
@Nullable List<SqlParameter> updateCountParameters, @Nullable List<SqlParameter> resultSetParameters, @Nullable List<SqlParameter> updateCountParameters, @Nullable List<SqlParameter> resultSetParameters,
int updateCount) throws SQLException { int updateCount) throws SQLException {
Map<String, Object> returnedResults = new HashMap<>(); Map<String, Object> results = new LinkedHashMap<>(4);
int rsIndex = 0; int rsIndex = 0;
int updateIndex = 0; int updateIndex = 0;
boolean moreResults; boolean moreResults;
@ -1182,7 +1181,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
if (updateCount == -1) { if (updateCount == -1) {
if (resultSetParameters != null && resultSetParameters.size() > rsIndex) { if (resultSetParameters != null && resultSetParameters.size() > rsIndex) {
SqlReturnResultSet declaredRsParam = (SqlReturnResultSet) resultSetParameters.get(rsIndex); SqlReturnResultSet declaredRsParam = (SqlReturnResultSet) resultSetParameters.get(rsIndex);
returnedResults.putAll(processResultSet(cs.getResultSet(), declaredRsParam)); results.putAll(processResultSet(cs.getResultSet(), declaredRsParam));
rsIndex++; rsIndex++;
} }
else { else {
@ -1192,7 +1191,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("Added default SqlReturnResultSet parameter named '" + rsName + "'"); logger.trace("Added default SqlReturnResultSet parameter named '" + rsName + "'");
} }
returnedResults.putAll(processResultSet(cs.getResultSet(), undeclaredRsParam)); results.putAll(processResultSet(cs.getResultSet(), undeclaredRsParam));
rsIndex++; rsIndex++;
} }
} }
@ -1201,7 +1200,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
if (updateCountParameters != null && updateCountParameters.size() > updateIndex) { if (updateCountParameters != null && updateCountParameters.size() > updateIndex) {
SqlReturnUpdateCount ucParam = (SqlReturnUpdateCount) updateCountParameters.get(updateIndex); SqlReturnUpdateCount ucParam = (SqlReturnUpdateCount) updateCountParameters.get(updateIndex);
String declaredUcName = ucParam.getName(); String declaredUcName = ucParam.getName();
returnedResults.put(declaredUcName, updateCount); results.put(declaredUcName, updateCount);
updateIndex++; updateIndex++;
} }
else { else {
@ -1210,7 +1209,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("Added default SqlReturnUpdateCount parameter named '" + undeclaredName + "'"); logger.trace("Added default SqlReturnUpdateCount parameter named '" + undeclaredName + "'");
} }
returnedResults.put(undeclaredName, updateCount); results.put(undeclaredName, updateCount);
updateIndex++; updateIndex++;
} }
} }
@ -1223,7 +1222,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
} }
while (moreResults || updateCount != -1); while (moreResults || updateCount != -1);
} }
return returnedResults; return results;
} }
/** /**
@ -1235,7 +1234,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
protected Map<String, Object> extractOutputParameters(CallableStatement cs, List<SqlParameter> parameters) protected Map<String, Object> extractOutputParameters(CallableStatement cs, List<SqlParameter> parameters)
throws SQLException { throws SQLException {
Map<String, Object> returnedResults = new HashMap<>(); Map<String, Object> results = new LinkedHashMap<>(parameters.size());
int sqlColIndex = 1; int sqlColIndex = 1;
for (SqlParameter param : parameters) { for (SqlParameter param : parameters) {
if (param instanceof SqlOutParameter) { if (param instanceof SqlOutParameter) {
@ -1244,25 +1243,25 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
SqlReturnType returnType = outParam.getSqlReturnType(); SqlReturnType returnType = outParam.getSqlReturnType();
if (returnType != null) { if (returnType != null) {
Object out = returnType.getTypeValue(cs, sqlColIndex, outParam.getSqlType(), outParam.getTypeName()); Object out = returnType.getTypeValue(cs, sqlColIndex, outParam.getSqlType(), outParam.getTypeName());
returnedResults.put(outParam.getName(), out); results.put(outParam.getName(), out);
} }
else { else {
Object out = cs.getObject(sqlColIndex); Object out = cs.getObject(sqlColIndex);
if (out instanceof ResultSet) { if (out instanceof ResultSet) {
if (outParam.isResultSetSupported()) { if (outParam.isResultSetSupported()) {
returnedResults.putAll(processResultSet((ResultSet) out, outParam)); results.putAll(processResultSet((ResultSet) out, outParam));
} }
else { else {
String rsName = outParam.getName(); String rsName = outParam.getName();
SqlReturnResultSet rsParam = new SqlReturnResultSet(rsName, getColumnMapRowMapper()); SqlReturnResultSet rsParam = new SqlReturnResultSet(rsName, getColumnMapRowMapper());
returnedResults.putAll(processResultSet((ResultSet) out, rsParam)); results.putAll(processResultSet((ResultSet) out, rsParam));
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("Added default SqlReturnResultSet parameter named '" + rsName + "'"); logger.trace("Added default SqlReturnResultSet parameter named '" + rsName + "'");
} }
} }
} }
else { else {
returnedResults.put(outParam.getName(), out); results.put(outParam.getName(), out);
} }
} }
} }
@ -1270,7 +1269,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
sqlColIndex++; sqlColIndex++;
} }
} }
return returnedResults; return results;
} }
/** /**
@ -1282,31 +1281,29 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
protected Map<String, Object> processResultSet( protected Map<String, Object> processResultSet(
@Nullable ResultSet rs, ResultSetSupportingSqlParameter param) throws SQLException { @Nullable ResultSet rs, ResultSetSupportingSqlParameter param) throws SQLException {
if (rs == null) { if (rs != null) {
return Collections.emptyMap(); try {
} if (param.getRowMapper() != null) {
RowMapper<?> rowMapper = param.getRowMapper();
Map<String, Object> returnedResults = new HashMap<>(); Object result = (new RowMapperResultSetExtractor<>(rowMapper)).extractData(rs);
try { return Collections.singletonMap(param.getName(), result);
if (param.getRowMapper() != null) { }
RowMapper<?> rowMapper = param.getRowMapper(); else if (param.getRowCallbackHandler() != null) {
Object result = (new RowMapperResultSetExtractor<>(rowMapper)).extractData(rs); RowCallbackHandler rch = param.getRowCallbackHandler();
returnedResults.put(param.getName(), result); (new RowCallbackHandlerResultSetExtractor(rch)).extractData(rs);
return Collections.singletonMap(param.getName(),
"ResultSet returned from stored procedure was processed");
}
else if (param.getResultSetExtractor() != null) {
Object result = param.getResultSetExtractor().extractData(rs);
return Collections.singletonMap(param.getName(), result);
}
} }
else if (param.getRowCallbackHandler() != null) { finally {
RowCallbackHandler rch = param.getRowCallbackHandler(); JdbcUtils.closeResultSet(rs);
(new RowCallbackHandlerResultSetExtractor(rch)).extractData(rs);
returnedResults.put(param.getName(), "ResultSet returned from stored procedure was processed");
}
else if (param.getResultSetExtractor() != null) {
Object result = param.getResultSetExtractor().extractData(rs);
returnedResults.put(param.getName(), result);
} }
} }
finally { return Collections.emptyMap();
JdbcUtils.closeResultSet(rs);
}
return returnedResults;
} }