(第2回) H2の接続設定、エンティティクラスの作成、data.sqlで初期データ作成【Spring Boot2】

H2入門の第2回です。H2データベースの接続設定(application.properties)、Spring Data JPAのエンティティクラスの作成、またDBの初期データの作成をやっていきます。Spring Bootの初心者・入門者の方は、参考にしてみてください。

動作環境と今回の目的

最終更新日:2021/5/19

前回は、H2データベースを試すためのSpring Bootのプロジェクト作成までをやりました。
(第1回) 手軽に試せるH2データベース入門【H2, Spring Boot2】

今回は、H2の接続設定やJavaのエンティティクラスの作成、またDBの初期データの作成をやっていきます。

・動作環境やバージョンは以下の通りです。
OS:macOS Catalina(バージョン10.15.5)
開発環境:Eclipse(Pleiades All in One、4.16(2020-06)、Java Full Edition版)、(*2020/8/28時点の最新安定版です)
Spring Boot:バージョン2.3.3
Java:11

今回作成するファイル

前回test-h2というSpring Bootのプロジェクトを作成しましたが、今回作成するファイルを先に書いておきます。
Spring Bootアプリ、H2の接続設定

作成するファイルは3つです。

  • Diary.java:Spring Data JPAのエンティティクラス
  • application.properties:H2の接続設定。このファイルはプロジェクト作成時に空の状態で作成されているはず。
  • data.sql:DML(Data Manipulation Language)ファイル

H2の接続設定、application.properties

まずは、application.propertiesファイルでH2接続設定をします。application.propertiesファイルは、Spring Bootプロジェクト作成時に以下のパスに自動で作られています(ファイルの中身は空になっています)。

src/main/resource/application.properties

そして、application.propertiesファイルを編集します。ユーザ名とパスワードはコメントアウトしているので、設定しているのは2箇所です。

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:hogedb
#とりあえず自分でテスト的にH2を試すだけなので、DBのユーザ名とパスワードはコメントアウトして未設定にしておく
#spring.datasource.username=hogeuser
#spring.datasource.password=pass

  • spring.datasource.driver-class-name:JDBCドライバーの完全修飾名。ここではH2へ接続するため"org.h2.Driver"にしています。
  • spring.datasource.url:データベースの接続URL。上の設定では、"jdbc:h2"がH2へ接続、"mem"がDBをインメモリ上に構築、"hogedb"がDB名です。
◾️H2のデータの保存先をファイルにする、データの永続化

H2のデータの保存先はインメモリだけでなく、ファイルに保存する事もできます。ファイル保存だとデータを永続的に残せるので、アプリを終了してもデータは残ります。

H2をファイルベースで利用する時の方法や設定については別ページで説明していますので、そちらを参考にしてください。
H2のデータ保存先をファイルに設定、データの永続化【Spring Boot2】

エンティティクラスの作成

次に、Spring Data JPAのエンティティクラスを作成します。今回は、日記、もしくはメモ帳やツイートなどのデータを想定して、単純なDiaryクラスを作成します。
src/main/java配下のcom.example.demoパッケージ下にDiary.javaファイルを作成して編集します。

package com.example.demo;

import java.time.LocalDateTime;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
//@Table(name = "diaries")	//指定しないとテーブルはクラス名と同じdiary
public class Diary {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String comment;
    @Column(name = "create_datetime", nullable = false)
    private LocalDateTime createDatetime;
}

エンティティクラスのフィールドは3つだけです。

  • id:主キー
  • comment:日記の本体コメント
  • createDatetime:投稿日時

まず、Spring Data JPAのエンティティクラスである事を表すために、クラス名に@Entityを付けます。

@Tableはコメントアウトしていますが、エンティティクラス名とH2データベースのテーブル名が異なる場合、@Tableのnameでテーブル名を指定して、エンティティクラスとテーブル名をマッピングします。
上のコードでは@Tableは指定していませんので、アプリ起動時にエンティティクラスと同じ名前のDiaryというテーブルが、Spring Data JPAによって自動生成されます。

