2013-05-18 3 views
0

arraylist 값을 사용하여 데이터베이스를 쿼리하고 싶습니다. 존재하는 경우 내 arraylist 요소 중 하나와 동일한 값을 데이터베이스에서 반환해야합니다. 나는 이런 식으로 뭔가를 시도하고 있지만, 이것은 in 키워드를 사용하여 해결할 수 있습니다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를 참조하십시오. 귀하의 경우에는 "select * from table에서 ('소년', '소녀')의 키워드; –

답변

0

당신은 이런 식으로 뭔가를 시도 할 수 : 대신 쿼리에서이 csvStr를 사용

,369을
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

작동하지 않습니다.

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

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

query += ")"; 

당신은 아마 SQL 주입 공격에 저장하도록하기 위해 목록의 항목을 탈출해야

SQL 주입. -

+1

SQL 인젝션 공격으로부터 보호하려면 목록 항목을 이스케이프 처리해야합니다. –

0

먼저 작성한 검색어가 올바르지 않습니다. 당신은 IN 절 를 사용한다, 무언가 같이 :

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); 

: 당신이 뭔가를 할 수

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

더 쉼표로 구분 된 값으로 목록을 변환되어 필요한 유일한 것은,

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

PreparedStatement을 사용하면 SQL의 모든 이스케이프 및 보안 문제를 피할 수 있습니다.

이렇게하려면 물음표가있는 문자열을 자리 표시 자로 작성한 다음 문자열 대신 PreparedStatement에 매개 변수를 추가하십시오. getIn가 PreparedStatement 적합 물음표와 IN 일부를 반환하는 함수이다

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(); 

...;

static String getIn(int numParams) { 
    StringBuilder builder = new StringBuilder("IN (?"); 
    for(int i=1; i<numParams; i++) 
     builder.append(",?"); 
    builder.append(")"); 
    return builder.toString(); 
} 
관련 문제