2013-06-05 2 views
5

Перед рефакторингом я вставлял строку в db, используя jdbcTemplate, подготовленныйStatementCreator и GeneratedKeyHolder для хранения сгенерированного идентификатора вставленной строки.Не знаю, как вернуть порожденное значение идентификатора столбца, используя Spring jdbcTemplate и PreparedStatementSetter

jdbcTemplate.update(SomePreparedStatementCreator, generatedKeyHolder) 

Однако теперь я пытаюсь выполнить обновление с помощью моего JdbcTemplate, но теперь с preparedStatementSetter. Единственный метод, который я могу увидеть для этого jdbcTemplate.update (String sql, PreparedStatementSetter), но теперь я не уверен, как вернуть идентификатор созданного столбца.

PreparedStatementSetter pss = new PreparedStatementSetter() { 
     @Override 
     public void setValues(PreparedStatement preparedStatement) 
       throws SQLException { 
      preparedStatement.setString(1, pupil.getFirstname()); 
      preparedStatement.setString(2, pupil.getSurname()); 
      preparedStatement.setString(3, pupil.getGivenName()); 
      preparedStatement.setDate(4, pupil.getDob()); 
     } 
    };  


    jdbcTemplate.update("INSERT INTO STUDENTS "+ "(FIRSTNAME, SURNAME, GIVEN_NAME, DOB) VALUES (?,?,?,?)",pss); 

Предполагая, что мой подход к PreparedStatements правильно, кто-нибудь знает, как я могу вернуть значение генерируемого идентификатора?

ответ

5

Сгенерированные ключи могут быть возвращены с использованием метода JdbcTemplate#update(PreparedStatementCreator,KeyHolder). Но для этого вам необходимо изменить свой запрос на основе org.springframework.jdbc.core.PreparedStatementCreatorFactory.

Вместо этого я бы рекомендовал использовать для вставки SimpleJdbcInsert полезности.

Если ваши поля БД являются очень же, как поля ваших сущностей, то вы можете просто сделать следующим образом:

Number key = jdbcInsert.executeAndReturnKey(new BeanPropertySqlParameterSource(entity)); 
//set generated key 
if (key != null){ 
    entity.setId(key.longValue()); 
} 

Если это не так (как в вашем случае), то

//define parameters 
Map<String, Object> parameters = new HashMap<String, Object>(); 
parameters.put("FIRSTNAME", pupil.getFirstname()); 
parameters.put("SURNAME", pupil.getSurname()); 
parameters.put("GIVEN_NAME", pupil.getGivenName()); 
parameters.put("DOB", pupil.getDob()); 
//execute insert 
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters)); 
//set generated key 
if (key != null){ 
    pupil.setId(key.longValue()); 
} 

jdbcInsert параметр вам нужно определить один раз для каждого объекта, и он будет выглядеть следующим образом:

SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(getJdbcTemplate()); 

jdbcInsert.withTableName(entityName); //e.g. "STUDENTS" 

jdbcInsert.setGeneratedKeyName(idColumn); //e.g. "ID" 

jdbcInsert.setColumnNames(columnNames); //e.g. Arrays.asList("FIRSTNAME", "SURNAME", "GIVEN_NAME", "DOB") 
+0

Thank очень! – PolyglotPiglet

+0

@ user1724882 подумайте о принятии этого ответа, если это то, что вам нужно. – n1ckolas

Смежные вопросы