Prepared Statements 额外引号

Prepared Statements extra quotes

在 Java 中使用准备好的语句时,用字符串替换问号的方法会添加额外的引号,使我的查询变得混乱。这是我使用的代码:

ConnectToDB c = new ConnectToDB();
Connection conn = c.connectToDB();

String query = "select * from ?";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, "users");

ResultSet set = stmt.executeQuery();

while(set.next()){
    users.add(new Utente(set.getInt("id"),
                         set.getString("name"),
                         set.getString("surname"),
                         set.getString("email"),
                         set.getString("password"),
                         set.getString("imgURL"),
                         set.getString("orgURL"),
                (Boolean)set.getObject("isAuthor")));
}

stmt.close();

这是我的日志:显然,当调用 stmt.setString(1, "users") 替换 ?使用字符串 'users',包括引号:

java.sql.SQLSyntaxErrorException: 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 ''users'' at line 1

我试图寻找这个问题,但似乎每个人都想在他们的陈述中加入引号,显然,没有人遇到我的问题。我可能遗漏了一些愚蠢的东西,但我做错了什么?

我猜你的table叫users。您不对数据库对象名称使用参数,仅对您要输入查询的 values 使用参数。因此,在您的情况下,您只需将 users 放入实际的 SQL:

String query = "select * from users";
PreparedStatement stmt = conn.prepareStatement(query);

ResultSet set = stmt.executeQuery();

(或者在这种 特殊的 情况下,您可以使用 Statement 而不是 PreparedStatement,因为您没有使用任何参数。)

据推测,users 不是您从程序外部获得的字符串(例如,不是您从用户那里获得的字符串)。

如果您需要提供一个值,例如用户 ID,您将使用参数:

String query = "select * from users where id = ?";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setInt(1, userId);

ResultSet set = stmt.executeQuery();

旁注:我建议使用 try-with-resources 而不是像 那样直接调用 close。看起来像这样:

String query = "select * from users";
ConnectToDB c = new ConnectToDB();
try (
    Connection conn = c.connectToDB();
    PreparedStatement stmt = conn.prepareStatement(query);
) {
    ResultSet set = stmt.executeQuery();

    while(set.next()){
        users.add(new Utente(set.getInt("id"),
                             set.getString("name"),
                             set.getString("surname"),
                             set.getString("email"),
                             set.getString("password"),
                             set.getString("imgURL"),
                             set.getString("orgURL"),
                    (Boolean)set.getObject("isAuthor")));
    }
}