2017-06-05 47 views
0

我試圖在由兩個IN子句組成的SELECT QUERY中傳遞多個值。我想執行以下查詢:傳遞多個值以在java中動態查詢

String sql = "select ADDRESS from CDR where APARTY in(?,?,?) intersect select ADDRESS from CDR where BPARTY in (?,?) and USAGETYPE='SMSMT'"; 

如何可以提前使用preparedStatement.setString() .Thanks我傳遞的價值。

回答

0

這裏是你如何做到這一點:

PreparedStatement pstmt = yourconnexiontoDB.prepareStatement(sql); 
pstmt.setString(1, "your first string"); 
pstmt.setString(2, "your second string"); 

等等的價值觀的其餘部分。

1

要構建查詢,你可以使用例如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 
} 
+0

因爲它可以防止SQL注入非常好的解決方案。它確實依賴'PreparedStatement.setString()'爲'IN'子句中添加的每個字符串值。作爲一個邊節點,我認爲你使用的'i'和'j'的迭代有點複雜,可能更簡單。就個人而言,我會使用一個'int'和一個'enhanced for'來遍歷每個列表。 – davidxxx

+0

謝謝@davidxxx我很欣賞它,我已經做到了,你的建議是什麼意思? –

+1

不客氣:)現在真的很清楚。 – davidxxx