JDBC Pagination - PullRequest
       24

JDBC Pagination

33 голосов
/ 05 мая 2010

Я хочу реализовать нумерацию страниц с использованием JDBC. Фактически, я хочу знать: «Как я могу получить первые 50, а затем следующие 50 записей из базы данных для страниц 1 и 2 соответственно»

Мой запрос Select * from data [таблица данных содержит 20 000 строк]

Для страницы № 1 я получаю 50 записей, а для страницы № 2 я хочу получить следующие 50 записей. Как я могу эффективно реализовать это в JDBC?

Я искал и обнаружил, что rs.absolute(row) - это способ пропустить записи первой страницы, но для больших наборов результатов требуется некоторое время, и я не хочу терпеть это количество времени. Кроме того, я не хочу использовать rownum и limit + offset в запросе, потому что они не подходят для использования в запросе, я не знаю почему, но я не хочу использовать его в запросе.

Может кто-нибудь помочь мне, как ограничить ResultSet для нумерации страниц или есть какой-то способ, которым JDBC дает нам?

Ответы [ 13 ]

1 голос
/ 05 мая 2010

Я неявно понимаю, что вы не хотите, чтобы соединение JDBC имело единый гигантский набор результатов, который вы сохраняете открытым в течение очень долгого времени и перемещаетесь при необходимости.

Обычный подход заключается в добавлении SQL, необходимого только для получения подмножества полного запроса, который, к сожалению, отличается от базы данных к базе данных и сделает ваши операторы SQL конкретными для конкретного поставщика. Если я правильно помню, LIMIT используется с MySQL. Запросите соответствующий диапазон для каждого запроса.

Я также считаю, что Hibernate содержит функциональность, которая позволяет вам делать это для HQL, но я незнаком с этим.

0 голосов
/ 25 мая 2018

Вы можете использовать ниже метод для этого.

  1. Здесь rowNo - номер начальной строки, с которой вы хотите получить n записей.
  2. pageSize - общее количество записей, которое вы хотите получить


     public CachedRowSet getScrollableList(PreparedStatement prestmt, int rowNo)
                {   
                    getPageSize();
                    ResultSet rs = null;
                    CachedRowSet crs = null;
                    try
                    {           
                        rs = prestmt.executeQuery();
                        crs = new CachedRowSetImpl();
                        crs.setPageSize(pageSize);
                        crs.populate(rs, rowNo);
                    }
                    catch (SQLException ex)
                    {
                        logger.error("Exception in DatabaseInterface in getScrollableList() method: "+ ex.getMessage(),ex);
                    }   
                    finally
                    {
                        //close rs
                        //close pstmt
                    }
                    return crs;
                }



 
0 голосов
/ 06 февраля 2016

Хорошо работают следующие java-коды:

package paginationSample;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @ Nwaeze Emmanuel (FUNAI, 2016)
 */
public class PaginationSample extends javax.swing.JFrame {  
public void getRows() {
Connection con2;
Statement stmt2;
ResultSet rs2;
int j=0;
String sz="";

  try {
// Load MS accces driver class
 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, 
  *.accdb)};DBQ=" + "C:\\Database2.mdb"; 
try{
con2 = DriverManager.getConnection(url, "user", "");
System.out.println("Connection Succesfull");

 try{
   stmt2=con2.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
   ResultSet.CONCUR_UPDATABLE );
   String sql="";

   if (txtpage.getText().trim().equals("") || 
      txtpagesize.getText().trim().equals("")){

    }else{
     int pagesize=Integer.parseInt(txtpagesize.getText());   
     int page=Integer.parseInt(txtpage.getText());
     sql="SELECT * FROM FSRegistration100L WHERE SN >= " +  
    (pagesize*page-pagesize+1) + " AND " + "SN <= " + (pagesize*page);
     rs2=stmt2.executeQuery(sql);
     if (rs2.wasNull()){

     }else{
       while ( rs2.next()){
         sz=sz + rs2.getString("RegNo") + "\n";

          j++;  

        }
       txta.setText(sz);
       txta.append(" Total rows =" + Integer.toString(j));
    } 
    }
      stmt2.close();
      con2.close();
  }
  catch (NullPointerException s){
  System.err.println("Got an exception166! ");
  System.out.println(s.getMessage());
  } 
 } catch (SQLException e1) {
System.err.println("Got an exception1! ");
System.err.println(e1.getMessage());
}
} catch (ClassNotFoundException e2) {
System.err.println("Got an exception2! ");
System.err.println(e2.getMessage());

} 
}



    private void jButton1ActionPerformed(java.awt.event.ActionEvent 
       evt)     {                                         
       // TODO add your handling code here:
        getRows();
    }                                        

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea txta;
    private javax.swing.JTextField txtpage;
    private javax.swing.JTextField txtpagesize;
    // End of variables declaration 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...