我正在尝试将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();
}
}
答案 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