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

从数据库向JTable加载数据仅显示最后一行的问题求助

解决JTable加载数据库数据仅显示最后一行的问题

问题根源

你的代码存在两个核心问题:

  1. 每次循环重建TableModel:在while (rs.next())循环内部,你反复调用setModel(new DefaultTableModel(...)),这会让每次循环都创建全新的表格模型,直接覆盖之前的所有数据,最终表格只会保留最后一次循环添加的行。
  2. 链式调用语法错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:31:05