我试图用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=?'
2条答案
按热度按时间f8rj6qna1#
com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:您的sql语法有错误;检查与您的mysql服务器版本对应的手册,以获得使用near'的正确语法?或第1行的membername=?'
mysql不理解
?
在sql查询中。这确实是无效的sql语法。所以不知何故它没有被PreparedStatement
. 你猜怎么着?您正在用原始查询覆盖准备好的查询!你需要称之为无争论
PreparedStatement#executeQuery()
方法而不是Statement#executeQuery(String)
.与问题无关,您的代码正在泄漏资源。数据库将在几个小时后用完它们,您的应用程序将崩溃。要解决这个问题,您需要遵循jdbc习惯用法closing
Connection
,Statement
以及ResultSet
在finally
块try
封锁他们被收购的地方。有关更多详细信息,请参阅jdbc基础教程。eyh26e7m2#
如果你看一下javadocs
Statement
(的超类)PreparedStatement
),方法文档executeQuery(String)
以及executeUpdate(String)
请这样说:注意:此方法不能在
PreparedStatement
或者CallableStatement
.这就是你在这里做的:打电话
executeQuery(String)
从Statement
在PreparedStatement
对象。既然javadocs说您“不能”这样做,那么您得到的实际行为是未指定的。。。可能依赖于jdbc驱动程序。在本例中,您使用的mysql驱动程序似乎将其解释为您将更新作为一个未准备好的语句,因此
?
标记不被解释为参数占位符。这导致服务器端sql解析器说“语法错误”。(如果mysql驱动程序抛出了一个不同的未检查的异常,那么对程序员来说就更容易了;例如
UnsupportedOperationException
. 然而,标准的jdbcjavadocs没有说明在这种情况下应该发生什么。由供应商决定他们的司机会怎么做。)