如何完美加载数据库数据至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循环内部时,每读取一条数据就清空一次表格,最终只会保留最后一条数据 - 不调用则新数据会追加到原有数据后,无法实现刷新
修正步骤
- 在开始读取数据前,先调用
tbm.setRowCount(0)清空表格原有记录 - 循环内仅执行
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
相关产品推荐
相关产品推荐

