1前書き

このクイックチュートリアルでは、

Spring JDBC

を使って作業するときにエンティティを挿入した後に自動生成キーを取得する可能性を探ります。


2 Mavenの依存関係

最初に、

pom.xmlで


spring-boot-starter-jdbc




H2__の依存関係を定義する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Maven Centralに対するこれら2つの依存関係の最新バージョンを確認することができます。


3自動生成キーを取得する

3.1. シナリオ


id

(自動生成キー)と

message

の2つの列を持つ

sys

message__テーブルを定義しましょう。

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


3.2.

JdbcTemplate


を使用する

それでは、

JDBCTemplate

を使用して新しいレコードを挿入し、自動生成された

idを返すメソッドを実装しましょう。

したがって、

データベースによって生成された主キーの取得をサポートする

JDBCTemplate


update()


メソッドを使用します。このメソッドは

PrepareStatementCreator

インターフェースのインスタンスを最初の引数として取り、もう一方の引数は

KeyHolderです。


PrepareStatementCreator

インターフェースは

__FunctionalInterface


であり、そのメソッドは

java.sql.Connection

のインスタンスを受け取り、

java.sql.PreparedStatement__オブジェクトを返します。

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


  • keyHolder

    オブジェクトには、

    JDBCTemplate update()

    メソッドからの自動生成されたキーの戻り値が含まれることに注意してください。


keyHolder.getKey().

を呼び出すことでそのキーを取得できます。

そのうえ、我々は方法を確かめることができます:

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

    assertEquals(MESSAGE__CONTENT, loadedMessage);
}


3.3.

SimpleJdbcInsert


を使用する


JDBCTemplate

に加えて、同じ結果を得るために

SimpleJdbcInsert

を使用することもできます。

したがって、

SimpleJdbcInsert

のインスタンスを初期化する必要があります。

@Repository
public class MessageRepositorySimpleJDBCInsert {

    SimpleJdbcInsert simpleJdbcInsert;

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

   //...
}

したがって、


SimpleJdbcInsert



executeAndReturnKey

メソッドを呼び出して

sys

message__テーブルに新しいレコードを挿入し、自動生成されたキーを取得することができます

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

さらに、その方法を非常に簡単に検証できます。

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

    assertEquals(MESSAGE__CONTENT, loadedMessage);
}


4結論

新しいレコードを挿入して自動生成されたキーを取り戻すために

JDBCTemplate



SimpleJdbcInsert

を使用する可能性を検討しました。

いつものように、私たちはこの記事の実装を見つけることができますhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-jpa。