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

5
在重构之前,我使用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值吗?
1个回答

6
生成的键可以使用JdbcTemplate#update(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<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")

如果这个答案符合您的需求,请考虑接受它,@user1724882。 - n1ckolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接