Метод PreparedStatement.setString() без кавычек

Я пытаюсь использовать PreparedStatement с кодом, подобным этому:

SELECT * FROM ? WHERE name = ?

Очевидно, что, когда я использую setString() для установки поля таблицы и имени, это:

SELECT * FROM 'my_table' WHERE name = 'whatever'

и запрос не работает. Есть ли способ установить строку без кавычек, чтобы строка выглядела так:

SELECT * FROM my_table WHERE name = 'whatever'

или я должен просто отказаться от него и использовать вместо него обычный Statement (аргументы приходят из другой части системы, ни один из них не вводится пользователем)?

Ответ 1

Параметры не могут использоваться для параметризации таблицы или параметризации любых объектов базы данных. Они в основном используются для параметризации предложений WHERE/HAVING.

Чтобы сделать то, что вы хотите, вам нужно будет сделать свою замену самостоятельно и при необходимости создать регулярный оператор.

Когда вы используете подготовленный оператор, это подсказка для базы данных, которая обрабатывает переднюю обработку в заявлении - например. проанализируйте строку и, возможно, определите план выполнения. Если объекты, используемые в запросе, могут динамически меняться, база данных не могла бы значительно улучшить подготовку перед началом работы.

Ответ 2

Я сомневаюсь, что ваш SQL действительно бесконечно гибкий. У вас есть только конечное число таблиц, поэтому число статических окончательных строк для выражения SQL, в котором вы нуждаетесь, также конечно.

Продолжайте использовать PreparedStatement и привяжите переменные. Это полностью стоит того, особенно полезно при устранении проблем с SQL-инъекциями.

Ответ 3

К сожалению, вы не можете параметризовать имена таблиц для подготовленных операторов. При желании вы можете построить String и выполнить его как динамический SQL.

Ответ 4

Ошибка, которую вы сделали, заключается в том, что вы не можете передать имя таблицы в качестве параметра. Вы должны передавать значения только в SQL-выражение.

Пример: Если вы хотите:

Select * from LoggedUsers where username='whatever' and privilege='whatever';

тогда вы должны создать PreparedStatement как:

Select * from LoggedUsers where username=? and privilege=?

setString(1, usernameObject);
setString(2, privilegeObject);

Цель PreparedStatement заключается в уменьшении сложности и удобочитаемости кода подключения к базе данных., когда разработчику приходится использовать так много значений столбца с экземпляром Statement, так сложно поставить точки с запятой, запятыми и плюс (оператор concat).

Я думаю, вы ошибочно хотели воспользоваться этим, что не предназначено для...