如何解决 JDBC PreparedStatement 中的 MySQLSyntaxErrorException [重复]

Posted

技术标签:

【中文标题】如何解决 JDBC PreparedStatement 中的 MySQLSyntaxErrorException [重复]【英文标题】:How to resolve MySQLSyntaxErrorException in JDBC preparedStatement [duplicate] 【发布时间】:2018-01-14 12:37:24 【问题描述】:

我有一个查询会引发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,但这没有帮助。有什么想法吗?

谢谢!

【问题讨论】:

列名不能作为prepared statement的参数。 参数只针对,列名不是值。 【参考方案1】:

.. ''comment' = '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 或其他有意义的名称。

【讨论】:

我将查询更改为“字符串查询=”更新费用_收入设置? = ? WHERE userId = " + column + " AND date = CAST(?AS DATETIME);";"但我仍然收到相同的错误消息。编辑对不起,我刚刚注意到我的错误。谢谢! @kattapillar 你懒得看我的解决方案。我说,你应该保留列名。仔细看看我的解决方案。

以上是关于如何解决 JDBC PreparedStatement 中的 MySQLSyntaxErrorException [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JDBC-PreparedStatement实现CURD(笔记)

DBeaver客户端工具结果集缓存实现的猜测

java连接SQL Server数据库

如何解决“无法为连接 URL 创建类 'com.mysql.jdbc.Driver' 的 JDBC 驱动程序”

我需要帮助解决这个 JDBC 异常错误,如何解决这个问题?

如何解决 JDBC PreparedStatement 中的 MySQLSyntaxErrorException [重复]