
【第2回】Spring bootで運動記録をDBに記録してみた(DB作成編)
2022.01.11
【第2回】Springbootを使って、DBとの連携システムを考える
前回は簡単な画面表示をするところまで説明しました。
今回はDB(データベース)の設定をしていきたいと思います。
DBにもいろいろと種類はありますが、
まずは手間が少ない 「h2 database」 を利用してみたいと思います。
前回の記事はこちら
h2 databaseでDBを作成する
pom.xmlの設定
前回の記事で、DBを利用するためにプロジェクト作成時に
「JDBC API」 と 「h2 database」 をライブラリ指定したかと思います。
指定してあればpom.xmlに以下の記述がされているはずです。
もし無ければ追記してください。
1 2 3 4 5 6 7 8 9 10 | <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> |
application.ymlの設定
次にapplication.ymlにDB設定をしていきます。
1 2 3 4 5 6 7 | spring: datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false username: sa password: initialization-mode: always |
「spring.datasource」 に一通りの設定を記述しています。
「driver-class-name」 でドライバのクラス名を指定してます。
urlにはDBの種類、DB名とオプションを記載してあります。
今回は 「jdbc:h2:mem:testdb;」 でh2にtestdbという名前のDBを
mem指定でインメモリデータベースとして準備しています。
インメモリデータベースはSpringboot起動中に使えるメモリ上のデータベースです。
この設定だと、Springbootを停止するとメモリは破棄されます。
インメモリの場合、通常h2は接続が切れるとデータベースをドロップします。
それを防ぐために「DB_CLOSE_DELAY=-1;」追記します。
また、「DB_CLOSE_ON_EXIT=false」 で
VM終了時の自動データベースクローズを無効にしています。
あとは接続するためのusernameとpasswordを設定します。
「initialization-mode: always」については後で説明します。
h2コンソールの設定
h2コンソールを利用することによって、DBの確認がしやすくなります。
application.ymlに以下を追記します。
1 2 3 4 5 6 7 8 | spring: datasource: (中略) h2: console: enabled: true path: /h2-console |
「spring.h2.console」に一通りの設定を記述しています。
「enabled」は、コンソールの利用有無を設定しています。
trueなら利用、falseなら利用しない、となります。
「path」は、H2コンソールを表示するURLパスとなります。
上記のように「path: /h2-console」と設定した場合、
ローカル起動して「http://localhost:8080/h2-console」にアクセスすると
h2コンソールが表示されます。

