Hola, para aquellos que quereis currar sin SEQUENCES, porque pueden provocar excepciones de PK duplicada si no se hace bien, Spring te recomienda esto en su documentación de referencia 13.2.7 Retrieving auto-generated keys.
Por otro lado, yo siempre he trabajado con el objeto jdbcTemplate llamando a la funcion update(String sql, Object… params) de esta manera creo un ArrayList de objetos y, junto a la query, le paso los parametros sin preocuparme de qué tipo son cada uno.
Para poder mezclar ambos casos existe el objeto ArgumentPreparedStatementSetter así, en vez de hacer para cada parámetro algo como esto ps.setString(1, name); podemos usar su funcion setter.setValues(ps);
Os dejo un pequeño ejemplo:
StringBuffer sbQuery = new StringBuffer("INSER INTO user (username, password, name) VALUES ");
sbQuery.append(" (?, ?, ?) ");
List<Object> vParams = new ArrayList<Object>();
vParams.add(user.getUsername());
vParams.add(user.getPassword());
vParams.add(user.getName());
final String query = sbQuery.toString();
final ArgumentPreparedStatementSetter setter = new ArgumentPreparedStatementSetter(vParams.toArray());
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(query, new String[] {"id"});
setter.setValues(ps);
return ps;
}
}, keyHolder);
user.setId((Long) keyHolder.getKey());
Un saludo!!