2013-07-31 3 views
0

Использование PreparedStatement для создания запроса, который выглядит следующим образом ...JDBC с MySQL - SELECT ... IN

SELECT * FROM table1 WHERE column1 IN ('foo', 'bar') 

... не зная количество строк в операторе IN

Построив строка как ...

"'foo', 'bar'" 

... и попутно, что с ps.setString() приводит к:

"\'foo\', \'bar\'" 

Это, вероятно, хорошо, но делает этот подход к моей проблеме бесполезным.

Любые идеи о том, как пройти в неизвестном числе значений в JDBC PreparedStatement без динамического создания строки запроса тоже (этот запрос находится в файл для легкого повторного использования, и я хотел бы сохранить его таким образом) ?

+1

Вы можете использовать объект 'Array'. 'SELECT * FROM table1 WHERE column1 IN?' С 'PreparedStatement # setArray (1, anArrayObject);' –

+1

@SotiriosDelimanolis зависит от того, поддерживает ли JDBC-драйвер 'setArray'. –

+0

См. [Альтернативы предложения PreparedStatement IN] (http://stackoverflow.com/q/178479/2390083) – Beryllium

ответ

1

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

public String addDynamicParameters(String query, List<Object> parameters) { 
    StringBuilder queryBuilder = new StringBuilder(query); 
    queryBuilder.append("?"); 
    for (int i = 1; i < parameters.size(); i++) { 
     queryBuilder.append(", ?"); 
    } 
    queryBuilder.append(") "); 
    return queryBuilder.toString(); 
} 

public void addParameters(PreparedStatement pstmt, List<Object> parameters) { 
    int i = 1; 
    for(Object param : parameters) { 
     pstmt.setObject(i++, param); 
    } 
} 

public void testDynamicParameters() { 
    String query = "SELECT col3 FROM tableX WHERE col1 = ? AND col2 IN ("; 
    List<Object> parametersForIn = ...; 
    query = addDynamicParameters(query, parametersForIn); 
    List<Object> parameters = ...; 
    PreparedStatement pstmt = ...; //using your Connection object... 
    parameters.addAll(parametersForIn); 
    addParameters(pstmt, parameters); 
    //execute prepared statement... 
    //clean resources... 
}