mysqlsyntaxerrorexception

hjqgdpho  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(285)

我试图用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服务器版本对应的手册,以获得使用near'的正确语法?或第1行的membername=?'

f8rj6qna

f8rj6qna1#

com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:您的sql语法有错误;检查与您的mysql服务器版本对应的手册,以获得使用near'的正确语法?或第1行的membername=?'
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习惯用法closing Connection , Statement 以及 ResultSetfinallytry 封锁他们被收购的地方。有关更多详细信息,请参阅jdbc基础教程。

eyh26e7m

eyh26e7m2#

如果你看一下javadocs Statement (的超类) PreparedStatement ),方法文档 executeQuery(String) 以及 executeUpdate(String) 请这样说:
注意:此方法不能在 PreparedStatement 或者 CallableStatement .
这就是你在这里做的:打电话 executeQuery(String)StatementPreparedStatement 对象。
既然javadocs说您“不能”这样做,那么您得到的实际行为是未指定的。。。可能依赖于jdbc驱动程序。在本例中,您使用的mysql驱动程序似乎将其解释为您将更新作为一个未准备好的语句,因此 ? 标记不被解释为参数占位符。这导致服务器端sql解析器说“语法错误”。
(如果mysql驱动程序抛出了一个不同的未检查的异常,那么对程序员来说就更容易了;例如 UnsupportedOperationException . 然而,标准的jdbcjavadocs没有说明在这种情况下应该发生什么。由供应商决定他们的司机会怎么做。)

相关问题