使用arraylist查询数据库

时间:2013-05-18 10:57:51

标签: java database jdbc

我想使用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)");

4 个答案:

答案 0 :(得分:0)

这可以使用in关键字来解决。

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

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

query += ")";

SQL注入

您可能应该转义列表条目以防止SQL注入攻击。 -

答案 1 :(得分:0)

首先,您正在形成的查询不正确。您应该使用 IN 子句,例如:

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

答案 2 :(得分: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()); 

答案 3 :(得分: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();
}