无法在SQL中使用prepareStatement

时间:2015-07-11 15:38:02

标签: java sql prepared-statement

我有一种奇怪的情况,我无法使用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;
}

1 个答案:

答案 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表示。