Java JDBC使用PreparedStatement更新表时参数自动带括号的问题
问题解决:JDBC PreparedStatement参数自动添加括号的问题
你的代码存在两个关键问题导致了这个异常:
错误调用带参数的
executeUpdate(sql)方法
PreparedStatement已经通过conn.prepareStatement(sql)完成了SQL模板的预编译,并且你已经通过setString绑定了参数。此时调用executeUpdate(sql)会绕过预编译逻辑,驱动可能错误地用括号包裹参数来拼接SQL。正确做法是调用无参的executeUpdate(),让驱动使用已绑定参数的预编译语句执行。SQL模板与实际执行的SQL字段不一致
你编写的SQL模板中WHERE条件是recipe_id = ?,但实际生成的SQL变成了recipe_url = ('40892'),这大概率是代码笔误或表结构混淆,需要确认字段名是否匹配。
修正后的代码如下:
PreparedStatement pst = null; try { String sql = "UPDATE lfvadd SET recipe_name = ? WHERE recipe_id = ?"; pst = conn.prepareStatement(sql); pst.setString(1, "malgapodi coconut tomato"); pst.setString(2, "40892"); // 调用无参的executeUpdate方法 int affectedRows = pst.executeUpdate(); System.out.println("更新了 " + affectedRows + " 条记录"); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭资源避免泄漏 if (pst != null) { try { pst.close(); } catch (SQLException e) { e.printStackTrace(); } } }
额外补充两点注意事项:
- 不要依赖打印PreparedStatement对象查看最终SQL,不同JDBC驱动的toString实现逻辑不同,无法保证显示真实执行的语句,建议通过数据库查询日志查看实际执行的SQL。
- 优先使用try-with-resources语法自动关闭资源,比手动在finally块中关闭更简洁安全。
内容的提问来源于stack exchange,提问作者Naveen
相关产品推荐
相关产品推荐

