package coreservlets.beans; import java.sql.*; /** Bean to scroll through an uncached ResultSet. As the data * is not cached, subsequent requests for additional table rows * results in reexecution of the query. *

* Taken from http://www.lmbrown.com/. * © 2004 Larry Brown; may be freely used or adapted */ public class UncachedScrollableQueryBean extends ScrollableQueryBean { // Staring cursor position in result set from the last returned // block of rows. private int priorStartRow; private void setPriorStartRow(int row) { priorStartRow = row; } /** Execute the query and store the results in a * ResultSet. */ public ResultSet executeQuery(String query) throws SQLException { if (connection == null) { throw new SQLException("No connection available."); } statement = connection.createStatement(); resultSet = statement.executeQuery(query); // Determine column names. if (columnNames == null) { ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); int columnCount = resultSetMetaData.getColumnCount(); columnNames = new String[columnCount]; for(int i=1; i<=columnCount; i++) { columnNames[i-1] = resultSetMetaData.getColumnName(i).trim(); } } return(resultSet); } public void findStartRow(String scrollTo) throws SQLException { Integer value = (Integer)directions.get(scrollTo); int direction = FIRST_DIR; if (value != null) { direction = value.intValue(); } int row = 1; switch(direction) { case FIRST_DIR: resultSet.beforeFirst(); break; case PREV_DIR: row = priorStartRow - scrollSize; if (row < 1) { findStartRow("first"); } else { resultSet.absolute(row); } break; case NEXT_DIR: row = priorStartRow + scrollSize; resultSet.absolute(row); System.out.println("Row id: " + resultSet.getRow() + " is after last: " + resultSet.isAfterLast()); if (resultSet.isAfterLast() || resultSet.isLast()) { if (priorStartRow < 1) { findStartRow("first"); } else { resultSet.absolute(priorStartRow); } } break; case LAST_DIR: System.out.println("Setting 'last'"); resultSet.last(); int size = resultSet.getRow(); row = (size-1)/scrollSize * scrollSize; System.out.println("Calculated row is: " + row); if (row < 1) { resultSet.beforeFirst(); } else { resultSet.absolute(row); } break; default: findStartRow("next"); } setPriorStartRow(resultSet.getRow()); } public void close() { closeResultSet(); closeStatement(); closeConnection(); } }