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

2023-12-08

在重构之前,我使用 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#update(PreparedStatementCreator,KeyHolder)方法。但要实现这一目标,您需要根据以下情况更改您的请求org.springframework.jdbc.core.PreparedStatementCreatorFactory.

相反,我建议使用插入简单的Jdbc插入实用类。

如果您的数据库字段与实体的字段非常相同,那么您可以简单地执行以下操作:

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")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