簡體   English   中英

無法在SQL中使用prepareStatement

[英]Unable to use prepareStatement in 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;
}

我不明白問題是什么。

經歷需要循環的所有步驟,以構建將包含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();

我使用一個簡單的文本編輯器完成了此操作,因此可能存在語法問題,等等。這應該給您帶來了想法。 主要的復雜性是不同的類型,我在這里用枚舉表示了這些類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM