こんにちは、白々さじきです。
今回は、Kotlin × Spring Boot を使用してデータベースと連携する方法を紹介します。Spring Boot の JdbcTemplate を活用し、データの取得・保存を実装します。
今回のチュートリアルの参考ページはこちらです。
Spring Boot プロジェクトにデータベースサポートを追加
データベースの追加と設定
JVM アプリケーションでは、データベースとやり取りするために JDBC を使用します。Spring Boot では JdbcTemplate
クラス を利用することで、より簡単に DB 操作を実装できます。
今回は JdbcTemplate
を使って、データベースとやり取りする MessageService.kt
を作成します。
サービス層の作成(MessageService)
Spring Boot では、ビジネスロジックを サービス層(Service Layer) に分けて管理するのが一般的です。この層でデータベースとやり取りするクラスを定義し、Spring の DI(依存性注入) を活用するために @Service
アノテーションを付与します。
手順
demo
パッケージ内にMessageService.kt
を新規作成- 以下のコードを追加
package demo
import org.springframework.stereotype.Service
import org.springframework.jdbc.core.JdbcTemplate
import java.util.*
@Service
class MessageService(private val db: JdbcTemplate) {
fun findMessages(): List<Message> = db.query("select * from messages") { response, _ ->
Message(response.getString("id"), response.getString("text"))
}
fun save(message: Message): Message {
db.update(
"insert into messages values ( ?, ? )",
message.id, message.text
)
return message
}
}
MessageService.ktのコード解説
コンストラクタ引数と依存性注入
Kotlin では、クラス定義時にコンストラクタを直接指定できます。
class MessageService(private val db: JdbcTemplate)
このように記述することで、Spring Boot の DI 機能 により JdbcTemplate
が自動で注入されます。
トレーリングラムダと SAM 変換
findMessages()
メソッドでは、db.query()
を使用してデータを取得します。
db.query("select * from messages") { response, _ ->
Message(response.getString("id"), response.getString("text"))
}
この query()
メソッドは RowMapper を受け取りますが、Kotlin では SAM(Single Abstract Method)変換 により、ラムダ式で簡単に記述できます。
また、最後の引数がラムダ式の場合、括弧の外に出せる(トレーリングラムダ) ルールを活用しています。
未使用のラムダ引数のアンダースコア(_)
response, index -> ...
のように書いた場合、index
を使用しないなら _
に置き換えるのが推奨されます。
MessageController クラスのアップデート
先ほど作成した MessageService
をコントローラーで呼び出せるように MessageController.kt
を修正します。
修正後のコード
package demo
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import java.net.URI
@RestController
@RequestMapping("/")
class MessageController(private val service: MessageService) {
@GetMapping
fun listMessages() = service.findMessages()
@PostMapping
fun post(@RequestBody message: Message): ResponseEntity<Message> {
val savedMessage = service.save(message)
return ResponseEntity.created(URI("/${savedMessage.id}")).body(savedMessage)
}
}
PostMapping とは?
@PostMapping("/")
を使用することで、POSTリクエストを受け取って DB にデータを保存する処理 を定義できます。
データベースのスキーマを定義する
schema.sql
を作成src/main/resources/
に新規→ファイルを選択し、schema.sql
を作成し、テーブル構造を記述
application.properties
に設定を追加src/main/resources/application.properties
に設定を記述
1のテーブル構造は下記です。
CREATE TABLE IF NOT EXISTS messages (
id VARCHAR(60) PRIMARY KEY,
text VARCHAR NOT NULL
);
2の設定は下記です。
spring.application.name=demo
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:file:./data/testdb
spring.datasource.username=name
spring.datasource.password=password
spring.sql.init.schema-locations=classpath:schema.sql
spring.sql.init.mode=always
HTTPリクエストのテスト
IntelliJ IDEAでは .http
ファイルを使って API を手軽にテストできます。
ただし、IntelliJ IDEA Community 版ではデフォルトで使用できません。
なので、HTTPリクエストを実行するプラグインが必要になります。
HTTP リクエストテストを有効化する方法(Apidog Fast Request)
今回はApidog Fast Requestを使ってみようと思います。

- IntelliJ IDEA の 「Plugins」 を開く
- 「Apidog Fast Request」 を検索しインストール
- IDE を再起動
インストール後、HTTP リクエストを直接実行可能 になります!
Apidog Fast Request を使用した API テスト
テストしたい場合は、Apidog Fast Request を 右側のメニューから選択 し、以下のようにテストしたいエンドポイントを選択してください。
API テスト画面(Apidog Fast Request)

この画面では、定義したエンドポイントを簡単にテストできます。
例えば、POST
メソッドを選択し、JSON を送信することでデータの登録が可能になります。
データの登録・取得を実際に試してみる
データを登録(POST)
Apidog Fast Request などを使用して、以下のような JSON を送信します。
{
"text": "sirajira sajiki"
}
Apidog Fast Requestを使って送ると、下記のようにidが付与されて戻ってきます。

データを取得(GET)
今度は、このデータが取得できているかを確認します。
Apidog Fast Requestを使ってGetしてDB に登録されたデータが正しく取得できれば OK!

まとめ
今回は Spring Boot × Kotlin で DB を操作する方法 を解説しました。JdbcTemplate
を利用することで、シンプルなコードでデータの取得・保存が可能です。
次回は、ID を指定して単体のデータを取得できる API(GET /{id}
) を実装する方法を解説します。
この記事が誰かの役に立てれば幸いです。
サポートのお願い
下記リンクからお買い物いただけると、ブログ運営のための費用が増え、有料サービスを利用した記事作成が可能になります。ご協力よろしくお願いします!

コメント