[英]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.