我有一种奇怪的情况,我无法使用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 :(得分: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给你的想法。主要的复杂因素是不同的类型,我在这里用enum表示。