Eclipse中使用UPDATE-SET-WHERE更新MySQL数据库报错如何解决
核心问题说明
你的代码报错主要有两个直接原因:
- SQL字符串拼接时缺少空格,
"UPDATE Chemicals" + "SET..."拼接后会变成UPDATE ChemicalsSET...,不符合SQL语法规范 - 把
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
相关产品推荐
相关产品推荐

