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

Posted

技术标签:

【中文标题】不确定如何使用 Spring jdbcTemplate 和 PreparedStatementSetter 返回生成的列 ID 值【英文标题】:Unsure how to return generated column id value using Spring jdbcTemplate and PreparedStatementSetter 【发布时间】:2013-06-05 06:16:46 【问题描述】:

在重构之前,我使用 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】:

生成的密钥可以通过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 如果您需要,请考虑接受此答案。

以上是关于不确定如何使用 Spring jdbcTemplate 和 PreparedStatementSetter 返回生成的列 ID 值的主要内容,如果未能解决你的问题,请参考以下文章

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

#私藏项目实操分享#专为初学者打造—Spring框架学习笔记

如何确定组件是不是与当前版本的 Spring 兼容

如何确定使用 Spring Security 访问 URL 需要哪些角色?

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]