要構建查詢,你可以使用例如StringBuilder
例如:
考慮你有兩個名單如下:
List<String> values1 = new ArrayList<>();
values1.add("val1_1");
values1.add("val1_2");
values1.add("val1_3");
List<String> values2 = new ArrayList<>();
values2.add("val2_1");
values2.add("val2_2");
現在,我們將構建查詢:
StringBuilder sql = new StringBuilder("select ADDRESS from CDR where APARTY IN(");
for (int i = 0; i < values1.size(); i++) {
sql.append(i == values1.size() - 1 ? "?" : "?,");
}
sql.append(") intersect select ADDRESS from CDR where BPARTY IN (");
for (int i = 0; i < values2.size(); i++) {
sql.append(i == values2.size() - 1 ? "?" : "?,");
}
sql.append(") and USAGETYPE='SMSMT'");
System.out.println(sql);
直到現在,這可以給你:
select ADDRESS from CDR where APARTY IN(?,?,?) intersect select ADDRESS from CDR where BPARTY IN (?,?) and USAGETYPE='SMSMT'
現在,你必須使用此查詢中的PreparedStatement:
try (PreparedStatement pstm = connection.prepareStatement(sql)) {
int i = 1;
for (String s : values1) {
pstm.setString(i++, s);
}
for (String s : values2) {
pstm.setString(i++, s);
}
//...execute the statement and retrieve the results
}
因爲它可以防止SQL注入非常好的解決方案。它確實依賴'PreparedStatement.setString()'爲'IN'子句中添加的每個字符串值。作爲一個邊節點,我認爲你使用的'i'和'j'的迭代有點複雜,可能更簡單。就個人而言,我會使用一個'int'和一個'enhanced for'來遍歷每個列表。 – davidxxx
謝謝@davidxxx我很欣賞它,我已經做到了,你的建議是什麼意思? –
不客氣:)現在真的很清楚。 – davidxxx