2010-07-10 2 views
2

Это кажется простым, но это невозможно искать в Интернете ...Как использовать MySQL IN функции сравнения с JDBC

У меня есть унаследованное приложение, которое использует JDBC непосредственно без каких-либо рамок, и у меня добавить некоторые новые функции. У меня возникают проблемы с поиском, как использовать функцию IN() через JDBC.

Я хотел бы иметь запрос как следующий

SELECT * from animals WHERE animal_name IN (...) 

Где ... это массив значений. Используя JDBC, я подумал бы, что сделаю следующее.

PreparedStatement st = conn.prepareStatement("SELECT * from animals WHERE animal_name IN (?);"); 
st.setArray(arrayVals); 
ResultSet rs = st.executeQuery(); 
.... 

Но это не сработает, и я обнаружил, что почти невозможно найти ссылку на это в Интернете.

+0

Это потому, что параметры PreparedStatement представляют собой одно значение на основе типа данных, а не список полей с разделителями-запятыми. Создайте SQL-запрос как строку перед 'conn.prepareStatement (...', если вы хотите использовать динамический SQL вне базы данных. –

+0

Просто наблюдение, но вы уверены, что вам нужна точка с запятой в конце инструкции? –

+0

Возможный дубликат [Какой лучший подход использует JDBC для параметризации предложения IN?] (Http://stackoverflow.com/questions/2861230/what-is-the-best-approach-using-jdbc-for-parameterizing- an-in-clause) – BalusC

ответ

1

Заменить код что-то вроде:

StringBuilder sb = new StringBuilder("SELECT * from animals WHERE animal_name IN ("); 
// 1. assemble query parameters 
for (int i = 0; i < arrayVals.size(); i++) { 
    sb.append("?"); 
    if (i + 1 < arrayVals.size()) sb.append(","); 
} 
sb.append(")"); 
// 2. add the variables 
PreparedStatement st = conn.prepareStatement(sb.toString()); 
for (int i = 0; i < arrayVals.size(); i++) { 
    // May need to replace setter depending on type of object 
    st.setObject(i + 1, o); 
} 

В качестве альтернативы, с помощью пружинных JDBCs JdbcTemplate вы бы заменить часть 2 с этим:

jdbcTemplate.query(sb.toString(), arrayVals.toArray(), animalRowMapper); 

JdbcTemplate будет определять SQL типов, необходимых для каждого параметр.

Смежные вопросы