如何从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 的原因:精确提取返回的行数超过了请求的行数