2013-05-18 2 views
0

Я хочу запросить базу данных, используя значение arraylist. Он должен вернуть значение из базы данных так же, как и один из моих элементов arraylist, если он существует. Я пытаюсь что-то вроде этого, но он не работаетзапрос базы данных с помощью arraylist

ArrayList<String> list = new ArrayList<String>(); 
list.add("boy"); 
list.add("girl"); 
Class.forName("com.mysql.jdbc.Driver"); 
Connection con = DriverManager.getConnection("url", "root", ""); 
Statement st = con.createStatement(); 
ResultSet rs = st.executeQuery("Select * from table where keyword= (list)"); 
+0

Для нескольких значений в предложении where см .: http://www.w3schools.com/sql/sql_in.asp. В вашем случае «выберите * из таблицы, в которой есть ключевое слово (« мальчик »,« девушка »); –

ответ

0

Вы могли бы попробовать что-то вроде этого:

ArrayList<String> list = new ArrayList<String>(); 
    list.add("boy"); 
    list.add("girl"); 
    Class.forName("com.mysql.jdbc.Driver"); 
    Connection con = DriverManager.getConnection("url", "root", ""); 
    Statement st = con.createStatement(); 
    StringBuilder sb = new StringBuilder("Select * from table where keyword IN ("); 
    boolean added = false; 
    for(String s:list){ 
    if (added){ 
     sb.append(","); 
    }  
    sb.append("'"); 
    sb.append(s); 
    sb.append("'"); 
    added = true; 
    } 
    sb.append(")"); 
    ResultSet rs = st.executeQuery(sb.toString()); 
0

Эту проблему можно решить, используя ключевое слово in.

String query = "SELECT * FROM table WHERE keyword in ("; 

for(String s : list) 
{ 
    query += "'" + list + "',"; 
} 

query += ")"; 

SQL Injection

Вы должны, вероятно, избежать записи из списка для того, чтобы быть сохранить от атак SQL-инъекции. -

+1

Вероятно, вам следует избегать записи списка, чтобы быть спасенным от атак SQL-инъекций. –

0

Прежде всего, запрос, который вы формируете, неверен. Вы должны использовать В статье, что-то вроде:

ResultSet rs = st.executeQuery("Select * from table where keyword IN (*comma-separated-value-from-list*)"); 

Единственное, что более требуется, это преобразование списка в разделенных запятыми значений, вы можете сделать что-то вроде:

String[] val = list.toArray(new String[list.size()]); 
StringBuilder csvStr = new StringBuilder(); 
for(int i=0;i<val.length;i++){ 
    if (val.length > 1 && i !=0) { 
     csvStr.append(","); 
    } 
    csvStr.append ("'").append(val[i]).append("'"); 
} 
System.out.println(csvStr); 

И использовать этот csvStr в запросе вместо:

ResultSet rs = st.executeQuery("Select * from table where keyword IN ("+csvStr.toString()+")"); 
0

Вы можете использовать PreparedStatement, чтобы избежать всех проблем SQL и проблем с безопасностью.

Для этого вы создаете строку с вопросительными знаками в качестве заполнителя, а затем добавляете параметры к PreparedStatement вместо строки;

String statement = "SELECT * FROM table WHERE keyword " + getIn(list.size()); 
PreparedStatement preparedStatement = con.prepareStatement(statement); 
for(int i=0; i<list.size(); i++) 
    preparedStatement.setString(i+1, list.get(i)); 
ResultSet result = preparedStatement.executeQuery(); 

... где GetIn функция возврата IN часть с вопросительными знаками, который подходит для PreparedStatement;

static String getIn(int numParams) { 
    StringBuilder builder = new StringBuilder("IN (?"); 
    for(int i=1; i<numParams; i++) 
     builder.append(",?"); 
    builder.append(")"); 
    return builder.toString(); 
} 
Смежные вопросы