如何从 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 并对剩余的行进行分页?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL Workbench 从 SQL Server 2008 迁移到 MySQL:错误:确定要复制的行数:不支持的操作数类型