2
1

More than 1 year has passed since last update.

H2データベースを使用してSpringBoot起動ごとにDB初期化するアプリケーションを作成する

Last updated at Posted at 2022-10-01

はじめに

本記事で書くこと

  • H2databaseの利用方法
  • H2コンソールの表示方法
  • jdbcTemplateを使用したSQL実行方法

本記事で書かないこと

  • SprinBootでウェブアプリケーションを作成する方法

作成するアプリケーションの概要

  1. アプリケーション起動時にH2データベースに「TSET_TABLE」というテーブルをCREATEし、3レコードを追加する
  2. 画面は「入力画面」と「登録後確認画面」の2つ
  3. 「入力画面」では登録内容の入力と現在のDB内容の確認が可能
  4. 「登録後確認画面」では登録内容の表示と現在のDB内容の確認が可能
  5. H2データベースは、アプリケーション起動毎に初期化する。

パッケージ構成

C:.
├─java
│  ├─base
│  │  │  MainApplication.java
│  │  │
│  │  ├─config
│  │  │      SecurityConfig.java
│  │  │
│  │  ├─controller
│  │  │      T001Controller.java
│  │  │
│  │  ├─dto
│  │  │      T001Form.java
│  │  │
│  │  ├─entity
│  │  │      dept.java
│  │  │
│  │  └─service
│  │          T001Service.java
│  │
│  └─org
└─resources
    │  application.yml
    │  data.sql
    │  schema.sql
    │
    └─templates
        │  T001Confirm.html
        │  T001Input.html
        │
        └─components
                layout.html

画面設計(簡素版)

初期画面

  • DBに追加するテキストを入力するテキストボックスを2つ
  • 現在のDB内容を表で表示
  • DB登録を実行するための「送信」ボタン
    image.png

登録後、確認画面

  • 入力したテキストをラベル表示
  • DB更新後の内容を表で表示
  • 前画面に戻るための「戻る」ボタン
    image.png

ソース

ソースはこちらに公開していますので、ご自由にお使い下さい。
https://github.com/morimoto-com/test202209

H2データベースとは

H2データベースとは、Javaで実装されたリレーショナル型データベースです。
インストールなどが不要で手軽に実装できることがメリットで、プロトタイプ開発やテスト用のDBとして良く用いられます。
データの保存先はインメモリかファイルベースで、データを保存する必要がない場合はインメモリ、保存したい場合はファイルベースという使い分けをします。
SpringBootの場合は、非常に簡単に扱うことができるので、今回はその利用方法を説明します。

H2データベースを準備する

今回はインメモリを使用してH2データベースを構築します。

build.gradleにライブラリ情報を定義する

まずは、H2データベースを利用するためにgradleにライブラリ情報を定義します。

build.gradle
implementation 'javax.persistence:javax.persistence-api:2.2'
 //⇒entityクラスの@entityなどに使用
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
 //⇒h2データベースを操作するのに使用
runtimeOnly 'com.h2database:h2'
 //⇒h2データベースそのもの

その他にもいくつか指定していますが、「H2データベースを利用する」という観点で重要なライブラリは上記3つです。

application.ymlに接続情報を定義する

application.yml
# JDBCドライバを指定
spring:
  datasource:
    driver-class-name: org.h2.Driver
    # データベースのURL。メモリ上にtestdbを作成しますよ、と指定。
    url: jdbc:h2:mem:testdb
    username: sa
    password:

application.ymlにてコンソールを有効化する

  h2:
    console:
      # コンソールを有効化
      enabled: true
      path: /h2-console

H2データベースのコンソールを開く

以上で、SpringBootアプリケーション上にH2データベースを使用する環境を構築することができました。
まだ、テーブルなどを作成していないのでデータを操作することはできませんが、
まずは、H2データベースそのものにアクセスしてみます。

まず、SpringBootを起動します。
image.png

12:48:49:  'bootRun' を実行中...

> Task :bootBuildInfo
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes
> Task :bootRunMainClassName

> Task :bootRun
12:48:50.172 [Thread-0] DEBUG org.springframework.boot.devtools.restart.classloader.RestartClassLoader xxx
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.0)

xxx 省略 xxx
2022-10-01 12:48:51.954  INFO 13176 --- [  restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration    : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb'

xxx 省略 xxx

2022-10-01 12:48:52.506  INFO 13176 --- [  restartedMain] base.MainApplication                     : Started MainApplication in 2.325 seconds (JVM running for 2.676)

起動ログにて、H2データベースが起動したことが確認できます。

では、下記URLにアクセスしてみます。

http://localhost:8080/h2-console

すると、H2 Consoleというページが表示されるので、前で設定した接続情報を入力して接続します。
image.png

H2データベースに接続できました。
※私の場合はすでにTEST_TABLEというテーブルが存在していますが、こちらは後の手順で作成したものです
image.png

SpringBoot起動時にDBを初期化する

やり方はとても簡単です。
resourcesの配下にSQLを配置します。
DDLはschema.sqlに、
DMLはdata.sqlに記述してください。

└─resources
    │  data.sql
    │  schema.sql

あとはSpringBootを再起動することで
設定したSQLが実行され、メモリ上にテーブルが作成されます。

SQLを実行する

では、H2データベースを使用する準備ができましたので
あとはデータベースを操作する実装をしていきます。

今回はリポジトリクラスは省略します。

JdbcTemplateを@Autowiredする

T001Service.java
    @Autowired
    private JdbcTemplate jdbcTemplate;

jdbcTemplateを使用してSELECT文を実行する

T001Service.java
    public List<dept> selectDb(){
        // DB一覧取得処理
        return jdbcTemplate.query("SELECT * FROM TSET_TABLE", new BeanPropertyRowMapper<dept>(dept.class));
    }

jdbcTemplateを使用してINSERT文を実行する

T001Service.java
    public void insertDb(T001Form form){
        // DB挿入処理
        jdbcTemplate.update("INSERT INTO TSET_TABLE (text1, text2) VALUES (?, ?)", form.getText1() , form.getText2());

    }

以上

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1