web-dev-qa-db-fra.com

identité depuis sql insert via jdbctemplate

Est-il possible d'obtenir l'identité @@ à partir de l'insertion SQL lors d'un appel de modèle Spring jdbc? Si c'est le cas, comment?

54
javamonkey79

Le JDBCTemplate.update est surchargée pour prendre un objet appelé GeneratedKeyHolder que vous pouvez utiliser pour récupérer la clé générée automatiquement. Par exemple (code tiré de ici ):

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
89
Jason Gritman

Que diriez-vous de SimpleJdbcInsert.executeAndReturnKey? Cela prend deux formes, selon l'entrée:

(1) L'entrée est un Map

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

Description copiée depuis l'interface: SimpleJdbcInsertOperations

Exécutez l'insertion à l'aide des valeurs transmises et renvoyez la clé générée. Cela nécessite que le nom des colonnes avec des clés générées automatiquement ait été spécifié. Cette méthode renvoie toujours un KeyHolder mais l'appelant doit vérifier qu'il contient réellement les clés générées.

Spécifié par:

executeAndReturnKey dans l'interface SimpleJdbcInsertOperations

Paramètres:

args - Map containing column names and corresponding value

Renvoie:

the generated key value

(2) L'entrée est un SqlParameterSource

public Java.lang.Number executeAndReturnKey(SqlParameterSourceparameterSource)

Description copiée depuis l'interface: SimpleJdbcInsertOperations

Exécutez l'insertion à l'aide des valeurs transmises et renvoyez la clé générée. Cela nécessite que le nom des colonnes avec des clés générées automatiquement ait été spécifié. Cette méthode renvoie toujours un KeyHolder mais l'appelant doit vérifier qu'il contient réellement les clés générées.

Spécifié par:

executeAndReturnKey dans l'interface SimpleJdbcInsertOperations

Paramètres:

parameterSource - SqlParameterSource containing values to use for insert

Renvoie:

la valeur de clé générée.

51
todd.pierzina

Ajout de notes détaillées/exemple de code à la réponse todd.pierzina

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();
21

Je ne sais pas s'il y a un "one-liner" mais cela semble faire l'affaire (pour MSSQL au moins):

// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );

Article décent ici .

1
javamonkey79