Spring BootでH2 Database Engineを使用する
これはなに?
Spring BootでH2 Database Engineを組みこんで使用する方法をメモしたものです。
H2 Database Engineとは?
H2 Database Engineとは、Javaで実装されたリレーショナル型データベースのです。(以降、H2と呼びます)
なお、H2はOSSとして公開されています。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リポジトリを見ると、今どのバージョンがあるか、各々ビルドツールに追加する際のコードが載っています。
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からアクセスできます。
下のような画面が表示されれば、コンソールにアクセスできています。
application.propertiesの以下の情報(url, username, password)をコンソールに入力すると、対象DBに接続してログインが出来ます。
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
以下の画面では、SQLを入力してデータ確認や、データ編集といったことも出来ます。
Spring Bootアプリケーション開発では役に立ちそうだと思いますね。
Discussion