Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

identity from sql insert via jdbctemplate

Is it possible to get the @@identity from the SQL insert on a Spring jdbc template call? If so, how?

like image 731
javamonkey79 Avatar asked Nov 03 '09 07:11

javamonkey79


3 Answers

The JDBCTemplate.update method is overloaded to take an object called a GeneratedKeyHolder which you can use to retrieve the autogenerated key. For example (code taken from here):

final String INSERT_SQL = "insert into my_test (name) values(?)";
final String name = "Rob";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
    new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
            PreparedStatement ps =
                connection.prepareStatement(INSERT_SQL, new String[] {"id"});
            ps.setString(1, name);
            return ps;
        }
    },
    keyHolder);
// keyHolder.getKey() now contains the generated key
like image 175
Jason Gritman Avatar answered Oct 18 '22 07:10

Jason Gritman


How about SimpleJdbcInsert.executeAndReturnKey? It takes two forms, depending on the input:

(1) The input is a Map

public java.lang.Number executeAndReturnKey(java.util.Map<java.lang.String,?> args)

Description copied from interface: SimpleJdbcInsertOperations

Execute the insert using the values passed in and return the generated key. This requires that the name of the columns with auto generated keys have been specified. This method will always return a KeyHolder but the caller must verify that it actually contains the generated keys.

Specified by:

executeAndReturnKey in interface SimpleJdbcInsertOperations

Parameters:

args - Map containing column names and corresponding value

Returns:

the generated key value

(2) The input is a SqlParameterSource

public java.lang.Number executeAndReturnKey(SqlParameterSourceparameterSource)

Description copied from interface: SimpleJdbcInsertOperations

Execute the insert using the values passed in and return the generated key. This requires that the name of the columns with auto generated keys have been specified. This method will always return a KeyHolder but the caller must verify that it actually contains the generated keys.

Specified by:

executeAndReturnKey in interface SimpleJdbcInsertOperations

Parameters:

parameterSource - SqlParameterSource containing values to use for insert

Returns:

the generated key value.

like image 52
todd.pierzina Avatar answered Oct 18 '22 07:10

todd.pierzina


Adding detailed notes/sample code to todd.pierzina answer

jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
                "Primary_key");
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("Column_NAME1", bean.getval1());
        parameters.put("Column_NAME2", bean.getval2());
        // execute insert
        Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(
                parameters));
           // convert Number to Int using ((Number) key).intValue()
            return ((Number) key).intValue();
like image 28
Sheetal Mohan Sharma Avatar answered Oct 18 '22 09:10

Sheetal Mohan Sharma