У меня есть база данных, в которой я сохраняю сообщения с tiemstamps. У меня есть таблица, созданная с помощью этого кода:JDBC удаляет строки в db с определенной меткой времени
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 ...)? Спасибо за любые советы!
EDIT: Спасибо за все ответы ... Я переписал код, чтобы он использует подготовленное заявление, как это:
// 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());
и использовать его в названии)
Почему вы не используете подготовленные заявления? – Joni