我正在尝试使用
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);