1. 概要

このチュートリアルでは、Spring BootでH2を使用する方法について説明します。 他のデータベースと同様に、Spring Bootエコシステムでも完全にサポートされています。

2. 依存関係

h2spring-boot-starter-data-jpaの依存関係から始めましょう。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

3. データベース構成

デフォルトでは、Spring Bootは、ユーザー名saと空のパスワードを使用してメモリ内ストアに接続するようにアプリケーションを構成します。

ただし、 application.properties ファイルに次のプロパティを追加することで、これらのパラメータを変更できます。

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

または、対応するプロパティを application.yaml ファイルに追加することで、アプリケーションのデータベース構成にYAMLを使用することもできます。

spring:
  datasource:
    url: jdbc:h2:mem:mydb
    username: sa
    password: password
    driverClassName: org.h2.Driver
  jpa:
    spring.jpa.database-platform: org.hibernate.dialect.H2Dialect

設計上、インメモリデータベースは揮発性であり、アプリケーションの再起動後にデータが失われます。

ファイルベースのストレージを使用して、その動作を変更できます。 これを行うには、 spring.datasource.urlプロパティを更新する必要があります。

spring.datasource.url=jdbc:h2:file:/data/demo

同様に、 application.yaml では、ファイルベースのストレージに同じプロパティを追加できます。

spring:
  datasource:
    url: jdbc:h2:file:/data/demo

データベースは他のモードで動作することもできます。

4. データベース操作

Spring Boot内でH2を使用してCRUD操作を実行することは、他のSQLデータベースと同じであり、 SpringPersistenceシリーズのチュートリアルはこれをうまくカバーしています。

4.1. データソースの初期化

基本的なSQLスクリプトを使用して、データベースを初期化できます。 これを示すために、data.sqlファイルをsrc/ main /resourcesディレクトリに追加しましょう。

INSERT INTO countries (id, name) VALUES (1, 'USA');
INSERT INTO countries (id, name) VALUES (2, 'France');
INSERT INTO countries (id, name) VALUES (3, 'Brazil');
INSERT INTO countries (id, name) VALUES (4, 'Italy');
INSERT INTO countries (id, name) VALUES (5, 'Canada');

ここで、スクリプトはスキーマのcountrysテーブルにサンプルデータを入力します。

Spring Bootはこのファイルを自動的に取得し、構成済みのH2インスタンスなどの組み込みインメモリデータベースに対して実行します。 これは、テストまたは初期化の目的でデータベースをシードするための良い方法です

spring.sql.init.modeプロパティをneverに設定することで、このデフォルトの動作を無効にできます。 さらに、複数のSQLファイルを構成して、初期データをロードすることもできます。

初期データのロードに関する記事では、このトピックについて詳しく説明しています。

4.2. Hibernateおよびdata.sql

デフォルトでは、data.sqlスクリプトはHibernateの初期化の前に実行されます。 これにより、スクリプトベースの初期化がFlywayLiquibaseなどの他のデータベース移行ツールと連携します。 毎回Hibernateによって生成されるスキーマを再作成するため、追加のプロパティを設定する必要があります。

spring.jpa.defer-datasource-initialization=true

このは、デフォルトのSpring Bootの動作を変更し、Hibernateによってスキーマが生成された後にデータを入力します。 さらに、 schema.sql スクリプトを使用して、data.sqlを使用する前にHibernateで生成されたスキーマを構築することもできます。 ただし、このように異なるスキーマ生成メカニズムを混在させることはお勧めしません。

5. H2コンソールへのアクセス

H2データベースには、データベースのコンテンツを参照してSQLクエリを実行するためのGUIコンソールが組み込まれています。 デフォルトでは、H2コンソールはSpringでは有効になっていません。

これを有効にするには、application.propertiesに次のプロパティを追加する必要があります。

spring.h2.console.enabled=true

YAML構成を使用している場合は、プロパティをapplication.yamlに追加する必要があります。

spring:
  h2:
    console.enabled: true

次に、アプリケーションを起動した後、 http:// localhost:8080 / h2-console に移動すると、ログインページが表示されます。

ログインページで、application.propertiesで使用したものと同じクレデンシャルを提供します。

接続すると、ページの左側にあるすべてのテーブルとSQLクエリを実行するためのテキストボックスを一覧表示する包括的なWebページが表示されます。

Webコンソールには、SQLキーワードを提案するオートコンプリート機能があります。 コンソールが軽量であるという事実は、データベースを視覚的に検査したり、生のSQLを直接実行したりするのに便利です。

さらに、プロジェクトの application.properties で次のプロパティを目的の値で指定することにより、コンソールをさらに構成できます。

spring.h2.console.path=/h2-console
spring.h2.console.settings.trace=false
spring.h2.console.settings.web-allow-others=false

同様に、YAML構成を使用する場合、上記のプロパティを次のように追加できます。

spring:
  h2:
    console.path: /h2-console
    console.settings.trace: false 
    spring.h2.console.settings.web-allow-others: false

上記のスニペットでは、コンソールパスを / h2-console に設定しました。これは、実行中のアプリケーションのアドレスとポートを基準にしています。 したがって、アプリが http:// localhost:9001 で実行されている場合、コンソールは http:// localhost:9001/h2-consoleで使用できます。

さらに、spring.h2.console.settings.tracefalseに設定してトレース出力を防止し、springを設定してリモートアクセスを無効にすることもできます。[ X170X]h2.console.settings.web-allow-othersからfalse

6. 結論

H2データベースはSpringBootと完全に互換性があります。 これを構成する方法と、実行中のデータベースを管理するためにH2コンソールを使用する方法を見てきました。

完全なソースコードは、GitHubで入手できます。