Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 要查询第101行,另100行将加载到内存中_Java_Sql_Jdbc_Pagination - Fatal编程技术网

Java 要查询第101行,另100行将加载到内存中

Java 要查询第101行,另100行将加载到内存中,java,sql,jdbc,pagination,Java,Sql,Jdbc,Pagination,来自JavaDoc Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement. If the value specified is zero, then the hint is ignored. The default

来自JavaDoc

Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement. If the value specified is zero, then the hint is ignored. The default value is zero.
注意“提示”一词——它可以由特定于驱动程序的实现来覆盖

这也是类似客户端的SQL developer中的“限制行数为100”功能所基于的

完成整个解决方案,为了滚动结果,需要考虑API

中的结果集类型和ScRabLabururSurvior 您可以在oracle的这篇文章中找到一个示例实现

这是《Oracle Toplink开发人员指南》一书中的内容 示例112 JDBC驱动程序获取大小

ReadAllQuery query = new ReadAllQuery();

query.setReferenceClass(Employee.class);

query.setSelectionCriteria(new ExpressionBuilder.get("id").greaterThan(100));

// Set the JDBC fetch size

query.setFetchSize(50);

// Configure the query to return results as a ScrollableCursor

query.useScrollableCursor();

// Execute the query

ScrollableCursor cursor = (ScrollableCursor) session.executeQuery(query);

// Iterate over the results

while (cursor.hasNext()) {

System.out.println(cursor.next().toString());

}

cursor.close();

毕竟,这些问题的答案是肯定的

哪种分页方式更好?

注意,SQL应该是ORDER by,以便在SQL方法中有意义

否则,可以在下一页中再次显示某些行

下面是Postgresql文档中关于JDBC驱动程序和其他SO答案的一些要点

首先,原始查询需要有一个ORDERBY子句,以便使分页解决方案合理地工作。否则,Oracle完全可以为第一页、第二页和第n页返回相同的500行

主要区别在于JDBC方式,需要在获取期间保持连接。例如,这可能不适用于无状态web应用程序

用于SQL方式

语法是特定于SQL的,可能不容易维护。 用于JDBC方式

  • 与服务器的连接必须使用V3协议。这是 服务器版本7.4和7.4的默认值(仅受支持) 稍后
  • 连接不能处于自动提交模式。后端 在事务结束时关闭游标,因此在自动提交模式下 后端将在获取任何内容之前关闭游标 从它
  • 必须使用ResultSet类型创建语句 ResultSet.TYPE_FORWARD_ONLY。这是默认值,因此不会出现任何代码 需要重写以利用这一点,但这也意味着 您不能向后滚动或以其他方式在 结果集
  • 给定的查询必须是单个语句,而不是多个语句 用分号串在一起的语句
进一步阅读

