Automatisch generierte Schlüssel in Spring JDBC abrufen

Abrufen von automatisch generierten Schlüsseln in Spring JDBC

1. Einführung

In diesem kurzen Tutorial untersuchen wir die Möglichkeit, den automatisch generierten Schlüssel nach dem Einfügen von Entitäten zu erhalten, wenn Sie mitSpring JDBC arbeiten.

2. Maven-Abhängigkeiten

Zuerst müssenspring-boot-starter-jdbc andH2 Abhängigkeiten in unserenpom.xml definiert sein:


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


    com.h2database
    h2
    runtime

Wir können uns die neueste Version dieser beiden Abhängigkeiten von Maven Central ansehen:spring-boot-starter-jdbc undh2.

3. Den automatisch generierten Schlüssel erhalten

3.1. Das Szenario

Definieren wir einesys_message-Tabelle mit zwei Spalten:id (automatisch generierter Schlüssel) undmessage:

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

3.2. Verwenden SieJdbcTemplate

Implementieren wir nun eine Methode, dieJDBCTemplate verwendet, um den neuen Datensatz einzufügen und die automatisch generiertenid.  zurückzugeben

Daherwe’ll use the JDBCTemplate update() Methode, die das Abrufen von Primärschlüsseln unterstützt, die von der Datenbank generiert wurden. Diese Methode verwendet eine Instanz derPrepareStatementCreator-Schnittstelle als erstes Argument und das andere Argument istKeyHolder. 

Da diePrepareStatementCreator-Schnittstelle eineFunctionalInterface -Schwelle ist, akzeptiert ihre Methode eine Instanz vonjava.sql.Connection und gibt der Einfachheit halber einjava.sql.PreparedStatement-Objekt zurück. Wir können einen Lambda-Ausdruck verwenden:

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.

Wir können diesen Schlüssel abrufen, indem wirkeyHolder.getKey(). aufrufen

Außerdem können wir die Methode überprüfen:

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

    assertEquals(MESSAGE_CONTENT, loadedMessage);
}

3.3. Verwenden vonSimpleJdbcInsert

Zusätzlich zuJDBCTemplate können wir auchSimpleJdbcInsert verwenden, um das gleiche Ergebnis zu erzielen.

Daher müssen wir eine Instanz vonSimpleJdbcInsert initialisieren:

@Repository
public class MessageRepositorySimpleJDBCInsert {

    SimpleJdbcInsert simpleJdbcInsert;

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

    //...
}

Folglich sindwe 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;
}

Darüber hinaus können wir diese Methode ganz einfach überprüfen:

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

    assertEquals(MESSAGE_CONTENT, loadedMessage);
}

4. Fazit

Wir haben die Möglichkeit untersucht,JDBCTemplate undSimpleJdbcInsert zum Einfügen eines neuen Datensatzes und zum Zurückholen des automatisch generierten Schlüssels zu verwenden.

Wie immer finden wir die Implementierung dieses Artikelsover on Github.