如何从MySQL加载准确的行数到jTable并分页其余的行?

时间:2019-04-19 23:05:42

标签: java mysql swing pagination

我正在尝试将MySQL中的数据加载到我的jTable中的Application中。我只想使用查询加载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一起使用。如果问题不清楚,请告诉我以澄清。

编辑:感谢@GeorgeZ。我们通过将button方法更改为如下所示的方式解决了该问题。我正在编辑问题,因为我无法在评论中写下答案:

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();
    }  
}

2 个答案:

答案 0 :(得分:1)

一个意见提示:不要吞下异常,也不要面对任何特定类型的异常,例如Exception。就您而言,您应该以{{1​​}}的形式捕获它们,并至少打印它们的堆栈跟踪。

由于您的第一页-查询为SQLException,下一页-下一个查询应类似于"select * from students order by name ASC limit 100",每页的numClick均增加100。当然"select * from students order by name ASC limit "+numClick+" , 100"变量应该由numClick处理。在此处how to use prepared statements中阅读。

为了理解PreparedStatement,还请看this回答的问题。

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

更改页面时,您将不得不从表中获取当前数据。一个简单的搜索将指导您完成此question.

答案 1 :(得分:0)

您可以使用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