0

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

4 回答 4

1

你可以尝试这样的事情:

  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()); 
于 2013-05-18T11:11:48.733 回答
0
于 2013-05-18T11:07:59.333 回答
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()+")");
于 2013-05-18T11:08:43.613 回答
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带有问号的部分,适用于 a 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();
}
于 2013-05-18T12:31:33.880 回答