Java JDBC删除数据库中具有特定时间戳的行

Java JDBC删除数据库中具有特定时间戳的行,java,mysql,date,jdbc,Java,Mysql,Date,Jdbc,我有一个数据库,在其中我用tiemstamp保存消息。我已使用以下代码创建了表: CREATE TABLE messages ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, msgid VARCHAR(64) UNIQUE, payload TEXT, sender VARCHAR(255), cur_timestamp TIMESTAMP(3) ); 这一切都很完美。但是,现在我尝试删除一些时间戳比用户指定的

我有一个数据库,在其中我用tiemstamp保存消息。我已使用以下代码创建了表:

CREATE TABLE messages (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    msgid VARCHAR(64) UNIQUE,
    payload TEXT,
    sender VARCHAR(255),
    cur_timestamp TIMESTAMP(3)
);
这一切都很完美。但是,现在我尝试删除一些时间戳比用户指定的时间戳早的行。这是在我的系统的Java部分完成的,如下所示:

// get current timestamp
Date date = new Date();
// timestamp has to be in the same format as in database
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd h:mm:ss.SSS");
String formattedDate = sdf.format(date);
System.out.println("Current time: " + formattedDate);

// subtract desired time
if (msgOld.equals("hour")) {
  date.setTime(date.getTime() - ONE_HOUR_MILLISCONDS);
  formattedDate = sdf.format(date);
} else if (msgOld.equals("day")) {
  date.setTime(date.getTime() - ONE_DAY_MILLISCONDS);
  formattedDate = sdf.format(date);
}
// prepare query
        String query;
        PreparedStatement pstmt = null;

        try {
            if (msgOld.equals("all")) {
                query = "TRUNCATE TABLE messages";
                pstmt=conn.prepareStatement(query);
            } else {
            query = "DELETE FROM messages WHERE cur_timestamp < ?;";
            pstmt = conn.prepareStatement(query);
            pstmt.setString(1, timestamp.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            pstmt.execute();

            System.out.println("Successfully deleted messages.");
            pstmt.close();

        } catch (Exception e) {
            System.out.println("Error with db query.");
            e.printStackTrace();
        }
这也很好——常数如下:
final long ONE_HOUR\u MILLISCONDS=60*60*1000

唯一的问题是我不知道如何用JDBC编写查询。我试着这样做:

// prepare query
String query;
if (msgOld.equals("all")) {
    query = "TRUNCATE TABLE messages";
} else {
    query = "DELETE FROM messages WHERE cur_timestamp < " + date + ";";
}

但我仍然会遇到SQL异常(即使我将日期转换为时间戳,并且像这样
timestamp timestamp=new timestamp(date.getTime());
并在语句中使用它)

您不能将
java.util.date
对象连接到查询字符串中。那是错误的

对于这类事情,最好使用
PreparedStatement


查看本教程,了解如何将
java.util.Date
对象连接到查询字符串中。那是错误的

对于这类事情,最好使用
PreparedStatement


请看一下本教程,了解如何使用@Funtik所说的preparedStatement。 请参阅此链接


这并不能完全解决你的问题,但你会有一个清晰的想法。

正如@Funtik所说,可以使用preparedStatement。 请参阅此链接


这并不能完全解决您的问题,但您会有一个清晰的想法。

为什么不使用prepared语句?使用prepared语句:而不是使用java.util。您可以使用java.sql.date.valueOf(“2016-11-06”);在prepared语句中使用它。为什么不使用prepared语句呢?在prepared语句中:而不是使用java.util。您可以使用java.sql.date.valueOf(“2016-11-06”);在准备好的语句中使用此选项。