Spring Boot2.3,2.4で日記投稿ウェブアプリ入門の第3回です。アプリで使用するDBのテーブル構成を決めたり、エンティティクラスの作成、初期データdata.sqlの作成をやっていきます。そして最後に、SQLログとH2 Consoleで動作確認をします。Spring Bootの初心者・入門者の方は、参考にしてみてください。
前回は、SQLログ出力の設定とDBの接続設定をしました。DBはH2を使用し、SQLログ出力にはLog4jdbc-log4j2を使用する事にしました。
(第2回) DB(H2)の接続設定とSQLログ出力の設定【Spring Boot2で日記ウェブアプリ】
今回は、Spring Bootの日記ウェブアプリのDBのテーブル構成についての説明と、エンティティクラスの作成、初期データの作成、そしてアプリを起動して動作確認などをやっていきます。
◾️動作環境やバージョン情報です。
OS:macOS Catalina(バージョン10.15.5)
開発環境:Eclipse(Pleiades All in One、4.16(2020-06)、Java Full Edition版)
Spring Bootバージョン:2.3.3、2.4.0
Java:11
データベース:H2
今回作成するファイルを先に書いておきます。
今回新規に作成するファイルは「Diary.java」「data.sql」の2つです。
まず、日記投稿ウェブアプリで使うDBのテーブル構成についてです。とは言ってもシンプルなアプリなので、作成するテーブルは、投稿した日記本文をデータ保存するためのDiaryテーブル1つです。
そのDiaryテーブルの構成です。
フィールド名 | データ型 | 備考(制約とか) | |
---|---|---|---|
ID | id | integer | プライマリーキー |
日記本文 | bodytext | varchar(255) | not null |
投稿日時 | create_datetime | timestamp | not null |
Diaryテーブルはタイトルは無く日記本文だけで、日記本文は長文にならないように文字数制限をつけています。
日記というよりメモ書き・ツイートのようなシンプルさです。
次にDiaryテーブルを想定して、JavaのエンティティクラスDiary.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 = "diary") //指定しないと生成されるテーブルはクラス名と同じdiary
public class Diary {
public Diary(String bodytext, LocalDateTime createDatetime) {
this.bodytext = bodytext;
this.createDatetime = createDatetime;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(nullable = false)
private String bodytext;
//投稿日時
@Column(name = "create_datetime", nullable = false)
private LocalDateTime createDatetime;
}
まずDiaryクラスはエンティティクラスである事を示すために@Entityを付けています。
そして、テーブル設計に合わせて、id,bodytext,createDatetimeの3つのフィールドがあります。
idフィールドに付けている@Idは、エンティティの主キーを示しています。
また、@GeneratedValueは主キーが自動採番される事、strategy=GenerationType.IDENTITYは採番方法を示しています。
createDatetimeに付けている@Columnは、フィールドに対する設定や制約をしています。
「name = "create_datetime"」はテーブルにあるフィールド名を"create_datetime"に設定し、「nullable = false」はフィールドの値をnull禁止(not null)にしています。
@Columnを付けていないと、エンティティのフィールド名とテーブルのフィールド名は同じになります。
@Data、@NoArgsConstructor、@AllArgsConstructorは、Lombokのアノテーションです。
これらのLombokのアノテーションを付ける事によって、セッター・ゲッター・コンストラクタなどのコードをプログラマが書かなくても自動生成してくれるので便利です。
Eclipseの場合、アウトラインビューでクラスにあるフィールド、メソッド、コンストラクタの一覧が見れますので、ここでLombokによって自動生成されたメソッドやコンストラクタも確認できます。
また、エンティティクラス名と実際のDBのテーブル名を別にしたいなら、@Tableを使います。今回は同じ名称でいいので、@Tableは使っていません。
これでSpring Bootアプリを起動すると、起動時にエンティティクラスDiaryからdiaryテーブルが自動生成されます。
エンティティクラスからテーブルを自動生成してくれるのはSpring Data JPAの機能です。
もちろん設定によって、エンティティクラスからテーブルを自動生成せずに、テーブル生成のSQLファイル(DDL、schema.sql)を自分で用意してテーブルを作る事もできます。
どちらを選択するかは個人やプロジェクト毎の考え方や方針に寄ると思いますが、ここではエンティティクラスDiaryからdiaryテーブルを自動生成して開発を進めていきたいと思います。
DDLのschema.sqlファイルからDBのテーブル生成をするための方法や設定については別ページで説明していますので、そちらを参考にしてください。
(H2デーてベース入門 第7回) schema.sqlを使用してDBのテーブル作成【Spring Boot2】
エンティティクラスDiaryによってdiaryテーブルが準備できたので、今度はテスト的に初期データを作っておきたいと思います。
Spring Bootでは、プロジェクトのsrc/main/resourcesディレクトリ下にdata.sqlファイルを作成し、このファイルにDML(Data Manipulation Language)のSQLを書いておくと、アプリ起動時に自動でdata.sqlをロードして実行して初期データを作ってくれます。
それでは実際にdata.sqlファイルを作成します。
(*data.sqlファイルでコメントアウトしたい場合は、行頭に"--"を付けます)
INSERT INTO diary(bodytext, create_datetime) VALUES('今日は晴れ。コメント1', LOCALTIME());
INSERT INTO diary(bodytext, create_datetime) VALUES('comment 2', LOCALTIME());
INSERT INTO diary(bodytext, create_datetime) VALUES('こめんと3', LOCALTIME());
上で作成したエンティティクラスDiaryに合わせてsqlを作成しました。diaryテーブルに3レコード作成するsqlです。[広告] Kindle Unlimitedなら対象の本が定額で読み放題
対象本には、プログラミングなどのIT関連本、マンガ、雑誌、ビジネス書などがたくさんあります!
それではSpring Bootのアプリを起動して、動作確認をしてみます。
前回のページでは、DBの接続設定とLog4jdbc-log4j2でSQLログの出力設定をしましたので、確認しておきたい点は、エンティティクラスDiaryからdiaryテーブルが生成される事、初期データ生成のdata.sqlのSQLが実行されてデータが生成される事の2点です。
実際にできているかどうかは、Eclipseのコンソールビューに出力されるSQLのログとH2のブラウザ管理ツールH2 Consoleの2つで確認していきます。
それでは実際にアプリを起動して、起動時にコンソールビューに出力されたログの一部です。
[2m2020-10-25 19:58:48.894[0;39m [32m INFO[0;39m [35m85563[0;39m [2m---[0;39m [2m[ task-1][0;39m [36mjdbc.sqlonly [0;39m [2m:[0;39m drop table if exists diary CASCADE
[2m2020-10-25 19:58:48.900[0;39m [32m INFO[0;39m [35m85563[0;39m [2m---[0;39m [2m[ task-1][0;39m [36mjdbc.sqlonly [0;39m [2m:[0;39m create table diary (id integer generated by default as identity, bodytext varchar(255) not
null, create_datetime timestamp not null, primary key (id))
[2m2020-10-25 19:58:48.914[0;39m [32m INFO[0;39m [35m85563[0;39m [2m---[0;39m [2m[ task-1][0;39m [36mo.h.e.t.j.p.i.JtaPlatformInitiator [0;39m [2m:[0;39m HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
[2m2020-10-25 19:58:48.920[0;39m [32m INFO[0;39m [35m85563[0;39m [2m---[0;39m [2m[ task-1][0;39m [36mj.LocalContainerEntityManagerFactoryBean[0;39m [2m:[0;39m Initialized JPA EntityManagerFactory for persistence unit 'default'
[2m2020-10-25 19:58:48.924[0;39m [32m INFO[0;39m [35m85563[0;39m [2m---[0;39m [2m[ task-2][0;39m [36mjdbc.sqlonly [0;39m [2m:[0;39m INSERT INTO diary(bodytext, create_datetime) VALUES('今日は晴れ。コメント1', LOCALTIME())
[2m2020-10-25 19:58:48.932[0;39m [32m INFO[0;39m [35m85563[0;39m [2m---[0;39m [2m[ task-2][0;39m [36mjdbc.sqlonly [0;39m [2m:[0;39m INSERT INTO diary(bodytext, create_datetime) VALUES('comment 2', LOCALTIME())
[2m2020-10-25 19:58:48.932[0;39m [32m INFO[0;39m [35m85563[0;39m [2m---[0;39m [2m[ task-2][0;39m [36mjdbc.sqlonly [0;39m [2m:[0;39m INSERT INTO diary(bodytext, create_datetime) VALUES('こめんと3', LOCALTIME())
少し見づらいですが、まず最初の方で"create table diary・・・"というSQLがあり、diaryテーブルが生成されています。次に、H2の操作・管理ツールH2 Consoleで確認します。H2 ConsoleのURLは「http://localhost:8080/h2-console 」です。アクセスしたら下の画像のようなログイン画面が表示されるはずです。
(*初期表示画面は英語ですが、左上のボックスから日本語に変更できます。)
ログイン画面の各入力欄は、application.propertiesファイルで設定したDB接続設定と対応しています。
前回のページで、DB接続設定をapplication.propertiesに書きましたので、ログイン画面の各入力欄には以下のように入力して接続ボタンを押せばログインできるはずです。
ドライバクラス | net.sf.log4jdbc.sql.jdbcapi.DriverSpy |
JDBC URL | jdbc:log4jdbc:h2:mem:diarydb |
ユーザ名 | |
パスワード |
ログインすると、下のようなH2 Consoleの管理画面が表示されます。ここで、Spring BootアプリのDBにあるテーブルやテーブル内のデータが確認できます。
管理画面を見ると、左サイドバーからDIARYテーブルができている事がわかります。
そして、そのDIARYテーブルを選択すると全件取得のselect sqlがSQL入力欄に表示され、実行ボタンを押すとSQLの全件取得結果が表示されているのがわかります。
この出力結果は、上で書いたコンソールビューの実行されたSQLログと一致するので、これも期待した通りの結果です。
ちなみにH2 Consoleで実行ボタンを押した後にコンソールビューを確認すると、selectクエリとその結果がログ出力されている事がわかります。
2020-10-25 20:34:55.108 INFO 85563 --- [nio-8080-exec-7] jdbc.sqlonly : SELECT * FROM DIARY
2020-10-25 20:34:55.116 INFO 85563 --- [nio-8080-exec-7] jdbc.resultsettable :
|---|------------|--------------------|
|id |bodytext |create_datetime |
|---|------------|--------------------|
|1 |今日は晴れ。コメント1 |2020-10-25 19:58:49 |
|2 |comment 2 |2020-10-25 19:58:49 |
|3 |こめんと3 |2020-10-25 19:58:49 |
|---|------------|--------------------|
コンソールビューでのselectクエリの結果表示が必要ないのなら、前回のページでも説明しましたが、application.propertiesファイルで"logging.level.jdbc.resultsettable=off"にすればできます。
H2 ConsoleではDBのデータの確認だけでなく、insertやdeleteなどのSQLを実行してデータ生成や削除もできで便利ですので色々と試してみてください。
以上今回は、Spring Bootの日記投稿ウェブアプリのDBのテーブル構成についての説明や、Diaryエンティティクラスの作成、初期データdata.sqlの作成、そしてアプリを起動してSQLログとH2 Consoleの動作確認などをしてきました。
SQLログとH2 ConsoleでのDB管理・操作は、Spring Bootアプリを開発する時のプログラマの大きな手助けになると思います。
そして次回ですが、今回でdiaryテーブルができたので、dairyテーブルのCRUD操作をするためにリポジトリインタフェースを開発していきます。
(第4回) テーブルのCRUD操作のためにリポジトリインタフェースの作成【Spring Boot2で日記ウェブアプリ】
Spring Bootの日記投稿ウェブアプリ開発入門トップ