Obtention de clés générées automatiquement dans Spring JDBC

Obtention de clés générées automatiquement dans Spring JDBC

1. introduction

Dans ce rapide didacticiel, nous allons explorer la possibilité d'obtenir la clé générée automatiquement après avoir inséré des entités lorsque vous travaillez avecSpring JDBC.

2. Dépendances Maven

Au début, nous devons avoir les dépendances despring-boot-starter-jdbc andH2 définies dans nospom.xml:


    org.springframework.boot
    spring-boot-starter-jdbc


    com.h2database
    h2
    runtime

Nous pouvons consulter la dernière version de ces deux dépendances sur Maven Central:spring-boot-starter-jdbc eth2.

3. Obtention de la clé générée automatiquement

3.1. Le scénario

Définissons une tablesys_message qui a 2 colonnes:id (clé auto-générée) etmessage:

CREATE TABLE IF NOT EXISTS sys_message (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    message varchar(100) NOT NULL,
    PRIMARY KEY (id)
);

3.2. Utilisation desJdbcTemplate

Maintenant, implémentons une méthode qui utiliseraJDBCTemplate pour insérer le nouvel enregistrement et renvoyer lesid.  générés automatiquement

Par conséquent, la méthodewe’ll use the JDBCTemplate update() qui prend en charge la récupération des clés primaires générées par la base de données. Cette méthode prend une instance de l'interfacePrepareStatementCreator comme premier argument et l'autre argument est leKeyHolder. 

Puisque l'interfacePrepareStatementCreator est unFunctionalInterface où sa méthode accepte une instance dejava.sql.Connection et retourne un objetjava.sql.PreparedStatement, pour plus de simplicité, nous pouvons utiliser une expression lambda:

String INSERT_MESSAGE_SQL
  = "insert into sys_message (message) values(?) ";

public long insertMessage(String message) {
    KeyHolder keyHolder = new GeneratedKeyHolder();

    jdbcTemplate.update(connection -> {
        PreparedStatement ps = connection
          .prepareStatement(INSERT_MESSAGE_SQL);
          ps.setString(1, message);
          return ps;
        }, keyHolder);

        return (long) keyHolder.getKey();
    }
}

It’s worth noting that the keyHolder object will contain the auto-generated key return from the JDBCTemplate update() method.

Nous pouvons récupérer cette clé en appelantkeyHolder.getKey().

En outre, nous pouvons vérifier la méthode:

@Test
public void
  insertJDBC_whenLoadMessageByKey_thenGetTheSameMessage() {
    long key = messageRepositoryJDBCTemplate.insert(MESSAGE_CONTENT);
    String loadedMessage = messageRepositoryJDBCTemplate
      .getMessageById(key);

    assertEquals(MESSAGE_CONTENT, loadedMessage);
}

3.3. Utilisation deSimpleJdbcInsert

En plus desJDBCTemplate, nous pouvons également utiliserSimpleJdbcInsert pour obtenir le même résultat.

Par conséquent, nous devons initialiser une instance desSimpleJdbcInsert:

@Repository
public class MessageRepositorySimpleJDBCInsert {

    SimpleJdbcInsert simpleJdbcInsert;

    @Autowired
    public MessageRepositorySimpleJDBCInsert(DataSource dataSource) {
        simpleJdbcInsert = new SimpleJdbcInsert(dataSource)
          .withTableName("sys_message").usingGeneratedKeyColumns("id");
    }

    //...
}

Par conséquent,we can call the executeAndReturnKey method of the SimpleJdbcInsert to insert a new record to sys_message table and get back the auto-generated key:

public long insert(String message) {
    Map parameters = new HashMap<>(1);
    parameters.put("message", message);
    Number newId = simpleJdbcInsert.executeAndReturnKey(parameters);
    return (long) newId;
}

De plus, nous pouvons vérifier cette méthode très simplement:

@Test
public void
  insertSimpleInsert_whenLoadMessageKey_thenGetTheSameMessage() {
    long key = messageRepositorySimpleJDBCInsert.insert(MESSAGE_CONTENT);
    String loadedMessage = messageRepositoryJDBCTemplate.getMessageById(key);

    assertEquals(MESSAGE_CONTENT, loadedMessage);
}

4. Conclusion

Nous avons exploré la possibilité d’utiliserJDBCTemplate etSimpleJdbcInsert pour insérer un nouvel enregistrement et récupérer la clé générée automatiquement.

Comme toujours, nous pouvons retrouver l'implémentation de cet articleover on Github.