我想使用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 :(得分: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();
}