java – 插入行并获取生成的ID

前端之家收集整理的这篇文章主要介绍了java – 插入行并获取生成的ID前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用 Spring的JdbcTemplate类将一行插入名为transaction的 MySQL表中并获取生成的ID.相关代码是:
public Transaction insertTransaction(final Transaction tran) {

    // Will hold the ID of the row created by the insert
    KeyHolder keyHolder = new GeneratedKeyHolder();

    getJdbcTemplate().update(new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(Connection connection) throws sqlException {

            PreparedStatement ps = connection.prepareStatement(INSERT_TRAN_sql);
            ps.setString(1,tran.getTransactionType().toString());

            Date sqlDate = new Date(tran.getDate().getTime());
            ps.setDate(2,sqlDate);
            ps.setString(3,tran.getDescription());

            return ps;
        }
    },keyHolder);

    tran.setId(keyHolder.getKey().longValue());
    return tran;
}

但是调用getJdbcTemplate().update会抛出以下异常

java.sql.sqlException: Generated keys not requested.
You need to specify Statement.RETURN_GENERATED_KEYS to
Statement.executeUpdate() or Connection.prepareStatement().

我可以插入行并获取生成的ID,而不放弃JdbcTemplate吗?我使用的是Spring 2.5,MysqL 5.5.27和MysqL Connector 5.1.26.

解决方法

请准备好您的声明,如下所示
PreparedStatement ps = connection.prepareStatement(
                           INSERT_TRAN_sql,Statement.RETURN_GENERATED_KEYS);

底层JDBC驱动程序(在这里间接通过Spring的JdbcTemplate使用)需要提示您要检索生成的密钥.这可以在准备PreparedStatement时完成

connection.prepareStatement(strsql,Statement.RETURN_GENERATED_KEYS);

或者,在执行声明时

statement.executeUpdate(strsql,Statement.RETURN_GENERATED_KEYS);

这也是java.sql.sqlException指向的内容.

猜你在找的Java相关文章