所以我创建了以下函数来写入数据库:
public static void updateBuyer(String ID, String name, Location latlong) {
float lat = latlong.latitude;
float lon = latlong.longitude;
try {
// new com.mysql.jdbc.Driver();
Class.forName("com.mysql.jdbc.Driver").newInstance();
// conn =
// DriverManager.getConnection("jdbc:mysql://localhost:3306/testdatabase?user=testuser&password=testpassword");
conn = DriverManager.getConnection(connectionUrl, connectionUser,
connectionPassword);
stmt = conn.createStatement();
String sql = "UPDATE Buyer " + "SET latitude ="
+ Float.toString(lat) + " WHERE idBuyer in (" + ID + ")";
String sql2 = "UPDATE Buyer " + "SET longitude ="
+ Float.toString(lon) + " WHERE idBuyer in (" + ID + ")";
String sql3 = "UPDATE Buyer " + "SET Name =" + name
+ " WHERE idBuyer in (" + ID + ")";
stmt.executeUpdate(sql);
stmt.executeUpdate(sql2);
stmt.executeUpdate(sql3);
conn.close();
} catch (Exception e) {
System.err.println(e);
}
}
假设我通过了以下参数: (12,craigs,location location) 现在,当我运行该函数时,我收到以下错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'craigs' in 'field list'
12是我之前从数据库中检索到的ID, craigs是我试图插入的随机名称,并且 location对象只是一组坐标(lat,long)
这导致我认为它出于某种原因在表中寻找一个名为“craigs”的字段,但为什么会这样做呢?
答案 0 :(得分:1)
问题是你有这样的SQL:
UDPATE Buyer SET Name = craigs WHERE idBuer in (Whatever)
那是试图从名为“craigs”的列中复制值。
现在你可以添加撇号 - 但不。而是使用参数化SQL和预准备语句。这样你就可以避免SQL injection attacks,你的代码会更简单,并且你会避免不必要的字符串转换,这可能会导致问题,尤其是日期值。
此外,您只需要一个语句,它可以更新所有三列:
String sql = "UPDATE Buyer SET Name=?, latitude=?, longitude=? WHERE idBuyer=?";
try (PreparedStatement statement = conn.prepareStatement(sql)) {
statement.setString(1, name);
statement.setFloat(2, lat);
statement.setFloat(3, lon);
statement.setString(4, ID);
statement.executeUpdate();
}
(请注意,我假设您实际上只是尝试更新单个买家 - 目前还不清楚为什么要使用IN
。还要注意我正在尝试使用资源声明,之后将自动关闭声明。)
此外,我强烈建议您尽量避免抓住Exception
。如果必须,请抓住SQLException
- 但实际上你可能会更好地让它只是在调用堆栈中传播。