2013-06-05 13 views
5

Prima di refactoring, stavo inserendo una riga nel db utilizzando jdbcTemplate, preparedStatementCreator e un GeneratedKeyHolder per archiviare l'id generato della riga inserita.Non so come restituire il valore id della colonna generata utilizzando Spring jdbcTemplate e PreparedStatementSetter

jdbcTemplate.update(SomePreparedStatementCreator, generatedKeyHolder) 

Tuttavia, Ora sto cercando di eseguire un aggiornamento usando il mio jdbcTemplate ma ora con un preparedStatementSetter. L'unico metodo che posso vedere per questo noi jdbcTemplate.update (String sql, PreparedStatementSetter) ma ora non sono sicuro di come restituire l'id della colonna generata.

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); 

Assumendo il mio approccio alla PreparedStatements è corretto, qualcuno sa come posso restituire il valore della id generato?

risposta

5

Le chiavi generate possono essere restituite con il metodo JdbcTemplate#update(PreparedStatementCreator,KeyHolder). Ma per raggiungere questo obiettivo è necessario modificare la richiesta, in base a org.springframework.jdbc.core.PreparedStatementCreatorFactory.

Invece, consiglierei di utilizzare per inserire la classe di utilità SimpleJdbcInsert.

Se i campi DB sono la stessa come campi vostri entità, allora si può semplicemente fare come segue:

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

Se non è (come nel tuo caso), poi

//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 parametro è necessario definire una volta per ogni entità, e sarà simile al seguente:

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

Grazie è molto! – PolyglotPiglet

+0

@ user1724882 per favore considera di accettare questa risposta se è ciò di cui hai bisogno. – n1ckolas

Problemi correlati