在重构之前,我使用jdbcTemplate,preparedStatementCreator和GeneratedKeyHolder在数据库中插入一行来存储生成的插入行的id.
jdbcTemplate.update(SomePreparedStatementCreator, generatedKeyHolder)
Run Code Online (Sandbox Code Playgroud)
但是,现在我尝试使用我的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);
Run Code Online (Sandbox Code Playgroud)
假设我对prepareStatements的方法是正确的,有谁知道如何返回生成的id的值?
可以使用JdbcTemplate #upcate(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());
}
Run Code Online (Sandbox Code Playgroud)
如果不是(如你的情况),那么
//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());
}
Run Code Online (Sandbox Code Playgroud)
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")
Run Code Online (Sandbox Code Playgroud)