这是一个非常奇怪的错误,今天才开始出现。当我使用带有参数?的预处理语句时,会出现错误,但是当我不使用参数时,它可以正常工作。 以下是导致错误的代码:
String table = "files";
Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
PreparedStatement prep = conn.prepareStatement("SELECT * FROM ?");
prep.setString(1, table);
ResultSet rs = prep.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("file_name"));
}
这会产生以下错误:
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''files'' at line 1
另外,将其更改为以下内容也可以正常工作:
String table = "files";
Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
PreparedStatement prep = conn.prepareStatement("SELECT * FROM " + table);
ResultSet rs = prep.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("file_name"));
}
这似乎没有太多意义。有什么想法吗?
在另一张表上尝试了一下,结果更奇怪了。 这个可以正常工作并正确记录管理员登录:
String sql = "SELECT * FROM " + ADMIN_AUTH_TABLE + " WHERE " + column + " = '" + hashedPassword + "'";
PreparedStatement prepared = connection.prepareStatement(sql);
以下代码不会导致错误,但会返回一个信息,说输入的密码是不正确的(但它是正确的——我已经再三确认过)。
String sql = "SELECT * FROM " + ADMIN_AUTH_TABLE + " WHERE ? = ?";
PreparedStatement prepared = connection.prepareStatement(sql);
prepared.setString(1, column);
prepared.setString(2, hashedPassword);
明白了:使用 ? 代替值。 此外,这里的答案有所帮助。