MySQL更新有效,但在PreparedStatement中使用时则无效

时间:2014-11-19 17:28:02

标签: java mysql

无法弄清楚这一点。一切看起来都不错,但是当它运行时我一直收到MySQLSyntaxErrorException。

public static void setSupervisorApproval(HttpServletRequest request) throws ClassNotFoundException, SQLException {
    String requestID = request.getParameter("txtRequestId");
    boolean approved = request.getParameter("ckbApprove") != null;
    Connection conn = getConnection();
    Date approveDate = new Date();

    String query = "UPDATE request SET isApproved=?, approverDate=?, approver=?, comments=? where id=?;";
    PreparedStatement ps = conn.prepareStatement(query);
    ps.setBoolean(1, approved);
    ps.setDate(2, new java.sql.Date(approveDate.getTime()));
    ps.setInt(3, Integer.parseInt(request.getParameter("txtUser")));
    ps.setString(4, request.getParameter("taComments"));
    ps.setInt(5, Integer.parseInt(requestID));

    System.out.println(ps);

    ps.executeUpdate(query);

    ps.close();
    conn.close();
}

运行该方法时,查询看起来很好。例如,一个这样的结果是:

UPDATE request SET isApproved=1, approverDate='2014-11-19', approver=80, comments='This is a comment.' where id=1;

将在MySQL命令行中用作更新查询。但是,我在Java中运行时出现此错误:

An error has occurred: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?, approverDate=?, approver=?, comments=? where id=?' at line 1.

其他人遇到此问题并进行修复吗?

编辑:我理解(在校对我的页面之后)我对表名和HttpServletRequest变量名使用“request”。因为它不影响这个问题,我稍后会解决这个问题。

编辑2:更新了实际代码。原本是从我修改过的一些测试代码中获取它来测试哪个变量导致它变为barf。

1 个答案:

答案 0 :(得分:2)

您已调用executeUpdate(String)方法,该方法继承自Statement并且不使用占位符变量执行您的预准备语句,这解释了为什么您得到?无效语法错误消息

改为调用executeUpdate(),这是PreparedStatement中定义的,并按照您的意图行事。

另外,正如已经指出的那样,在调用setXyz方法时按顺序编号参数1-5。