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