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

JTable无法从MySQL加载数据,代码无报错求助

问题分析与修复方案

你的代码运行无报错但JTable不显示数据,核心原因是初始化方法未调用,同时存在SQL语法错误、数据填充逻辑错误等问题,以下是具体修复步骤:


1. 调用数据库初始化方法

你定义了initializeDB()但从未执行它,在构造函数中添加调用,确保窗口启动时就加载数据:

public NewJFrame() {
    initComponents();
    initializeDB(); // 添加这行
}

2. 修正SQL语法错误

数据库名和表名包含空格,MySQL中需要用反引号`包裹,否则会被解析为两个标识符:

// 修正URL中的数据库名
private static final String DB_URL = "jdbc:mysql://localhost:3306/`customer database`?zeroDateTimeBehavior=CONVERT_TO_NULL";
// 修正查询语句中的表名
pst = sqlConn.prepareStatement("SELECT * FROM `customer database`");

3. 替换自定义obj类为标准集合

你使用了未定义的obj类,DefaultTableModel.addRow()需要接收Object[]或Vector类型,改用Vector<Object>来存储行数据:

while(rs.next()){
    Vector<Object> columnData = new Vector<>();
    // 直接添加四个字段,不需要循环(循环会重复添加数据)
    columnData.add(rs.getString("id"));
    columnData.add(rs.getString("name"));
    columnData.add(rs.getString("age"));
    columnData.add(rs.getString("order_number"));
    RecordTable.addRow(columnData);
}

注:原代码中的for循环会重复添加4次相同的字段数据,导致每行元素数量远超表格列数,数据无法正确显示,直接去掉循环即可。

4. 修正表格列索引

鼠标点击事件中表格列索引从1开始,而Swing表格索引是从0开始,修正后才能正确获取选中行的数据:

txtID.setText(RecordTable.getValueAt(SelectedRows, 0).toString());
txtName.setText(RecordTable.getValueAt(SelectedRows, 1).toString());
txtAge.setText(RecordTable.getValueAt(SelectedRows, 2).toString());
txtOrderNo.setText(RecordTable.getValueAt(SelectedRows, 3).toString());

5. 更新JDBC驱动(可选但推荐)

com.mysql.jdbc.Driver是旧版驱动,MySQL 8.0+建议使用新版驱动,同时JDBC4.2及以上版本无需手动加载驱动:

// 移除Class.forName("com.mysql.jdbc.Driver");
// 替换驱动类(如果使用MySQL 8.0+)
private static final String DB_URL = "jdbc:mysql://localhost:3306/`customer database`?zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=UTC";
// 连接时会自动加载com.mysql.cj.jdbc.Driver

6. 关闭数据库资源(避免泄漏)

在try-catch-finally中关闭Connection、PreparedStatement和ResultSet,防止资源泄漏:

private void initializeDB()  {
    try {
        sqlConn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
        pst = sqlConn.prepareStatement("SELECT * FROM `customer database`");
        rs = pst.executeQuery();
        // ... 数据填充逻辑 ...
    } catch (Exception ex) {
        JOptionPane.showMessageDialog(null, ex.getMessage());
    } finally {
        // 关闭资源,注意顺序:先ResultSet,再PreparedStatement,最后Connection
        try {
            if(rs != null) rs.close();
            if(pst != null) pst.close();
            if(sqlConn != null) sqlConn.close();
        } catch(SQLException e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }
}

完整修正后的核心代码片段

public class NewJFrame extends javax.swing.JFrame {

    private static final String DB_URL = "jdbc:mysql://localhost:3306/`customer database`?zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=UTC";
    private static final String DB_USER = "root";
    private static final String DB_PASSWORD = "";
    
    Connection sqlConn = null;
    PreparedStatement pst = null;
    ResultSet rs = null;
    int q, i, id, deleteItem;
    
    public NewJFrame() {
        initComponents();
        initializeDB(); // 调用初始化方法
    }
    
    private void initializeDB()  {
        try {
            sqlConn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
            pst = sqlConn.prepareStatement("SELECT * FROM `customer database`");
            rs = pst.executeQuery();
            DefaultTableModel RecordTable = (DefaultTableModel)jTable2.getModel();
            RecordTable.setRowCount(0);
            while(rs.next()){
                Vector<Object> columnData = new Vector<>();
                columnData.add(rs.getString("id"));
                columnData.add(rs.getString("name"));
                columnData.add(rs.getString("age"));
                columnData.add(rs.getString("order_number"));
                RecordTable.addRow(columnData);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        } finally {
            try {
                if(rs != null) rs.close();
                if(pst != null) pst.close();
                if(sqlConn != null) sqlConn.close();
            } catch(SQLException e) {
                JOptionPane.showMessageDialog(null, e.getMessage());
            }
        }
    }
    
    private void jTable2MouseClicked(java.awt.event.MouseEvent evt) {                                     
        DefaultTableModel RecordTable = (DefaultTableModel)jTable2.getModel();
        int SelectedRows = jTable2.getSelectedRow();
        if(SelectedRows != -1){ // 增加判断,避免选中无效行报错
            txtID.setText(RecordTable.getValueAt(SelectedRows, 0).toString());
            txtName.setText(RecordTable.getValueAt(SelectedRows, 1).toString());
            txtAge.setText(RecordTable.getValueAt(SelectedRows, 2).toString());
            txtOrderNo.setText(RecordTable.getValueAt(SelectedRows, 3).toString());
        }
    }

    // ... 其余代码不变 ...
}

内容的提问来源于stack exchange,提问作者Hamza Faisal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:40:37