복붙노트

[SPRING] Spring jdbcTemplate과 PreparedStatementSetter를 사용하여 생성 된 컬럼 id 값을 반환하는 방법을 모르고있다.

SPRING

Spring jdbcTemplate과 PreparedStatementSetter를 사용하여 생성 된 컬럼 id 값을 반환하는 방법을 모르고있다.

리팩터링하기 전에 jdbcTemplate, preparedStatementCreator 및 GeneratedKeyHolder를 사용하여 삽입 된 행의 생성 된 ID를 저장하는 행을 db에 삽입했습니다.

    jdbcTemplate.update(SomePreparedStatementCreator, generatedKeyHolder)  

그러나 지금은 jdbcTemplate을 사용하여 업데이트를 실행하려고하지만 이제는 preparedStatementSetter를 사용하여 업데이트를 실행하려고합니다. 유일한 방법은 우리가 볼 수있는이 우리 jdbcTemplate.update (String sql, PreparedStatementSetter)하지만 지금 생성 된 열의 ID를 반환하는 방법을 잘 모르겠습니다.

    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에 대한 내 접근 방식이 맞다고 가정하면, 생성 된 ID의 값을 어떻게 반환 할 수 있는지 알 수 있습니까?

해결법

  1. ==============================

    1.생성 된 키는 JdbcTemplate # update (PreparedStatementCreator, KeyHolder) 메소드와 함께 리턴 될 수 있습니다. 하지만 이것을 달성하기 위해서는 org.springframework.jdbc.core.PreparedStatementCreatorFactory를 기반으로 요청을 변경해야합니다.

    생성 된 키는 JdbcTemplate # update (PreparedStatementCreator, KeyHolder) 메소드와 함께 리턴 될 수 있습니다. 하지만 이것을 달성하기 위해서는 org.springframework.jdbc.core.PreparedStatementCreatorFactory를 기반으로 요청을 변경해야합니다.

    대신 SimpleJdbcInsert 유틸리티 클래스를 삽입하는 데 사용하는 것이 좋습니다.

    DB 필드가 엔티티 필드와 매우 같으면 다음과 같이 간단히 수행 할 수 있습니다.

    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")
    
  2. from https://stackoverflow.com/questions/16932814/unsure-how-to-return-generated-column-id-value-using-spring-jdbctemplate-and-pre by cc-by-sa and MIT license