【发布时间】: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资源以自动关闭Connection、PreparedStatement或ResultSet中受益。
标签: java mysql prepared-statement