2013-06-21 3 views
0

Ok мой код выглядит следующим образомКак получить идентификатор строки я только что вставили в Java

 String sqlString = "INSERT into auditlog(report_name, username, start_datetime, resource_uri, resource_id) VALUES (?,?,?,?,?)"; 
     preparedStatement = connection.prepareStatement(sqlString); 
     preparedStatement.setString(1, reportName); 
     preparedStatement.setString(2, username); 
     preparedStatement.setTimestamp(3, new Timestamp(System.currentTimeMillis())); 
     preparedStatement.setString(4, uri); 
     preparedStatement.setBigDecimal(5, new BigDecimal(0)); 
     preparedStatement.executeUpdate(); 

В таблице есть еще одно поле «ID», но получает автогенерируемая, как я могу получить, что ключ? Мне нужно, чтобы использовать его в качестве внешнего ключа в следующий бит моего кода

+0

ummm ... 'SELECT ID FROM YourTable'? – Doorknob

+0

@Doorknob 'SELECT MAX (ID) FROM YourTable' – Abubakkar

+2

@Abu, чтобы вы прямо игнорировали совпадение и получали любой идентификатор, который вы могли бы получить. – Alfabravo

ответ

6
ResultSet generatedKeys = preparedStatement.getGeneratedKeys(); 

if (generatedKeys.next()) { 
    Long id = generatedKeys.getLong(1); 
} 
+0

Будет ли это работать? ____ Строка сгенерированаKeys = подготовленаStatement.getGeneratedKeys(). ToString(); – Andre

+0

Нет Андре, это возвращает объект ResultSet, вам нужно получить его из 'ResultSet' – Abubakkar

+0

lol ok Hahahaha Thx man – Andre

3

Statement интерфейс определяет getGeneratedKeys() метод. Но все это зависит от драйвера вы используете. Если драйвер реализует его, вы можете получить сгенерированные идентификаторы

0

В MySQL «SELECT LAST_INSERT_ID()» должен это сделать. Убедитесь, что вы делаете это в той же транзакции, конечно.

Не «ВЫБЕРИТЕ МАКС. (ИД) ОТ ...». Это может легко работать нормально, но медленнее и медленнее по мере роста таблицы.

Кроме того, поскольку кодирование JDBC - это почти полное кодирование, напишите себе способ SqlUtils.getLastInsertId (Connection con) где-нибудь и сохраните себе некоторую типизацию!

1

Вам необходимо передать PreparedStatement.RETURN_GENERATED_KEYS вашей подготовке, а затем использовать getGeneratedKeys(), чтобы получить его;

preparedStatement = connection.prepareStatement(sqlString,  
    PreparedStatement.RETURN_GENERATED_KEYS); 

... 

int rownum = preparedStatement.executeUpdate(); 
ResultSet resultset = preparedStatement.getGeneratedKeys(); 
if(rownum != 0 && !resultset.next()) { 
     int version = resultset.getInt(1); 
}