JavaFX CRUD项目MySQL数据库无法更新问题求助
问题排查与修复方案
核心问题:更新条件误用新编号而非原始选中数据的编号
你的代码中,更新SQL的WHERE Nomor_Barang = ?参数传入的是修改后的新编号(输入框的新值),而非选中数据的原始编号。如果用户修改了编号,数据库中找不到对应新编号的记录,自然不会更新任何行。
修复步骤:
- 在
handleUpdateDataButton中获取选中数据的原始编号:
@FXML private void handleUpdateDataButton(ActionEvent event) { DataBarang selectedData = tableView.getSelectionModel().getSelectedItem(); if (selectedData != null) { // 获取选中数据的原始编号,用于定位要更新的行 int originalNomorBarang = selectedData.getNomorBarang(); String namaBarang = namaBarangField.getText(); int nomorBarang = Integer.parseInt(nomorBarangField.getText()); int jumlah = Integer.parseInt(jumlahField.getText()); String spesifikasi = spesifikasiField.getText(); String tanggal = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); // 调用时传入原始编号 if (updateDataBarang(namaBarang, nomorBarang, jumlah, spesifikasi, tanggal, originalNomorBarang)) { System.out.println("Data berhasil diupdate"); PaneTambah.setVisible(false); refreshTableData(); } else { System.out.println("Gagal mengupdate data"); } } else { showAlert("Peringatan", "Pilih data yang akan diupdate"); } }
- 修改
updateDataBarang方法的参数与绑定逻辑:
private boolean updateDataBarang(String namaBarang, int newNomorBarang, int jumlah, String spesifikasi, String tanggal, int originalNomorBarang) { String query = "UPDATE `barang` SET " + "`Nama_Barang`=?," + "`Nomor_Barang`=?," + "`Jumlah`=?," + "`Spesifikasi`=?," + "`Tanggal`=? WHERE Nomor_Barang = ?"; try (Connection connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); PreparedStatement preparedStatement = connection.prepareStatement(query)) { preparedStatement.setString(1, namaBarang); preparedStatement.setInt(2, newNomorBarang); // 设置新编号 preparedStatement.setInt(3, jumlah); preparedStatement.setString(4, spesifikasi); preparedStatement.setString(5, tanggal); preparedStatement.setInt(6, originalNomorBarang); // 用原始编号定位要更新的行 int rowsAffected = preparedStatement.executeUpdate(); return rowsAffected > 0; } catch (SQLException e) { e.printStackTrace(); return false; } }
其他排查点
- 检查控制台是否有
SQLException输出:若数据库连接、SQL语法或字段名有误,异常信息会直接暴露问题(比如字段名拼写错误、数据类型不匹配)。 - 验证
refreshTableData方法逻辑:确认该方法是重新从数据库拉取数据并更新TableView,而非仅操作本地缓存。 - 增加输入合法性校验:避免非数字输入导致的
NumberFormatException中断更新流程:
try { int nomorBarang = Integer.parseInt(nomorBarangField.getText()); int jumlah = Integer.parseInt(jumlahField.getText()); // 后续更新逻辑 } catch (NumberFormatException e) { showAlert("错误", "编号和数量必须为整数"); return; }
内容的提问来源于stack exchange,提问作者hotredmoon
相关产品推荐
相关产品推荐

