PreparedStatement.setString()方法没有引号

Sla*_*vko 11 java sql jdbc prepared-statement

我正在尝试使用类似于此的代码的PreparedStatement:

SELECT * FROM ? WHERE name = ?
Run Code Online (Sandbox Code Playgroud)

显然,当我使用setString()设置表和名称字段时会发生什么:

SELECT * FROM 'my_table' WHERE name = 'whatever'
Run Code Online (Sandbox Code Playgroud)

并且查询不起作用.有没有办法设置没有引号的字符串,所以行看起来像这样:

SELECT * FROM my_table WHERE name = 'whatever'
Run Code Online (Sandbox Code Playgroud)

或者我应该放弃它并使用常规语句(参数来自系统的另一部分,这些都不是由用户输入的)?

mdm*_*dma 17

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

要做你想做的事,你需要自己做替换并根据需要创建一个常规语句.

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

  • 您仍然可以使用PreparedStatement,只是不要尝试参数化表名 - 参数化'whoever'.关于准备与常规陈述的使用存在一些争论,但我认为,除非你发现没有充分理由,否则使用准备好的陈述. (2认同)

Zug*_*alt 5

不幸的是,您无法参数化准备好的语句的表名称。如果需要,您可以构造一个字符串并将其作为动态 SQL 执行。