You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何完美加载数据库数据至JTable?加载异常问题求助

问题:JTable加载数据库数据时无法正确刷新

尝试从数据库读取数据并展示到JTable中,但未达到预期效果:

  • 在循环内调用tbm.setRowCount(0)时,仅显示数据库表的最后一行(截图:仅显示最后一行)
  • 若不调用该方法,新数据会追加到原有行之后,无法清除之前的记录(截图:数据追加显示)

期望效果:清除JTable原有记录后,从第一行开始加载全部目标数据。

当前按钮点击事件代码如下:

try {
    String DataBaseURL = "jdbc:ucanaccess://posproject1.accdb";
    Connection connection=DriverManager.getConnection(DataBaseURL);
    System.out.println("Successfully connected to data base");

    Statement st= connection.createStatement();
    String sql1="SELECT * FROM Staff";
    ResultSet rs =st.executeQuery(sql1);
           
    DefaultTableModel tbm =(DefaultTableModel)jTable1.getModel();
    while(rs.next()){
        tbm.setRowCount(0);
        tbm.addRow(new Object[]{rs.getString(8), rs.getString(1), rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6),rs.getString(7)});
    }
             
    connection.close();
} catch (SQLException ex) {
    Logger.getLogger(AddNewStaff.class.getName()).log(Level.SEVERE, null, ex);
}

解决方法

问题核心是**tbm.setRowCount(0)的调用位置错误**:

  • 放在while循环内部时,每读取一条数据就清空一次表格,最终只会保留最后一条数据
  • 不调用则新数据会追加到原有数据后,无法实现刷新

修正步骤

  1. 在开始读取数据前,先调用tbm.setRowCount(0)清空表格原有记录
  2. 循环内仅执行addRow操作添加每条数据

修正后的代码

try {
    String DataBaseURL = "jdbc:ucanaccess://posproject1.accdb";
    Connection connection=DriverManager.getConnection(DataBaseURL);
    System.out.println("Successfully connected to data base");

    Statement st= connection.createStatement();
    String sql1="SELECT * FROM Staff";
    ResultSet rs =st.executeQuery(sql1);
           
    DefaultTableModel tbm =(DefaultTableModel)jTable1.getModel();
    // 先清空表格所有行
    tbm.setRowCount(0);
    while(rs.next()){
        // 循环添加每一条数据
        tbm.addRow(new Object[]{rs.getString(8), rs.getString(1), rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6),rs.getString(7)});
    }
             
    connection.close();
} catch (SQLException ex) {
    Logger.getLogger(AddNewStaff.class.getName()).log(Level.SEVERE, null, ex);
}

额外优化建议

  • 使用PreparedStatement替代Statement,避免SQL注入风险,提升代码安全性
  • 采用try-with-resources语法自动关闭连接、Statement和ResultSet,避免资源泄漏:
try (Connection connection = DriverManager.getConnection(DataBaseURL);
     Statement st = connection.createStatement();
     ResultSet rs = st.executeQuery(sql1)) {
    DefaultTableModel tbm =(DefaultTableModel)jTable1.getModel();
    tbm.setRowCount(0);
    while(rs.next()){
        tbm.addRow(new Object[]{rs.getString(8), rs.getString(1), rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6),rs.getString(7)});
    }
} catch (SQLException ex) {
    Logger.getLogger(AddNewStaff.class.getName()).log(Level.SEVERE, null, ex);
}

内容的提问来源于stack exchange,提问作者bilalsahi business

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:55:32