ほげほげ

foooooooooobaaaaaaaaaaaaaaaar

JPAメモ

JPAとは

Java Persistence API のこと。
RDBへのアクセスを行うためのフレームワークで、データの永続化の機能を提供する。
対象のオブジェクトを保存するとそのオブジェクトがそのままDBに保存される。
裏側ではDBアクセスが行われているが、あまり意識しなくて良くなる。
複雑なクエリーが勝手に裏で発行されていることもあるので要注意

エンティティクラス

DBのテーブルと関連づけられるクラスのこと。
JPAでDBのレコードを扱う際にエンティティと呼ばれるクラスを定義して使用する。

エンティティクラスで使用するアノテーション

javax.persistenceパッケージを使用する
こちらがわかりやすい:http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0870/APR4/EU260052.HTM

区分 アノテーション 概要 使用方法
エンティティ @Entity クラスがエンティティであることを示す クラス名に付与
カラム @Column テーブルのカラムとエンティティクラスのプロパティを関連づける @Column(table = "person", name = "name")
カラム @JoinColumn 結合内容を示す。nameでどのカラムで結合するのか指定できる @JoinColumn(name = "test")
ID関連 @Id そのエンティティのPKであることを示す PKとなるプロパティに付与
ID関連 @GeneratedValue PKのプロパティに併せて指定する。PKを自動生成する(生成方法は複数ある) PKとなるプロパティに付与 @GeneratedValue(strategy = GenerationType.|AUTO|IDENTITY| SEQUENCE|TABLE)
リレーション @ManyToOne 多対一の関連を示す プロパティに付与
リレーション @OneToMany 一対多の関連を示す。マップ対象のテーブルをmappedByで示す プロパティに付与 @OneToMany(mappedBy = "department")

f:id:notempty:20220313225021p:plain

テーブルのマッピングは双方のエンティティクラスで行う双方向と片側で行う単方向のマッピングがある
※単方向だと検索が複雑になるため双方向を推奨

簡単なCRUD操作

インタフェース JpaRepository の実装クラスを作成する

public interface 名前 extends JpaRepository <エンティティ , ID>

IDには基本型を指定するのではなくラッパーを指定すること(Longとか) 実装クラスにはリポジトリであることを示す@Repositoryを付与すること。
インタフェースには簡単なクエリーが実装されており(select * とかinsert intoとか)、以下で確認できる
https://spring.pleiades.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html
UNIONとかJOINとかの複雑なクエリーを実行したい際は実装する必要がある

ThymeLeafの式・タグ

thymeleafの式

式の名前 概要 使い方
"@{パス}" リンクURL式 リンク先を指定する th:src="@{/webjars/bootstrap/js/bootstrap.bundle.min.js}"
"${変数}" 変数式 変数を指定する th:object="${invoice}"
"*{変数}" 選択変数式 *{オブジェクトのフィールド名}として使用する。th:objectタグ内でオブジェクト名が省略できるようになり、選択変数式を使用しない場合は${object名.フィールド名}となる th:field="*{name}"
"#{メッセージ}" メッセージ式 src/main/resources/messages.propertiesに記載したテキストを取り込む th:text="#{phoneNumber}"

タグ

タグ 概要 使い方
th:text 変数を表示する th:text="${変数名}"
th:action formでのpost先をパスで指定する th:action="@{/パス}"
th:object そのフォームにバインドするオブジェクトを指定する th:object="${オブジェクト名}"
th:field inputタグのid/name/valueをまとめてHTMLに出力する th:field="${変数名}"/ "*{オブジェクトのプロパティ名}" etc…
th:value inputタグなどでHTMLのvalueだけ値を設定したい時に使用する th:value="${変数名}"
th:href/th:src 参照先をリンクURL式で指定する th:href/th:src="@{/webjars/bootstrap/js/bootstrap.bundle.min.js}"
th:each ループを回して処理する th:each="comment:${comments}" とすると${comments}から1件ずつ取り出してcomment変数に格納する
th:errors エラー時に表示するエラーメッセージを指定する th:errors="${変数名}"/"*{オブジェクトのプロパティ名}" etc…
th:errorclass バリデーションエラーなどがある場合にタグのclassにスタイルを追加する。エラーのチェック結果はth:fieldもしくはname属性から取得するため、これらと一緒に使う必要がある(じゃないとどこのプロパティのエラーチェックなの?がわからないため) th:errorclass="スタイル"

その他

要素 概要 使い方
${変数} インライン(文中に埋め込み)処理。th:textと同じく値を表示できる ${test}