MySQL 报错java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GE

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);这个方法。

猜你喜欢

转载自blog.csdn.net/gybshen/article/details/88845193
今日推荐