从数据库向JTable加载数据仅显示最后一行的问题求助
解决JTable加载数据库数据仅显示最后一行的问题
问题根源
你的代码存在两个核心问题:
- 每次循环重建TableModel:在
while (rs.next())循环内部,你反复调用setModel(new DefaultTableModel(...)),这会让每次循环都创建全新的表格模型,直接覆盖之前的所有数据,最终表格只会保留最后一次循环添加的行。 - 链式调用语法错误:
setModel()方法的返回值是void,无法直接在其后链式调用addRow(),这就是NetBeans提示"void type not allowed here"的原因。
修正方案
我们需要先初始化一个空的DefaultTableModel并设置好列名,然后在循环中逐行将数据库数据添加到模型中,最后再把这个完整的模型一次性设置给JTable。同时要注意关闭数据库资源,避免内存泄漏,并且尽量不要使用静态的数据库连接/语句对象(静态对象会长期占用资源,容易引发并发问题)。
修正后的完整代码
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class ProductTable extends JTable { public ProductTable() { try { loadProductTable(); } catch (ClassNotFoundException | SQLException ex) { Logger.getLogger(ProductTable.class.getName()).log(Level.SEVERE, null, ex); } } public void loadProductTable() throws ClassNotFoundException, SQLException { // 初始化表格模型,先设置列名,初始行数为0 DefaultTableModel model = new DefaultTableModel( new String[]{"ID", "CODE", "NAME", "CATEGORY", "IN STOCK", "UNIT PRICE"}, 0 ); Connection conn = null; PreparedStatement pst = null; ResultSet rs = null; try { conn = ConnectDB.connect(); String sql = "SELECT product_id, produce_code, product_name, category_id, unit_in_stock, unit_price FROM tblproduct"; pst = conn.prepareStatement(sql); rs = pst.executeQuery(); // 循环读取结果集,逐行添加到模型 while (rs.next()) { Object id = String.valueOf(rs.getInt("product_id")); Object code = String.valueOf(rs.getLong("produce_code")); Object name = rs.getString("product_name"); Object category = String.valueOf(rs.getInt("category_id")); Object instock = String.valueOf(rs.getFloat("unit_in_stock")); Object price = String.valueOf((long) rs.getFloat("unit_price")); Object[] rowData = new Object[]{id, code, name, category, instock, price}; model.addRow(rowData); } // 最后一次性设置表格模型 this.setModel(model); } finally { // 确保数据库资源被关闭,避免泄漏 if (rs != null) rs.close(); if (pst != null) pst.close(); if (conn != null) conn.close(); } } }
关键改进点说明
- 将
DefaultTableModel初始化放在循环外部,确保所有行都添加到同一个模型中 - 使用
try-finally块强制关闭数据库资源,避免长期占用连接池 - 移除静态数据库对象,改用局部变量,消除并发风险和资源泄漏隐患
- 先构建完整的表格模型,再一次性设置给JTable,减少表格刷新次数,提升性能
内容的提问来源于stack exchange,提问作者Achiya
相关产品推荐
相关产品推荐

