不确定如何使用Spring jdbcTemplate和PreparedStatementSetter返回生成的列id值

在重构之前,我使用jdbcTemplate,preparedStatementCreator和GeneratedKeyHolder在数据库中插入一行来存储生成的插入行的id。

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的值?

生成的密钥可以使用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()); } 

如果不是(如你的情况),那么

 //define parameters Map parameters = new HashMap(); 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); //eg "STUDENTS" jdbcInsert.setGeneratedKeyName(idColumn); //eg "ID" jdbcInsert.setColumnNames(columnNames); //eg Arrays.asList("FIRSTNAME", "SURNAME", "GIVEN_NAME", "DOB")