Spring JDBCで自動生成キーを取得する
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つの依存関係の最新バージョンを確認することができます。
spring-boot -starter-jdbc
および
h2
。
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。