开发者社区> 问答> 正文

MySQLSyntaxErrorException在“?”附近 尝试执行PreparedStatem

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

尝试执行查询时出现错误号1064(语法错误)。

我已经在MySQL查询浏览器中使用替代值测试了此方法,效果很好。

我的代码有什么问题?

以下是相关代码:

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); 这是我得到的例外:

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

展开
收起
保持可爱mmm 2020-05-11 10:56:42 454 0
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! 与该问题无关,您的代码正在泄漏资源。几个小时后,数据库将耗尽它们,并且您的应用程序将崩溃。要解决此问题,您需要遵循JDBC习惯语close Connection,Statement并ResultSet在获取它们finally的代码try块中。有关详细信息,请参见JDBC基本教程。来源:stack overflow

    2020-05-11 10:56:54
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spark SQL: Past, Present and Future 立即下载
Spark SQL:Past Present &Future 立即下载
低代码开发师(初级)实战教程 立即下载