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

# はじめに
### 本記事で書くこと
* H2databaseの利用方法
* H2コンソールの表示方法
* jdbcTemplateを使用したSQL実行方法
### 本記事で書かないこと
* SprinBootでウェブアプリケーションを作成する方法

# 作成するアプリケーションの概要
1. アプリケーション起動時にH2データベースに「TSET_TABLE」というテーブルをCREATEし、３レコードを追加する
1. 画面は「入力画面」と「登録後確認画面」の２つ
1. 「入力画面」では登録内容の入力と現在のDB内容の確認が可能
1. 「登録後確認画面」では登録内容の表示と現在のDB内容の確認が可能
1. 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に追加するテキストを入力するテキストボックスを２つ
* 現在のDB内容を表で表示
* DB登録を実行するための「送信」ボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/8f0b9740-156e-653f-72ff-8ca2449d6a40.png)

__登録後、確認画面__
* 入力したテキストをラベル表示
* DB更新後の内容を表で表示
* 前画面に戻るための「戻る」ボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/6151c176-db5c-aae3-f4fb-00dcf0477561.png)


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

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

# H2データベースを準備する
:::note info
今回はインメモリを使用して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データベースを利用する」という観点で重要なライブラリは上記３つです。

## 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/aeba93c8-f741-205c-e264-427356abd50b.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/00b59946-7ff3-44e8-1c2a-89a0f8845d05.png)

H2データベースに接続できました。
※私の場合はすでにTEST_TABLEというテーブルが存在していますが、こちらは後の手順で作成したものです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/1e51d4a9-9181-9396-ac18-4535da368183.png)


# SpringBoot起動時にDBを初期化する
やり方はとても簡単です。
resourcesの配下にSQLを配置します。
DDLはschema.sqlに、
DMLはdata.sqlに記述してください。
```
└─resources
    │  data.sql
    │  schema.sql
```
あとはSpringBootを再起動することで
設定したSQLが実行され、メモリ上にテーブルが作成されます。


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

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


## 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());

    }

```

以上