フィールドのidに付与している@Idは、エンティティの主キーという事です。
@GeneratedValueは主キーが自動採番される事、strategy=GenerationType.IDENTITYは採番方法を示しています。

フィールドのcreateDatetimeに付与している@Columnは、テーブルのフィールドに対する設定をしています。「name = "create_datetime"」はテーブルにあるフィールド名を"create_datetime"に設定し、「nullable = false」はフィールドの値をnull禁止(not null)にしています。
@Columnを付与しないと、エンティティのフィールド名とテーブルのフィールド名は同じになります。

@Data、@NoArgsConstructor、@AllArgsConstructorは全て、Lombokのアノテーションです。これらを付ける事で、フィールドのセッター・ゲッター、クラスのコンストラクタのコードが自動生成されるので、エンティティクラスのコード量を削減できます。

Eclipseの場合、アウトラインビューでクラスにあるフィールド、メソッド、コンストラクタの一覧が見れますので、ここでLombokによって自動生成されたメソッドなども確認できます。

data.sqlの作成、DBの初期データの作成

次に、初期データを作成するためのDML(Data Manipulation Language)ファイルの作成です。
Spring Bootでは、プロジェクトのsrc/main/resourcesディレクトリ下にdata.sqlファイルを作成し、このファイルにDMLのSQLを書いておくと、アプリ起動時に自動でdata.sqlをロードしてSQLを実行して初期データを作ってくれます。

実際にdata.sqlファイルを作成して編集します。
(*data.sqlに書くsqlをコメントアウトしたい場合は、行頭に"--"を付けます)

INSERT INTO diary(comment, create_datetime) VALUES('今日は晴れ。コメント1', LOCALTIME());
INSERT INTO diary(comment, create_datetime) VALUES('comment 2', LOCALTIME());
INSERT INTO diary(comment, create_datetime) VALUES('こめんと3', LOCALTIME());
上で作成したエンティティクラスのDiaryに合わせてsqlを作成しました。テスト的に3レコード分追加するsqlです。
LOCALTIME()は現在日時を生成します。

◾️DDL(Data Definition Language)のschema.sql
Spring Bootでは、DMLのdata.sqlだけでなく、DDLのschema.sqlファイルをsrc/main/resourcesディレクトリ下に作成して置いとくと、アプリ起動時にdata.sqlと同じく自動でschema.sqlをロードして実行してくれます。

今回DDLは、Java側(エンティティクラスのEntity)でやってくれるため、schema.sqlは使用していません。
また、Spring BootではFlywayというDDLのバージョン管理ができるツールもあります。
schema.sqlとFlywayについては、また別の機会に書いたいと思っています。

最後に、次回

以上今回は、H2への接続設定、エンティティクラスDiaryの作成、DMLのdata.sqlを作成しました。

これでアプリを実行すれば、H2のDBがインメモリで生成され、エンティティクラスDiaryからSpring Data JPAによってdiaryテーブルが自動生成され、data.sqlで書いた3レコード分のデータが生成されます。

次回は、Spring Bootアプリの起動によって生成されるH2DBのテーブルやデータは、H2の管理ツールの"H2 Console"で確認する事ができますので、H2 Consoleの使い方について書いていきます。

(第3回) H2のブラウザ管理ツール"H2 Console"の使い方【H2, Spring Boot2】
H2データベース入門【Spring Boot】トップに戻る

[広告] Kindle Unlimitedなら対象の本が定額で読み放題
対象本には、プログラミングなどのIT関連本、マンガ、雑誌、ビジネス書などがたくさんあります!

Spring Bootの記事

Spring Boot2で日記投稿ウェブアプリ開発入門トップページ
Spring Boot2.3,2.4でシンプルな日記投稿ウェブアプリの開発しながら、入門者・初心者にもわかりやすいように説明しています。DBを使用して、新規投稿、編集、削除、一覧表示という基本的なCRUD機能を備えたアプリです。