如何在JDBC preparedStatement中解决MySQLSyntaxErrorException

时间:2018-01-14 12:37:25

标签: java mysql jdbc syntax-error prepared-statement

我有一个查询会引发com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException但我无法弄清楚原因。我正在使用xampp,当我直接尝试相同的查询时,它工作正常。我还有一大堆其他方法使用非常相似的查询,所有这些方法都有效。 问题似乎是更新日期,我在错误消息中注意到java放置了' '在日期周围,这使它成为一个字符串,可能是错误的原因。但是,我不确定如何解决这个问题,将日期作为日期插入。

以下是代码:

public void update(int userId, String date, String column, String value){
    try {
        // convert date from String to Date
        DateTime dt = DateTime.parse(date);  
        java.sql.Date sqlDate = new java.sql.Date(dt.getMillis()); 
        // create prepared statement
        conn = DriverManager.getConnection("jdbc:mysql://localhost/db","root", "");
        String query = "UPDATE expenses_income SET ? = ? WHERE userId = ? AND date = CAST(? AS DATETIME);";
        PreparedStatement preparedStmt = conn.prepareStatement(query);
        preparedStmt.setString(1, column);
        preparedStmt.setString(2, value);
        preparedStmt.setInt(3, userId);
        preparedStmt.setDate(4, sqlDate);
        preparedStmt.executeUpdate();

        conn.close();
    } catch (Exception e) {
        System.err.println("MySQL exception: " + e);
    }
}

错误信息:

MySQL exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''comment' = '123' WHERE userId = 1 AND date = CAST('2018-01-06' AS DATETIME)' at line 1

我还尝试了这个查询而没有将其作为日期时间进行转换:

String query = "UPDATE expenses_income SET ? = ? WHERE userId = ? AND date = ?;";

但我得到同样的错误。 然后我尝试使用java.util.Date代替Joda DateTime,但它没有帮助。有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

..正确的语法使用附近'评论' =' 123'

由于列名称参数化不正确,您将收到异常。

 UPDATE expenses_income SET ? = ?

应该是

 UPDATE expenses_income SET column_name = ?

我还注意到SQL末尾有一个分号;,应该删除它,你不需要明确地转换Date。它应该只是

UPDATE expenses_income SET column_name = ? WHERE userId = ? AND date = ?

此外,您不应将列名称命名为date,它应该是last_updated或有意义的内容。