【问题标题】:JDBC delete rows in db with specific timestampJDBC 删除 db 中具有特定时间戳的行
【发布时间】:2013-08-13 08:29:47
【问题描述】:

我有一个数据库,我在其中保存带有 tiemstamps 的消息。我用这段代码创建了表:

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);
}

这也可以正常工作 - 常量如下所示:final long ONE_HOUR_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 语句中有一个错误(第二个,带有 TRUNCATE 的那个可以正常工作)。我也尝试在语句中加入formattedDate 而不是date

它有什么问题(可能很简单——java.util.Date 和 SQL 时间戳之间的区别...)?感谢您的任何提示!

编辑:感谢所有回复...我已经重写了代码,因此它使用了这样的准备好的语句:

// 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();
        }

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

【问题讨论】:

  • 你为什么不使用准备好的语句?
  • 带有准备好的语句:而不是使用 java.util。您可以使用 java.sql.date.valueOf("2016-11-06");将此与准备好的语句一起使用。

标签: java mysql date jdbc


【解决方案1】:

您不能只将 java.util.Date 对象连接到查询字符串中。错了。

这类事情最好使用PreparedStatement

看看这个example的教程

【讨论】:

    【解决方案2】:

    正如@Funtik 所说,可以使用preparedStatement。 看这个链接here

    它不能完全解决你的问题,但你会得到一个清晰的想法。

    【讨论】:

      猜你喜欢
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多