102102 * @author Rod Johnson
103103 * @author Juergen Hoeller
104104 * @author Thomas Risberg
105+ * @author Yanming Zhou
105106 * @since May 3, 2001
106107 * @see JdbcOperations
107108 * @see PreparedStatementCreator
@@ -473,12 +474,12 @@ public String getSql() {
473474
474475 @ Override
475476 public void query (String sql , RowCallbackHandler rch ) throws DataAccessException {
476- query (sql , new RowCallbackHandlerResultSetExtractor (rch ));
477+ query (sql , new RowCallbackHandlerResultSetExtractor (rch , this . maxRows ));
477478 }
478479
479480 @ Override
480481 public <T > List <T > query (String sql , RowMapper <T > rowMapper ) throws DataAccessException {
481- return result (query (sql , new RowMapperResultSetExtractor <>(rowMapper )));
482+ return result (query (sql , new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
482483 }
483484
484485 @ Override
@@ -488,7 +489,7 @@ class StreamStatementCallback implements StatementCallback<Stream<T>>, SqlProvid
488489 public Stream <T > doInStatement (Statement stmt ) throws SQLException {
489490 ResultSet rs = stmt .executeQuery (sql );
490491 Connection con = stmt .getConnection ();
491- return new ResultSetSpliterator <>(rs , rowMapper ).stream ().onClose (() -> {
492+ return new ResultSetSpliterator <>(rs , rowMapper , JdbcTemplate . this . maxRows ).stream ().onClose (() -> {
492493 JdbcUtils .closeResultSet (rs );
493494 JdbcUtils .closeStatement (stmt );
494495 DataSourceUtils .releaseConnection (con , getDataSource ());
@@ -756,12 +757,12 @@ private String appendSql(@Nullable String sql, String statement) {
756757
757758 @ Override
758759 public void query (PreparedStatementCreator psc , RowCallbackHandler rch ) throws DataAccessException {
759- query (psc , new RowCallbackHandlerResultSetExtractor (rch ));
760+ query (psc , new RowCallbackHandlerResultSetExtractor (rch , this . maxRows ));
760761 }
761762
762763 @ Override
763764 public void query (String sql , @ Nullable PreparedStatementSetter pss , RowCallbackHandler rch ) throws DataAccessException {
764- query (sql , pss , new RowCallbackHandlerResultSetExtractor (rch ));
765+ query (sql , pss , new RowCallbackHandlerResultSetExtractor (rch , this . maxRows ));
765766 }
766767
767768 @ Override
@@ -782,28 +783,28 @@ public void query(String sql, RowCallbackHandler rch, @Nullable Object @Nullable
782783
783784 @ Override
784785 public <T > List <T > query (PreparedStatementCreator psc , RowMapper <T > rowMapper ) throws DataAccessException {
785- return result (query (psc , new RowMapperResultSetExtractor <>(rowMapper )));
786+ return result (query (psc , new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
786787 }
787788
788789 @ Override
789790 public <T > List <T > query (String sql , @ Nullable PreparedStatementSetter pss , RowMapper <T > rowMapper ) throws DataAccessException {
790- return result (query (sql , pss , new RowMapperResultSetExtractor <>(rowMapper )));
791+ return result (query (sql , pss , new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
791792 }
792793
793794 @ Override
794795 public <T > List <T > query (String sql , @ Nullable Object @ Nullable [] args , int [] argTypes , RowMapper <T > rowMapper ) throws DataAccessException {
795- return result (query (sql , args , argTypes , new RowMapperResultSetExtractor <>(rowMapper )));
796+ return result (query (sql , args , argTypes , new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
796797 }
797798
798799 @ Deprecated
799800 @ Override
800801 public <T > List <T > query (String sql , @ Nullable Object @ Nullable [] args , RowMapper <T > rowMapper ) throws DataAccessException {
801- return result (query (sql , newArgPreparedStatementSetter (args ), new RowMapperResultSetExtractor <>(rowMapper )));
802+ return result (query (sql , newArgPreparedStatementSetter (args ), new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
802803 }
803804
804805 @ Override
805806 public <T > List <T > query (String sql , RowMapper <T > rowMapper , @ Nullable Object @ Nullable ... args ) throws DataAccessException {
806- return result (query (sql , newArgPreparedStatementSetter (args ), new RowMapperResultSetExtractor <>(rowMapper )));
807+ return result (query (sql , newArgPreparedStatementSetter (args ), new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
807808 }
808809
809810 /**
@@ -828,7 +829,7 @@ public <T> Stream<T> queryForStream(PreparedStatementCreator psc, @Nullable Prep
828829 }
829830 ResultSet rs = ps .executeQuery ();
830831 Connection con = ps .getConnection ();
831- return new ResultSetSpliterator <>(rs , rowMapper ).stream ().onClose (() -> {
832+ return new ResultSetSpliterator <>(rs , rowMapper , this . maxRows ).stream ().onClose (() -> {
832833 JdbcUtils .closeResultSet (rs );
833834 if (pss instanceof ParameterDisposer parameterDisposer ) {
834835 parameterDisposer .cleanupParameters ();
@@ -1347,7 +1348,7 @@ protected Map<String, Object> processResultSet(
13471348 }
13481349 else if (param .getRowCallbackHandler () != null ) {
13491350 RowCallbackHandler rch = param .getRowCallbackHandler ();
1350- (new RowCallbackHandlerResultSetExtractor (rch )).extractData (rs );
1351+ (new RowCallbackHandlerResultSetExtractor (rch , - 1 )).extractData (rs );
13511352 return Collections .singletonMap (param .getName (),
13521353 "ResultSet returned from stored procedure was processed" );
13531354 }
@@ -1730,13 +1731,17 @@ private static class RowCallbackHandlerResultSetExtractor implements ResultSetEx
17301731
17311732 private final RowCallbackHandler rch ;
17321733
1733- public RowCallbackHandlerResultSetExtractor (RowCallbackHandler rch ) {
1734+ private final int maxRows ;
1735+
1736+ public RowCallbackHandlerResultSetExtractor (RowCallbackHandler rch , int maxRows ) {
17341737 this .rch = rch ;
1738+ this .maxRows = maxRows ;
17351739 }
17361740
17371741 @ Override
17381742 public @ Nullable Object extractData (ResultSet rs ) throws SQLException {
1739- while (rs .next ()) {
1743+ int processed = 0 ;
1744+ while (rs .next () && (this .maxRows == -1 || (processed ++) < this .maxRows )) {
17401745 this .rch .processRow (rs );
17411746 }
17421747 return null ;
@@ -1754,17 +1759,20 @@ private static class ResultSetSpliterator<T> implements Spliterator<T> {
17541759
17551760 private final RowMapper <T > rowMapper ;
17561761
1762+ private final int maxRows ;
1763+
17571764 private int rowNum = 0 ;
17581765
1759- public ResultSetSpliterator (ResultSet rs , RowMapper <T > rowMapper ) {
1766+ public ResultSetSpliterator (ResultSet rs , RowMapper <T > rowMapper , int maxRows ) {
17601767 this .rs = rs ;
17611768 this .rowMapper = rowMapper ;
1769+ this .maxRows = maxRows ;
17621770 }
17631771
17641772 @ Override
17651773 public boolean tryAdvance (Consumer <? super T > action ) {
17661774 try {
1767- if (this .rs .next ()) {
1775+ if (this .rs .next () && ( this . maxRows == - 1 || this . rowNum < this . maxRows ) ) {
17681776 action .accept (this .rowMapper .mapRow (this .rs , this .rowNum ++));
17691777 return true ;
17701778 }
0 commit comments