This question already has answers here:
Using Prepared Statements to set Table Name

(7个答案)


7年前关闭。




我正在尝试将PreparedStatement与以下代码结合使用:
SELECT * FROM ? WHERE name = ?

显然,当我使用setString()设置表和名称字段时会发生以下情况:
SELECT * FROM 'my_table' WHERE name = 'whatever'

并且查询不起作用。有没有一种方法可以设置不带引号的字符串,因此该行如下所示:
SELECT * FROM my_table WHERE name = 'whatever'

还是我应该放弃它而使用常规语句(参数来自系统的另一部分,用户均未输入)?

最佳答案

参数不能用于参数化表或参数化任何数据库对象。它们主要用于参数化WHERE/HAVING子句。

要执行您想要的操作,您需要自己进行替换并根据需要创建一个常规语句。

当您使用准备好的语句时,这是对数据库的提示,可以对语句进行前期处理-例如解析字符串,并可能确定执行计划。如果查询中使用的对象可以动态更改,则数据库无法做很多前期准备。

08-04 16:05