|
|
|
@ -102,6 +102,7 @@ import org.springframework.util.StringUtils; |
|
|
|
* @author Rod Johnson |
|
|
|
* @author Rod Johnson |
|
|
|
* @author Juergen Hoeller |
|
|
|
* @author Juergen Hoeller |
|
|
|
* @author Thomas Risberg |
|
|
|
* @author Thomas Risberg |
|
|
|
|
|
|
|
* @author Yanming Zhou |
|
|
|
* @since May 3, 2001 |
|
|
|
* @since May 3, 2001 |
|
|
|
* @see JdbcOperations |
|
|
|
* @see JdbcOperations |
|
|
|
* @see PreparedStatementCreator |
|
|
|
* @see PreparedStatementCreator |
|
|
|
@ -493,12 +494,12 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void query(String sql, RowCallbackHandler rch) throws DataAccessException { |
|
|
|
public void query(String sql, RowCallbackHandler rch) throws DataAccessException { |
|
|
|
query(sql, new RowCallbackHandlerResultSetExtractor(rch)); |
|
|
|
query(sql, new RowCallbackHandlerResultSetExtractor(rch, this.maxRows)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException { |
|
|
|
public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException { |
|
|
|
return result(query(sql, new RowMapperResultSetExtractor<>(rowMapper))); |
|
|
|
return result(query(sql, new RowMapperResultSetExtractor<>(rowMapper, 0, this.maxRows))); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -508,7 +509,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { |
|
|
|
public Stream<T> doInStatement(Statement stmt) throws SQLException { |
|
|
|
public Stream<T> doInStatement(Statement stmt) throws SQLException { |
|
|
|
ResultSet rs = stmt.executeQuery(sql); |
|
|
|
ResultSet rs = stmt.executeQuery(sql); |
|
|
|
Connection con = stmt.getConnection(); |
|
|
|
Connection con = stmt.getConnection(); |
|
|
|
return new ResultSetSpliterator<>(rs, rowMapper).stream().onClose(() -> { |
|
|
|
return new ResultSetSpliterator<>(rs, rowMapper, JdbcTemplate.this.maxRows).stream().onClose(() -> { |
|
|
|
JdbcUtils.closeResultSet(rs); |
|
|
|
JdbcUtils.closeResultSet(rs); |
|
|
|
JdbcUtils.closeStatement(stmt); |
|
|
|
JdbcUtils.closeStatement(stmt); |
|
|
|
DataSourceUtils.releaseConnection(con, getDataSource()); |
|
|
|
DataSourceUtils.releaseConnection(con, getDataSource()); |
|
|
|
@ -773,12 +774,12 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void query(PreparedStatementCreator psc, RowCallbackHandler rch) throws DataAccessException { |
|
|
|
public void query(PreparedStatementCreator psc, RowCallbackHandler rch) throws DataAccessException { |
|
|
|
query(psc, new RowCallbackHandlerResultSetExtractor(rch)); |
|
|
|
query(psc, new RowCallbackHandlerResultSetExtractor(rch, this.maxRows)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void query(String sql, @Nullable PreparedStatementSetter pss, RowCallbackHandler rch) throws DataAccessException { |
|
|
|
public void query(String sql, @Nullable PreparedStatementSetter pss, RowCallbackHandler rch) throws DataAccessException { |
|
|
|
query(sql, pss, new RowCallbackHandlerResultSetExtractor(rch)); |
|
|
|
query(sql, pss, new RowCallbackHandlerResultSetExtractor(rch, this.maxRows)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -799,28 +800,28 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> List<T> query(PreparedStatementCreator psc, RowMapper<T> rowMapper) throws DataAccessException { |
|
|
|
public <T> List<T> query(PreparedStatementCreator psc, RowMapper<T> rowMapper) throws DataAccessException { |
|
|
|
return result(query(psc, new RowMapperResultSetExtractor<>(rowMapper))); |
|
|
|
return result(query(psc, new RowMapperResultSetExtractor<>(rowMapper, 0, this.maxRows))); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> List<T> query(String sql, @Nullable PreparedStatementSetter pss, RowMapper<T> rowMapper) throws DataAccessException { |
|
|
|
public <T> List<T> query(String sql, @Nullable PreparedStatementSetter pss, RowMapper<T> rowMapper) throws DataAccessException { |
|
|
|
return result(query(sql, pss, new RowMapperResultSetExtractor<>(rowMapper))); |
|
|
|
return result(query(sql, pss, new RowMapperResultSetExtractor<>(rowMapper, 0, this.maxRows))); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> List<T> query(String sql, @Nullable Object @Nullable [] args, int[] argTypes, RowMapper<T> rowMapper) throws DataAccessException { |
|
|
|
public <T> List<T> query(String sql, @Nullable Object @Nullable [] args, int[] argTypes, RowMapper<T> rowMapper) throws DataAccessException { |
|
|
|
return result(query(sql, args, argTypes, new RowMapperResultSetExtractor<>(rowMapper))); |
|
|
|
return result(query(sql, args, argTypes, new RowMapperResultSetExtractor<>(rowMapper, 0, this.maxRows))); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Deprecated(since = "5.3") |
|
|
|
@Deprecated(since = "5.3") |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> List<T> query(String sql, @Nullable Object @Nullable [] args, RowMapper<T> rowMapper) throws DataAccessException { |
|
|
|
public <T> List<T> query(String sql, @Nullable Object @Nullable [] args, RowMapper<T> rowMapper) throws DataAccessException { |
|
|
|
return result(query(sql, newArgPreparedStatementSetter(args), new RowMapperResultSetExtractor<>(rowMapper))); |
|
|
|
return result(query(sql, newArgPreparedStatementSetter(args), new RowMapperResultSetExtractor<>(rowMapper, 0, this.maxRows))); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> List<T> query(String sql, RowMapper<T> rowMapper, @Nullable Object @Nullable ... args) throws DataAccessException { |
|
|
|
public <T> List<T> query(String sql, RowMapper<T> rowMapper, @Nullable Object @Nullable ... args) throws DataAccessException { |
|
|
|
return result(query(sql, newArgPreparedStatementSetter(args), new RowMapperResultSetExtractor<>(rowMapper))); |
|
|
|
return result(query(sql, newArgPreparedStatementSetter(args), new RowMapperResultSetExtractor<>(rowMapper, 0, this.maxRows))); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -845,7 +846,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { |
|
|
|
} |
|
|
|
} |
|
|
|
ResultSet rs = ps.executeQuery(); |
|
|
|
ResultSet rs = ps.executeQuery(); |
|
|
|
Connection con = ps.getConnection(); |
|
|
|
Connection con = ps.getConnection(); |
|
|
|
return new ResultSetSpliterator<>(rs, rowMapper).stream().onClose(() -> { |
|
|
|
return new ResultSetSpliterator<>(rs, rowMapper, this.maxRows).stream().onClose(() -> { |
|
|
|
JdbcUtils.closeResultSet(rs); |
|
|
|
JdbcUtils.closeResultSet(rs); |
|
|
|
if (pss instanceof ParameterDisposer parameterDisposer) { |
|
|
|
if (pss instanceof ParameterDisposer parameterDisposer) { |
|
|
|
parameterDisposer.cleanupParameters(); |
|
|
|
parameterDisposer.cleanupParameters(); |
|
|
|
@ -1364,7 +1365,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { |
|
|
|
} |
|
|
|
} |
|
|
|
else if (param.getRowCallbackHandler() != null) { |
|
|
|
else if (param.getRowCallbackHandler() != null) { |
|
|
|
RowCallbackHandler rch = param.getRowCallbackHandler(); |
|
|
|
RowCallbackHandler rch = param.getRowCallbackHandler(); |
|
|
|
(new RowCallbackHandlerResultSetExtractor(rch)).extractData(rs); |
|
|
|
(new RowCallbackHandlerResultSetExtractor(rch, -1)).extractData(rs); |
|
|
|
return Collections.singletonMap(param.getName(), |
|
|
|
return Collections.singletonMap(param.getName(), |
|
|
|
"ResultSet returned from stored procedure was processed"); |
|
|
|
"ResultSet returned from stored procedure was processed"); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -1747,13 +1748,17 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { |
|
|
|
|
|
|
|
|
|
|
|
private final RowCallbackHandler rch; |
|
|
|
private final RowCallbackHandler rch; |
|
|
|
|
|
|
|
|
|
|
|
public RowCallbackHandlerResultSetExtractor(RowCallbackHandler rch) { |
|
|
|
private final int maxRows; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public RowCallbackHandlerResultSetExtractor(RowCallbackHandler rch, int maxRows) { |
|
|
|
this.rch = rch; |
|
|
|
this.rch = rch; |
|
|
|
|
|
|
|
this.maxRows = maxRows; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public @Nullable Object extractData(ResultSet rs) throws SQLException { |
|
|
|
public @Nullable Object extractData(ResultSet rs) throws SQLException { |
|
|
|
while (rs.next()) { |
|
|
|
int processed = 0; |
|
|
|
|
|
|
|
while (rs.next() && (this.maxRows == -1 || (processed++) < this.maxRows)) { |
|
|
|
this.rch.processRow(rs); |
|
|
|
this.rch.processRow(rs); |
|
|
|
} |
|
|
|
} |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
@ -1771,17 +1776,20 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { |
|
|
|
|
|
|
|
|
|
|
|
private final RowMapper<T> rowMapper; |
|
|
|
private final RowMapper<T> rowMapper; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final int maxRows; |
|
|
|
|
|
|
|
|
|
|
|
private int rowNum = 0; |
|
|
|
private int rowNum = 0; |
|
|
|
|
|
|
|
|
|
|
|
public ResultSetSpliterator(ResultSet rs, RowMapper<T> rowMapper) { |
|
|
|
public ResultSetSpliterator(ResultSet rs, RowMapper<T> rowMapper, int maxRows) { |
|
|
|
this.rs = rs; |
|
|
|
this.rs = rs; |
|
|
|
this.rowMapper = rowMapper; |
|
|
|
this.rowMapper = rowMapper; |
|
|
|
|
|
|
|
this.maxRows = maxRows; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean tryAdvance(Consumer<? super T> action) { |
|
|
|
public boolean tryAdvance(Consumer<? super T> action) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
if (this.rs.next()) { |
|
|
|
if (this.rs.next() && (this.maxRows == -1 || this.rowNum < this.maxRows)) { |
|
|
|
action.accept(this.rowMapper.mapRow(this.rs, this.rowNum++)); |
|
|
|
action.accept(this.rowMapper.mapRow(this.rs, this.rowNum++)); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|