👋

Spring BootでH2 Database Engineを使用する

2020/12/12に公開

これはなに?

Spring BootでH2 Database Engineを組みこんで使用する方法をメモしたものです。

H2 Database Engineとは?

H2 Database Engineとは、Javaで実装されたリレーショナル型データベースのです。(以降、H2と呼びます)
https://www.h2database.com/html/main.html
なお、H2はOSSとして公開されています。
https://github.com/h2database/h2database

githubに特徴が記載されているので、以下に引用します。

  • Very fast, open source, JDBC API
  • Embedded and server modes; disk-based or in-memory databases
  • Transaction support, multi-version concurrency
  • Browser based Console application
  • Encrypted databases
  • Fulltext search
  • Pure Java with small footprint: around 2.5 MB jar file size
  • ODBC driver

H2はjarで提供されており、アプリケーションのクラスパスに追加することで、RDBMSとして使えるようになります。
また、コンソールアプリケーションもついてきますので、画面からSQL投入といったことが出来るようになります。

たとえば、PostgreSQLであれば、自分でインストーラからセットアップ、Dockerから起動したりといった手順を踏む必要ありましたが、H2は手軽な手順で使えるのが非常に大きなポイントだと思います。

Spring Bootに組みこむ

Gradle前提の手順になります。Mavenでも同様かと思われますので適宜読み替えてください。

環境

このような環境です。

plugins {
    id 'org.springframework.boot' version '2.4.1'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

Spring-Boot-Starter-Webは、H2のコンソールにアクセスする時に必要です。
MyBatisを使っているのは、特に意味はないです。JPA等、他スターターでも問題なく使えると思います。

build.gradleに依存関係を追加

build.gradleに以下を追加します。今回は1.4.200を使用しました。

// https://mvnrepository.com/artifact/com.h2database/h2
testCompile group: 'com.h2database', name: 'h2', version: '1.4.200'

testCompileではなく、implementationにします。

なお、Mavenリポジトリを見ると、今どのバージョンがあるか、各々ビルドツールに追加する際のコードが載っています。
https://mvnrepository.com/artifact/com.h2database/h2

Spring Bootアプリケーションから接続するための設定を追加

H2 Database EngineとSpring Bootアプリケーションを接続するには、最低でも以下設定が必要になります。

// JDBCドライバを指定
spring.datasource.driver-class-name=org.h2.Driver
// データベースのURL。メモリ上にtestdbを作成しますよ、と指定。
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
// コンソールを有効化
spring.h2.console.enabled=true

初期化SQLを作成

build.gradleに追加すれば使えるようにはなっていますが、どうせならアプリケーションが立ち上がった時に初期化SQLを実行してくれて、テーブル作成、データ投入してくれた方が嬉しいですよね。

Spring Bootでは、初期化SQLを実行するための手段が用意されています。

テーブル作成

/src/main/resources/以下に、schema.sqlを作成します。中身はこんなものです。

DROP TABLE IF EXISTS DEPT;

CREATE TABLE DEPT (
    ID IDENTITY NOT NULL PRIMARY KEY,
    NAME VARCHAR(255) NOT NULL
);

データ投入

/src/main/resources/以下に、data.sqlを作成します。中身はこんなものです。

INSERT INTO DEPT(NAME) VALUES ('Marketing');
INSERT INTO DEPT(NAME) VALUES ('Sales');
INSERT INTO DEPT(NAME) VALUES ('Development');

Spring Bootアプリケーション実行

GradleのbootRunタスクを実行するだけです。

コンソールへのアクセス

もしSpring-Boot-Starter-Webでポート番号やコンテキストルートの変更を行なっていないのであれば、以下のURLからアクセスできます。
http://localhost:8080/h2-console/

下のような画面が表示されれば、コンソールにアクセスできています。

application.propertiesの以下の情報(url, username, password)をコンソールに入力すると、対象DBに接続してログインが出来ます。

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=

以下の画面では、SQLを入力してデータ確認や、データ編集といったことも出来ます。

Spring Bootアプリケーション開発では役に立ちそうだと思いますね。

Discussion