版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gybshen/article/details/88845193
有这样一种场景,在插入数据之后需要获取生成的数据主键,在使用Spring JDBC的JdbcTemplate的update(PreparedStatementCreator,KeyHolder)方法获取生成的主键,出现下面的异常:
java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate(), Statement.executeLargeUpdate() or Connection.prepareStatement().
出现异常的代码如下:
public int addArticle(Article article){
String sql = "insert into article(title,content,author_id,create_time,update_time) values(?,?,?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
int update = jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,article.getTitle());
ps.setString(2,article.getContent());
long time = new Date().getTime();
ps.setLong(3,article.getAuthorId());
ps.setLong(4,time);
ps.setLong(5,time);
return ps;
}
}, keyHolder);
article.setArticleId(keyHolder.getKey().longValue());
return update;
}
经过研究,发现时MySQL驱动的版本升级造成的,我用的驱动版本是8.0.15。根据异常信息提示,需要在Statement.executeUpdate(), Statement.executeLargeUpdate() 或者Connection.prepareStatement() 指定Statement.RETURN_GENERATED_KEYS参数,例如Connection.prepareStatement(),使用
prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);这个方法。