I'm trying to use Spring's JdbcTemplate
class to insert a row into a MySQL table named transaction
and get the generated ID. The relevant code is:
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;
}
But the following exception is thrown by the call to getJdbcTemplate().update
java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().
Can I insert the row and get the generated ID, without abandoning JdbcTemplate
? I'm using Spring 2.5, MySQL 5.5.27 and MySQL Connector 5.1.26.
There is an easier way to get that behaviour:
Then you create a Map called parameters which conmtains the values for each column name in your table and insert a record like this:
Just prepare your
Statement
as followsThe underlying JDBC driver (used indirectly through the Spring's
JdbcTemplate
here) requires a hint that you would like to retrieve the generated keys. This can be done either while preparing aPreparedStatement
asor, at the time of executing a
Statement
asThis is what your
java.sql.SQLException
is pointing at as well.You can retrieve the next sequence number like in step 1, then it can passed in the insert statement as in the step 2:
1-
2-