【问题标题】:Prepared Statements extra quotes准备好的报表额外报价
【发布时间】:2019-09-11 14:58:18
【问题描述】:

在 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") 替换 ?使用字符串“用户”,包括引号:

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-name。我不了解 MySQL,但大多数数据库不允许您这样做。
  • 这一般是不可能的,你可以在WHERE子句中使用?,但据我所知,在SQL语句的其他部分是不行的。您必须为此使用StringBuilder 或直接String 连接(不好,我知道)。
  • @deHaar 此外,您不能将? 用作WHERE 子句中的参数,例如? = ?,它只能用于author = ? 等值
  • @Nexevis 是的,对,谢谢...我什至不知道它在HAVING 中是否有效,但也许是。
  • 您还可以从研究try-with 资源以自动关闭ConnectionPreparedStatementResultSet 中受益。

标签: java mysql prepared-statement


【解决方案1】:

我认为你的桌子叫做users。您不将参数用于 DB 对象名称,仅用于您正在输入查询的 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,如Nexevis said。看起来像这样:

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")));
    }
}

【讨论】:

    猜你喜欢
    • 2014-04-26
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多