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
相关产品推荐
相关产品推荐

