Ошибка с простым параметризованным запросом - Java / SQL - PullRequest
4 голосов
/ 30 марта 2011

Исходя из одного из моих предыдущих вопросов, связанных с конструированием метода , мне посоветовали реализовать мои SQL-запросы в виде параметризованного запроса, а не в виде простой строки.

Раньше я никогда не использовал параметризованные запросы, поэтому решил начать с чего-то простого, возьмите следующий оператор Select :

String select = "SELECT * FROM ? ";

PreparedStatement ps = connection.prepareStatement(select);
ps.setString(1, "person");

Это дает мне следующую ошибку: "[SQLITE_ERROR] Ошибка SQL или отсутствует база данных (рядом с"? ": Синтаксическая ошибка)"

Затем я попробовал модифицированную версию, которая имеет дополнительные критерии;

String select = "SELECT id FROM person WHERE name = ? ";

PreparedStatement ps = connection.prepareStatement(select);
ps.setString(1, "Yui");

Эта версия работает нормально, в моем первом примере мне не хватает точки параметризованных запросов или я их неправильно строю?

Спасибо!

Ответы [ 3 ]

9 голосов
/ 30 марта 2011

Проще говоря, SQL-привязки не могут связывать таблицы, только там, где значения предложения. Для этого есть некоторые технические причины, связанные с «компиляцией» подготовленных операторов SQL. В общем, параметризованные запросы были разработаны, чтобы сделать SQL более безопасным за счет предотвращения внедрения SQL, и у него было дополнительное преимущество, заключающееся в том, что запросы также стали более «модульными», но не в той степени, что позволяли динамически устанавливать имя таблицы (поскольку предполагается, что вы уже знаю, что будет за столом).

2 голосов
/ 30 марта 2011

Если вы хотите, чтобы все строки из таблицы PERSON, вот что вы должны сделать:

String select = "SELECT * FROM person";

PreparedStatement ps = connection.prepareStatement(select);

Привязка переменных не привязывает имена таблиц динамически, как другие, упомянутые выше. Если у вас есть имя таблицы, входящей в ваш метод как переменная, вы можете построить весь запрос следующим образом:

String select = "SELECT * FROM " + varTableName;
PreparedStatement ps = connection.prepareStatement(select);

Параметризованные запросы предназначены для запроса имен полей, а не имен таблиц!

1 голос
/ 30 марта 2011

Подготовленные операторы все еще являются SQL и должны быть составлены с соответствующим предложением where; то есть где х = у. Одним из их преимуществ является то, что они анализируются СУБД при первом обращении, а не при каждой их отправке, что ускоряет последующее выполнение одного и того же запроса с разными значениями связывания.

...