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

JavaFX CRUD项目MySQL数据库无法更新问题求助

问题排查与修复方案

核心问题:更新条件误用新编号而非原始选中数据的编号

你的代码中,更新SQL的WHERE Nomor_Barang = ?参数传入的是修改后的新编号(输入框的新值),而非选中数据的原始编号。如果用户修改了编号,数据库中找不到对应新编号的记录,自然不会更新任何行。

修复步骤:

  1. 在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");
    }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:30:19