【Kotlin】Spring Boot+JPAでデータベースに接続する方法

Kotlinに置き換えてSpring Boot JPAでデータベース接続する方法までを試していきます。

プロジェクトの準備

Spring Initializrでプロジェクトを作成していきます。

必要な依存関係

  • Spring Boot DevTools
  • Spring Web
  • Spring Data JPA
  • Lombok
  • H2 Database
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "2.6.1"
    id("io.spring.dependency-management") version "1.0.11.RELEASE"
    war
    kotlin("jvm") version "1.6.0"
    kotlin("plugin.spring") version "1.6.0"
    kotlin("plugin.jpa") version "1.6.0"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11

configurations {
    compileOnly {
        extendsFrom(configurations.annotationProcessor.get())
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    developmentOnly("org.springframework.boot:spring-boot-devtools")
    runtimeOnly("com.h2database:h2")
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "11"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

データベースの用意と設定

ここではH2データベースを用いて進めていきます。

application.propertiesの設定

H2データベースをインメモリで設定しています。

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.sql-script-encoding=UTF-8

テストデータの用意(src/main/resources配下に配置)

とりあえずファイルだけ配置すると、アプリケーション実行時に反映してくれます。

DROP TABLE IF EXISTS DEMO_TBL;

CREATE TABLE DEMO_TBL (
    ID IDENTITY NOT NULL PRIMARY KEY,
    DEMO_NAME VARCHAR(100) NOT NULL
);
INSERT INTO DEMO_TBL(DEMO_NAME) VALUES ('demo01');
INSERT INTO DEMO_TBL(DEMO_NAME) VALUES ('demo02');
INSERT INTO DEMO_TBL(DEMO_NAME) VALUES ('demo03');

ソースコード

package com.example.demo.controller

import com.example.demo.repository.entity.DemoTbl
import com.example.demo.service.DemoService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestMethod
import org.springframework.web.bind.annotation.RestController

@RestController
class DemoController
    @Autowired
    constructor(private val service: DemoService) {

    @RequestMapping(path = ["/"], method = [RequestMethod.GET])
    fun search(): List<DemoTbl> {
        return service.demoTblSearch()
    }
}
package com.example.demo.service

import com.example.demo.repository.DemoTblRepository
import com.example.demo.repository.entity.DemoTbl
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

@Service
@Transactional
class DemoService
    @Autowired
    constructor(private val repository: DemoTblRepository) {

    fun demoTblSearch(): List<DemoTbl> {
        return repository.findAll()
    }
}
package com.example.demo.repository;

import com.example.demo.repository.entity.DemoTbl
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository

@Repository
interface DemoTblRepository : JpaRepository<DemoTbl, Int> {
}
package com.example.demo.repository.entity

import javax.persistence.*

@Entity
@Table(name = "demo_tbl")
data class DemoTbl(
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Int? = 0,
    @Column(name = "demo_name")var name: String)

JPAでデータベース接続を試す

ブラウザから「http://localhost:8080/」を実行すると、DBの内容が取得できた。

[{"id":1,"demoName":"demo01"},{"id":2,"demoName":"demo02"},{"id":3,"demoName":"demo03"}]

あとがき

今回はJPAで単純にテーブル1つを取ってくる方法を確認できた。

アプリケーション実行時にdata.sqlの内容がなぜか反映されなかったため、同じことが起きた人は、アプリケーション立ち上げ後、H2コンソールからINSERT文を実行してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です