输入:

  • 订单信息示例(A2或D3)(A/D升序/降序)+列
  • 订单信息示例(A2或D3)(A/D升序/降序)+列
  • 过滤值
  • 起始行
  • 起始行
  • 最大行数
  • 结果:

    • 选定值
    • 所选页面
    • 此排序中的行的索引
    • 计算可用数据。(保存第二个查询)
    仅针对以下对象的Advantage查询:

    • 使用此筛选器的可用列的总和
    • 仅从数据库传输所选页面
    • 在没有动态sql的情况下正确排序
    缺点:

    • 依赖甲骨文

      从中选择x.*( 选择c.pk_字段、c.numeric_a、c.char_b、c.char_c 行号()超过(订货人) 解码(?,'A1',到字符(c.numeric_a,'FM00000000'),'A2',c.char_b,'A3',c.char_c,'a')asc, 解码(?,'D1',到字符(c.numeric_a,'FM00000000'),'D2',c.char_b,'D3',c.char_c,'a')描述, c、 pk_字段asc
      )作为“idx”, 从myTable c中(按1排序)“cnt”的计数(*) 其中c.haystack=? )其中,最大(nvl(?,1),1)和nvl(?,1)-1+之间的x“idx”


      • 以下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 
        
        包分页示例;
        导入java.sql.Connection;
        导入java.sql.DriverManager;
        导入java.sql.ResultSet;
        导入java.sql.ResultSetMetaData;
        导入java.sql.SQLException;
        导入java.sql.Statement;
        /**
        *
        *@Nwaeze Emmanuel(富奈,2016)
        */
        公共类分页示例扩展了javax.swing.JFrame{
        public void getRows(){
        连接con2;
        报表stmt2;
        结果集rs2;
        int j=0;
        字符串sz=“”;
        试一试{
        //加载MS accces驱动程序类
        forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
        String url=“jdbc:odbc:Driver={Microsoft Access驱动程序(*.mdb,
        *.accdb)};DBQ=“+”C:\\Database2.mdb”;
        试一试{
        con2=DriverManager.getConnection(url,“用户”,“用户”);
        System.out.println(“连接成功”);
        试一试{
        stmt2=con2.createStatement(ResultSet.TYPE\u SCROLL\u不敏感,
        ResultSet.CONCUR_可更新);
        字符串sql=“”;
        如果(txtpage.getText().trim().equals(“”)|124;
        txtpagesize.getText().trim().equals(“”){
        }否则{
        int pagesize=Integer.parseInt(txtpagesize.getText());
        int page=Integer.parseInt(txtpage.getText());
        sql=“从FSRegistration100L中选择*,其中序号>=”+
        
        (pagesize*PagePageSize+1)+”和“+”SN我知道这个问题很老了,但这就是我实现分页的方式,我希望它能帮助别人

        int pageNo = ....;    
        String query = "SELECT * FROM data LIMIT ";
        
        switch (pageNo) {
        case 0: // no pagination, get all rows
            query += Integer.MAX_VALUE; // a big value to get all rows
            break;
        case 1: // get 1st page i.e 50 rows
            query += 50;
            break;
        default:
            query += String.valueOf((pageNo-1)*50 + 1) ", " + String.valueOf(50);
            break;
        }
        
        PreparedStatement ps = connection.prepareStatement(query);
        ....
        

        将值50设为一个名为pageSize的常量,以便可以将其更改为任何数字

        您可以使用下面的方法进行此操作

      • 此处rowNo是您要从中删除的起始行的编号 获取n个记录
      • pageSize是要获取的记录总数
      • public CachedRowSet getScrollableList(PreparedStatement prestmt,int rowNo) { getPageSize(); 结果集rs=null; CachedRowSet crs=null; 尝试 { rs=prestmt.executeQuery(); crs=新的CachedRowSetImpl(); crs.setPageSize(页面大小); crs.填充(rs,rowNo); } catch(SQLException-ex) { logger.error(“getScrollableList()方法中的DatabaseInterface异常:”+ex.getMessage(),ex); } 最后 { //近距离 //关闭pstmt } 返回crs;
        select *   from ( select a.*, rownum rnum
        
        from ( YOUR_QUERY_GOES_HERE -- including the order by ) a
        
        where rownum <= MAX_ROWS )
        
        where rnum >= MIN_ROWS
        
        execute: Returns true if the first object that the query returns is a ResultSet object. Use this method if the query could return one or more ResultSet objects. Retrieve the ResultSet objects returned from the query by repeatedly calling Statement.getResutSet.
        
        Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement. If the value specified is zero, then the hint is ignored. The default value is zero.
        
        ReadAllQuery query = new ReadAllQuery();
        
        query.setReferenceClass(Employee.class);
        
        query.setSelectionCriteria(new ExpressionBuilder.get("id").greaterThan(100));
        
        // Set the JDBC fetch size
        
        query.setFetchSize(50);
        
        // Configure the query to return results as a ScrollableCursor
        
        query.useScrollableCursor();
        
        // Execute the query
        
        ScrollableCursor cursor = (ScrollableCursor) session.executeQuery(query);
        
        // Iterate over the results
        
        while (cursor.hasNext()) {
        
        System.out.println(cursor.next().toString());
        
        }
        
        cursor.close();
        
        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 
        
        int pageNo = ....;    
        String query = "SELECT * FROM data LIMIT ";
        
        switch (pageNo) {
        case 0: // no pagination, get all rows
            query += Integer.MAX_VALUE; // a big value to get all rows
            break;
        case 1: // get 1st page i.e 50 rows
            query += 50;
            break;
        default:
            query += String.valueOf((pageNo-1)*50 + 1) ", " + String.valueOf(50);
            break;
        }
        
        PreparedStatement ps = connection.prepareStatement(query);
        ....
        
        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; }