如何从 MySQL 将确切的行数加载到 jTable 并对剩余的行进行分页?

Posted

技术标签:

【中文标题】如何从 MySQL 将确切的行数加载到 jTable 并对剩余的行进行分页?【英文标题】:How to load exact number of rows to jTable from MySQL and paginate the remaining? 【发布时间】:2019-04-19 23:05:42 【问题描述】:

我正在尝试将数据从 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);
    
 

我正在使用带有 MySQL 的 NetBeans。如果问题不清楚,请告诉我以澄清。

编辑:感谢@George Z。我们通过将按钮方法更改为如下所示解决了这个问题。我正在编辑问题,因为我无法在 cmets 中写出答案:

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

【问题讨论】:

【参考方案1】:

意见提示:不要吞下异常,也不要像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.

【讨论】:

没关系,现在可以使用了!但它不会更新表,接下来的 100 会不断添加。我希望接下来的 100 个覆盖表中的前一个。 我应该在preparedStatement中使用我的第二个查询吗? @Hefaz 是的,但我没有过多关注它,因为这是一个不同的故事。 非常感谢。现在问题已经解决了。我在没有准备好的声明的情况下做到了。我将编辑问题中按钮的方法。【参考方案2】:

你可以使用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 并对剩余的行进行分页?的主要内容,如果未能解决你的问题,请参考以下文章

重置 SQLite3/MySQL 中的行数计数

从双表中选择确切的行数

将arrayList数据加载到JTable中

使用 Dask 从 CSV 文件中采样确切的行数

如何知道JTable是否为空?

MySQL Workbench 从 SQL Server 2008 迁移到 MySQL:错误:确定要复制的行数:不支持的操作数类型