この画面にapplication.ymlで設定した情報を入力して
「Connect」を押すとDBの状態が見れます。
今はまだDBの定義もしていないので、この画面が見えるだけで良いです。
DBのテーブルを準備する
次にDBのテーブルを準備します。
いくつか方法がありますので、順番に紹介していきます。
JPAによるテーブルの設定
application.ymlに「spring.jpa.」からの設定を追記します。
これによってSQLのお手伝いをしてくれる設定を取り込みます。
1 2 3 4 5 6 | spring: (中略) jpa: show-sql: true hibernate: ddl-auto: cleate |
「show-sql」をtrueにすると、生成されたSQLがコンソール等で表示されるようになります。
「hibernate.ddl-auto」を「cleate」に設定しておくと
「@entity」で定義されたクラスを読み取って、
自動的にクラス名のテーブルで、変数をカラムとして作成してくれるようになります。
例えばクラス名がProgramで、その中に変数名id、nameがあるとします。
このクラスに@Entity アノテーションを付けて起動すると、
カラムidとnameが存在するprogramテーブルが自動的に作られます。
1 2 3 4 5 6 7 8 9 10 11 12 | <クラス例> @Entity public class Program { @Id private Long id; private String name; public Long getId() { return id; } ・・・(以降は略) |
この時 show-sql を設定していると、起動時に以下のようなログが表示されるので、動きがわかりやすいです。
1 2 3 | <コンソールログ> Hibernate: drop table if exists program CASCADE Hibernate: create table program (〜・・・ |
schema.sqlによるテーブルの設定
次に「schema.sql」を利用したテーブル設定の紹介です。
先に記述していた 「initialization-mode: always」をapplication.ymlに設定すると、
起動時に決められた配置にあるSQLファイルを読み込んでくれるようになります。
(前述の記載例を参照)
読み込むために schema.sql という名前のファイルを
resourcesディレクトリ直下に配置し、
その中にCREATE文など必要なものを記載していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | CREATE TABLE IF NOT EXISTS program ( id IDENTITY NOT NULL PRIMARY KEY, name VARCHAR(255) NOT NULL, unit VARCHAR(255) NOT NULL, programset BOOLEAN, updatetime TIMESTAMP DEFAULT NOW() NOT NULL ); CREATE TABLE IF NOT EXISTS achievement ( achievement_id IDENTITY NOT NULL PRIMARY KEY, program_id NUMERIC NOT NULL, practice_num NUMERIC NOT NULL, practice_set_num NUMERIC, practice_time TIMESTAMP DEFAULT NOW() NOT NULL, update_time TIMESTAMP DEFAULT NOW() NOT NULL ); |
設定の仕方によっては起動のたびに呼ばれるので重複エラーが起きないように
「CREATE TABLE IF NOT EXISTS 〜」としておくと良いです。
(記載されているテーブル名が存在しなければテーブルを作る、という意味です)
また「data.sql」という名前のファイルを上記と同じところに配置し、
中身にINSERT文を記載しておくことによって
起動時にデータを入れてくれるようになります。
1 2 3 4 5 6 7 8 9 10 | -- program INSERT INTO program(name, unit, programset) VALUES ('腹筋', '回', true); INSERT INTO program(name, unit, programset) VALUES ('背筋', '回', true); INSERT INTO program(name, unit, programset) VALUES ('ランニング', 'm', false); INSERT INTO program(name, unit, programset) VALUES ('てすと', 'テスト', false); -- achievement INSERT INTO achievement(program_id, practice_num, practice_set_num) VALUES (1, 30, 3); INSERT INTO achievement(program_id, practice_num, practice_set_num) VALUES (2, 30, 3); INSERT INTO achievement(program_id, practice_num) VALUES (3, 1500); |
上記テーブル設定についての注意点
では「ddl-auto」を有効にしつつ、「schema.sql」を設定した場合はどうなるでしょうか?
この場合で起動すると、「schema.sql」「data.sql」が実行されてテーブルとデータが出来るも、
そのあとに「ddl-auto」の機能で一度テーブルを消してから
@Entityの情報を読み取ってテーブルを作る、
といった動きになり、「schema.sql」「data.sql」は意味が無くなります。
ですので、用途に合わせてどのようにテーブルの準備するかは検討しておくと良いでしょう。
今回は schema.sql での実装
今回はSQLの勉強も兼ねて、「schema.sql」でテーブル準備をしたいと思います。
SQLの中身は上記の例で記載したとおり、「program」「achievement」の2テーブルを作成し、
「data.sql」に記載したデータを初期値として起動時に登録する形で進めます。
そのために今の「ddl-auto」の設定を「cleate」から「none」に書き換えて無効にします。
「ddl-auto」が有効の時の勉強も別途する予定なので、記述自体はひとまず残しておく方向です。
起動してh2コンソールでテーブルを確認する
では、上記の「schema.sql」「data.sql」を準備した状態で起動してみます。
起動後、h2コンソールを開きます。、データが入っていればOKです。

先に書いた通り、application.ymlに記載した情報を入力して、Connectボタンを押します。
画面が切り替わり左側のサイドメニューにtestdbのデータベース名があり、
「schema.sql」で記載したテーブル名があればOKです。
「data.sql」もあればそこで記載したレコードが反映されているか、
真ん中のテキストエリアにSQL文を書き込んで、「Run」ボタンを押して実行してみてください。
ひとまず、「SELECT * FROM PROGRAM」で、PROGRAMテーブルの中身を見てみます。
SQLの結果、正常にデータが表示されていればOKです。

さて、これで最低限のDBの準備が出来ました。
次からはこのDBを利用して、画面に表示したりデータの変更をしたりしていきたいと思います。
書いた人はこんな人
- 元ファストフード店長代理のJava系ITエンジニア。
Webサイト系の開発や運用をいくらか経験し、
現在はAndroidアプリ開発を主に担当したり。
休みの日はゲームとか風景写真撮りに行ったりとかマラソンしたりとか。
IT技術11月 17, 2023システム移行時のログメッセージ引き継ぎで経験したこと
IT技術12月 22, 2021【第2回】Spring bootで運動記録をDBに記録してみた(DB作成編)
IT技術11月 16, 2021【第1回】Spring bootで運動記録をDBに記録してみた(準備編)
IT技術6月 18, 2019Android 9(Pie)の電源周りとアラームについて