如何从MySQL中将精确的行数加载到jTable并对其余的分页?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从MySQL中将精确的行数加载到jTable并对其余的分页?相关的知识,希望对你有一定的参考价值。

我正在尝试将数据从mysql加载到我的应用程序中,我有一个jTable。我想使用查询只加载100行,我现在可以成功完成。此外,我想对这些数据进行分页,如果我有下一个按钮,然后点击它,表格应该更新100个记录,依此类推。

此方法将数据加载到表中:


public void showTable(){
        try{ 

            how.res = how.stat.executeQuery("select * from students order by name ASC limit 100");

            while(how.res.next()){
                String id = how.res.getString(1);
                String name = how.res.getString(2);
                String contact = how.res.getString(3);

                Object[] content = {id,name,contact};
                DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
                model.addRow(content);

            }
        }catch (Exception e){

        }
    }

我在表单初始化时调用此方法,现在我只在表中获得100行,我应该为下一个按钮加载下一行100并更新表格?

我尝试了什么:


private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        try{ 
            numClick+=100;
            how.res = how.stat.executeQuery("select * from students offset"+numClick+"");

            while(how.res.next()){
                String id = how.res.getString(1);
                String name = how.res.getString(2);
                String contact = how.res.getString(3);

                Object[] content = {id,name,contact};
                DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
                model.addRow(content); 
            }
        }catch (Exception e){

        }  
    } 

但这并没有给我任何结果。

这是连接:

public class JoinConnection {

    public Connection con;
    public Statement stat;
    public ResultSet res;

    public JoinConnection(){

        systemConnection();
    }

    public void systemConnection(){
        try{
        Class.forName("com.mysql.jdbc.Driver");
        con =(com.mysql.jdbc.Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/library","root","");
                stat = (Statement) con.createStatement();
        }catch(ClassNotFoundException | SQLException e){System.out.println(e);}
    }
} 

我正在使用NetBeans和MySQL。如果问题不明确,请告诉我澄清。

编辑:感谢@George Z.我们通过将按钮方法更改为以下内容来解决问题。我正在编辑这个问题,因为我不能在评论中写下答案:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    try{ 
        numClick+=100;
        DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
        model.setRowCount(0);
        how.res = how.stat.executeQuery("select * from students limit "+numClick+" , 100");

            while(how.res.next())
            {
            String id = how.res.getString(1);
            String name = how.res.getString(2);
            String contact = how.res.getString(3);

            Object[] content = {id,name,contact};
            model.addRow(content);
            }
        }catch (SQLException e){
        e.printStackTrace();
    }  
}
答案

意见提示:不要吞下异常,也不要像Exception那样面对任何特定类型的异常。在你的情况下,你应该把它们作为SQLException捕获它们并至少打印它们的堆栈跟踪。

由于您的第一页 - 查询是"select * from students order by name ASC limit 100"下一页 - 下一个查询应该像"select * from students order by name ASC limit "+numClick+" , 100",numClick在每页增加100。当然numClick变量应该由PreparedStatement处理。在这里阅读how to use prepared statements

为了了解LIMIT,请再看看this回答的问题。

如果您的数据很小,另一种可以提供机会的方法是将所有内容加载到内存(数据结构)中,然后从那里填充数据。

更改页面时,您将需要从表中获取当前数据。一个简单的搜索将指导您在这个question.

另一答案

你可以使用LIMIT 0, 100

SELECT * FROM students ORDER by name ASC LIMIT 0, 100    // Returns 1   -> 100
SELECT * FROM students ORDER by name ASC LIMIT 100, 101  // Returns 101 -> 201
SELECT * FROM students ORDER by name ASC LIMIT 200, 101  // Returns 201 -> 301

以上是关于如何从MySQL中将精确的行数加载到jTable并对其余的分页?的主要内容,如果未能解决你的问题,请参考以下文章

需要 ORA-01422 的解决方案:精确提取返回的行数超过请求的行数

获取 ORA-01422 的原因:精确提取返回的行数超过了请求的行数

重置 SQLite3/MySQL 中的行数计数

WHILE循环出错:ORA-01422:精确提取返回的请求行数多于请求的行数

MySql 的行数并插入到计数的表中

尝试从两列中提取多条记录时,精确提取返回的行数超过了请求的行数