Не знаете, как вернуть сгенерированное значение идентификатора столбца, используя Spring jdbcTemplate и PreparedStatementSetter

Перед рефакторингом я вставлял строку в базу данных, используя jdbcTemplate, prepareStatementCreator и GeneratedKeyHolder для хранения сгенерированного идентификатора вставленной строки.

    jdbcTemplate.update(SomePreparedStatementCreator, generatedKeyHolder)  

Тем не менее, теперь я пытаюсь выполнить обновление, используя мой jdbcTemplate, но теперь с готовым состояниемSetter. Единственный способ, который я вижу для этого, - это 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);

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

Ответы на вопрос(1)

JdbcTemplate # обновление (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());
}
</string,></string,>

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")
 n1ckolas14 мая 2014 г., 16:33
@ user1724882, пожалуйста, примите этот ответ, если он вам нужен.

Ваш ответ на вопрос