当尝试执行PreparedStatement时,MySQLSyntaxErrorException接近“?”

我正在尝试使用Java中的PreparedStatement执行查询。

当我尝试执行我的查询(语法错误)时,我得到错误号1064。

我已经在MySQL查询浏览器中使用替代值进行了testing,工作正常。

我的代码有什么问题?

以下是相关的代码:

String query = "select MemberID, MemberName from members where MemberID = ? or MemberName = ?"; Connection conn = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD); PreparedStatement s = conn.prepareStatement(query); s.setInt(1, 2); s.setString(2, "zen"); ResultSet rs = s.executeQuery(query); 

这是我得到的exception:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法错误; 检查与您的MySQL服务器版本相对应的手册,在正确的语法附近使用'? 或者MemberName =? 在第1行

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法错误; 检查与您的MySQL服务器版本相对应的手册,在正确的语法附近使用'? 或者MemberName =? 在第1行

MySQL不理解的含义? 在SQL查询中。 这的确是无效的SQL语法。 所以它不会被PreparedStatement取代。 你猜怎么着?

 PreparedStatement s = conn.prepareStatement(query); s.setInt(1, intValue); s.setString(2, strValue); rs = s.executeQuery(query); // Fail! 

您正在使用原始查询覆盖准备好的查询! 您需要调用无争议的PreparedStatement#executeQuery()方法而不是Statement#executeQuery(String)

 PreparedStatement s = conn.prepareStatement(query); s.setInt(1, intValue); s.setString(2, strValue); rs = s.executeQuery(); // OK! 

无关的问题,你的代码泄漏资源。 数据库将在几个小时后用完,你的应用程序将崩溃。 为了解决这个问题,你需要遵循在ResultSet它们的try块的finally块中closuresConnectionStatementResultSet的JDBC方法。 查看JDBC基础教程以获取更多详细信息。