Этот вопрос уже имеет ответ здесь:
Как к установленному значению для в пункте в preparedStatement в JDBC при выполнении запроса.
Пример:
connection.prepareStatement("Select * from test where field in (?)");
Если это в пункте может содержать несколько значений, как я могу сделать это. Иногда я знаю список параметров заранее, или иногда я не знаю заранее. Как обработать этот случай?
Мне нужно добавить знак "?" для каждого возможного значения.
Например:
List possibleValues = ...
StringBuilder builder = new StringBuilder();
for( int i = 0 ; i < possibleValue.size(); i++ ) {
builder.append("?,");
}
String stmt = "select * from test where field in ("
+ builder.deleteCharAt( builder.length() -1 ).toString() + ")";
PreparedStatement pstmt = ...
И затем успешно установите параметры
int index = 1;
for( Object o : possibleValue ) {
pstmt.setObject( index++, o ); // or whatever it applies
}
Что вы можете сделать, так это динамически построить строку select (часть 'IN (?)') с помощью простого цикла for, как только вы узнаете, сколько значений вам нужно поместить в предложение IN. Затем вы можете инстанцировать PreparedStatement.
Вы не можете заменить ?
в запросе произвольным количеством значений. Каждый ?
является заполнителем только для одного значения. Для поддержки произвольного числа значений вам придется динамически строить строку, содержащую ?, ?, ?, ... , ?
с количеством вопросительных знаков, равным количеству значений, которые вы хотите получить в предложении in
.
Вы можете проверить эту ссылку:
http: //www.javaranch .com / journal / 200510 / Journal200510.jsp # a2
В нем объясняются плюсы и минусы различных методов создания PreparedStatement
с в пункте
.
РЕДАКТИРОВАТЬ:
Очевидным подходом является динамическое создание символа '?' часть во время выполнения, но я не хочу просто предлагать именно этот подход, потому что в зависимости от того, как вы его используете, он может быть неэффективным (поскольку PreparedStatement
нужно будет «компилировать» каждый раз, когда он получает используется)