2013-08-13 2 views
0

У меня есть база данных, в которой я сохраняю сообщения с 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()); и использовать его в названии)

+2

Почему вы не используете подготовленные заявления? – Joni

ответ

3

Вы не можете просто конкатенации java.util.Date объектов в строку запроса. Это неверно.

Лучшее использование PreparedStatement для такого рода вещей.

Взгляните на этот учебник для example

0

точно так, как сказал @Funtik PreparedStatement могут быть использованы. См. Ссылку here

это не будет точно решить вашу проблему, но вы получите четкое представление.