2015-07-11 17 views
1

我有一個特殊的情況,我無法使用prepareStatement無法使用SQL中的prepareStatement

我正在寫一個更新函數在Java中,我需要更新一組行的字段。我的問題是我不知道有多少字段需要更新。我從JSONArray動態確定這個。在這種情況下,我可以如何使用prepareStatement來制定SQL查詢。至於prepareStatement該查詢是預定義的,並且假設稍後添加值。我的非功能性的示例代碼是在這裏:

DB:使用MySQL MySQL驅動jar文件

public static int updateUser(String user) throws SQLException, JSONException{ 
    JSONObject jobj= new JSONObject(user) ; 

    String pQuery= " UPDATE Presence SET "+(jobj.has("lat")?" lat =?,":",")+(jobj.has("lng")?" lng = ?,":",")+(jobj.has("description")? "description = ?,":",")+(jobj.has("gcm_id")?" gcm_id = ?,":",")+" WHERE id = ?"; 
    pst = con.prepareStatement(pQuery); 
    pst.setDouble(1, jobj.getDouble("lat")); 
    pst.setDouble(2, jobj.getDouble("lng")); 
    pst.setString(3, jobj.getJSONObject("description").toString()); 
    pst.setString(4, jobj.get("id").toString()); 
    if(jobj.has("gcm_id")) 

    pst.setString(5, jobj.getString("gcm_id")); 
    int rs = pst.executeUpdate(); 
    return rs; 
} 
+0

這是什麼樣的dbms,即'con'有什麼類型?請添加您正在使用的庫/ API。 – runDOSrun

+0

編輯並添加了信息 –

回答

2

我不明白是什麼問題。

通過您需要的任何循環來構建將保存您的SQL語句的字符串中的字段名稱,另一個循環爲其提供您需要的問號數量,然後再填充這些值作爲第三個值你會爲任何其他準備好的聲明。對準備好的語句使用字符串文字沒有任何魔力。

-

請求的代碼:

private enum DataType { DOUBLE, STRING }; 

String names[] = { "lat", "lng", "description", "gcm_id" }; 
DataType types[] = { DOUBLE, DOUBLE, STRING, STRING }; 
// you could replace these parallel arrays with an array 
// of objects, one per field, with name, type, and whatever else. 

StringBuilder setString = new StringBuilder(" UPDATE Presence SET "); 
boolean  firstNameAdded = false; 

for (String name : names) 
{ 
    if (jobj.has(name)) 
    { 
    if (!firstNameAdded) { setString.append(","); } 
    firstNameAdded = true; 
    setString.append(String.format(" %s=?", name)); 
    } 
} 

setString.append(" where id = ?"); 

// if firstNameAdded is still false at this point, you didn't 
// have anything in the json object to add 

psmt = con.prepareStatement(setString.toString()); 
int i = 0; 

while (i<names.length) 
{ 
    if (jobj.has(name)) 
    { 
    switch (types[i]) 
    { 
     case DOUBLE: psmt.setDouble(i+1, jobj.getDouble(names[i])) 
     break; 
     case STRING: psmt.setString(i+1, jobj.getJSONObject(names[i]).toString(); 
     break; 
    } 
    } 
    i++; 
} 


psmt.setString(i+1, jobj.getString("gcm_id").toString(); 

int sqlResult = psmt.executeUpdate(); 

我這樣做一個簡單的文本編輯器,所以可能有語法的東西等,這shoudl給你的想法。主要的複雜性是不同的類型,我在這裏用枚舉來表示。

+0

問題是我不知道哪些字段在那裏。你能爲你的答案寫一個示例代碼嗎?謝謝。 –

+0

感謝@arcy示例。我會盡力實施並告訴你 –

相關問題