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

Eclipse中使用UPDATE-SET-WHERE更新MySQL数据库报错如何解决

核心问题说明

你的代码报错主要有两个直接原因:

  1. SQL字符串拼接时缺少空格,"UPDATE Chemicals" + "SET..."拼接后会变成UPDATE ChemicalsSET...,不符合SQL语法规范
  2. 把rs.getInt()、Integer.parseInt()、txtChemical_ID.getText()这类Java代码直接写在了双引号包裹的SQL字符串中,数据库无法识别Java语法,直接抛出语法错误
    除此之外你的代码还存在SQL注入风险、资源未释放、逻辑冗余的问题,以下是修正后的完整代码:
修正后代码
public void IDEnter() {
    // 优先校验用户输入的增减量格式,避免非数字输入触发异常
    int changeAmount;
    try {
        changeAmount = Integer.parseInt(AmountAdded.getText().trim());
    } catch (NumberFormatException e) {
        JOptionPane.showMessageDialog(null, "请输入有效的数字数量");
        return;
    }
    String chemicalId = txtChemical_ID.getText().trim();
    
    String dbUrl = "jdbc:mysql://localhost:8889/StockControlSystem";
    String dbUser = "root";
    String dbPwd = "root";

    // 使用try-with-resources自动释放数据库连接、语句对象,无需手动关闭
    try (
        Connection con = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
        // 用PreparedStatement预编译SQL,避免SQL注入,简化参数传递
        PreparedStatement pstmt = con.prepareStatement("UPDATE Chemicals SET `Volume` = `Volume` + ? WHERE `Chemical ID` = ?")
    ) {
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 给SQL占位符赋值
        pstmt.setInt(1, changeAmount);
        pstmt.setString(2, chemicalId);

        // 执行更新返回受影响行数,不需要提前查询判断ID是否存在
        int affectedRows = pstmt.executeUpdate();
        if (affectedRows == 0) {
            JOptionPane.showMessageDialog(null, "Invalid chemical ID");
            txtChemical_ID.setText(null);
        }
    } catch(Exception exc) {
        exc.printStackTrace();
    }
}
优化点说明
  • 移除了冗余的SELECT查询,直接通过UPDATE返回的受影响行数判断化学品ID是否有效,减少一次数据库交互
  • 新增用户输入数量的格式校验,避免非数字输入导致程序崩溃
  • 改用预编译SQL的PreparedStatement替代Statement,彻底解决SQL注入风险,也不需要手动处理SQL字符串的拼接、引号转义问题
  • 采用try-with-resources语法自动关闭数据库相关资源,避免连接泄漏问题

内容的提问来源于stack exchange,提问作者Thu An

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:45:04