Вставьте с помощью PreparedStatement. Как автоматически увеличивать идентификатор?

У меня есть PreparedStatement, например:

 PreparedStatement preparedStatement = connect.prepareStatement("INSERT into employee (id, time, name" + "(?,?,?)",Statement.RETURN_GENERATED_KEYS);
 ResultSet tableKeys = preparedStatement.getGeneratedKeys();
 preparedStatement.executeUpdate();
 tableKeys.next();
 int autoGeneratedID = tableKeys.getInt(1);
 preparedStatement.setInt(1,autoGeneratedID);
 preparedStatement.setTimestamp(2, new java.sql.Timestamp(new java.util.Date().getTime()));                           
 preparedStatement.setString(3, "Test");
 preparedStatement.executeUpdate();

Как вы можете видеть, таблица Employee имеет идентификатор с автоматическим увеличением. Мне нужно в принципе добавить его автоматически, используя prepareStatement. Может ли кто-нибудь сказать мне, где я ошибаюсь, и исправить меня? Прямо сейчас это просто дает мне ошибку, связанную с Statement.

Ответы

Ответ 1

Оставьте столбцы из инструкции INSERT целиком. Он будет сгенерирован движком базы данных. Ваш запрос должен быть:

INSERT INTO employee (time, name)
VALUES (?, ?)

Во-вторых, вам нужно сначала выполнить вставку, а затем получить ключи из результата.

Я считаю, что ваш код должен быть:

PreparedStatement preparedStatement = 
    connect.prepareStatement("INSERT into employee (time, name) VALUES (?,?)", 
    Statement.RETURN_GENERATED_KEYS);

preparedStatement.setTimestamp(1, 
    new java.sql.Timestamp(new java.util.Date().getTime()));                           
preparedStatement.setString(2, "Test");

preparedStatement.executeUpdate();

ResultSet tableKeys = preparedStatement.getGeneratedKeys();
tableKeys.next();
int autoGeneratedID = tableKeys.getInt(1);

Обратите внимание, что этот пример не проверяет успех выполненного оператора или существование возвращенных ключей.