Метод 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).
Я думаю, вы ошибочно хотели воспользоваться этим, что не предназначено для...