エンティティのCRUD

6.7 エンティティのCRUD

ここまでの書籍管理アプリケーション作成を通して、書籍データの一覧表示(Read)、書籍データの新規登録(Create)は理解できたと思います。ただ、他にも既にあるデータを更新(Update)したり削除(Delete)したりする処理も必要となります。ここでは、実際のアプリケーションは作成しませんが、各機能のポイントとなる処理を押さえておきましょう。

6.7.1 CRUDとは

データベースアクセスの基本は、「Create」「Read」「Update」「Delete」の4つの操作です。これらは各イニシャルをつないで、一般に「CRUD」と呼ばれます。Spring Bootでは、これら基本的なCRUD処理についてはこれまで同様に簡単に実装することが可能となっています。

6.7.2 更新(Update)

既に保存してあるデータの更新処理ですね。これは、データの新規登録(Create)と似ていますが、実際の処理は少し違ってきます。まず、既に登録されているデータを取り出す方法を考えないといけませんし、その内容を更新するのはどうするのかも理解しないといけません。引き続き書籍管理アプリケーションを題材に考えていきましょう。

■登録済みの書籍データを1件取り出すには
1件の書籍データを取り出すにはどうしたらよいでしょうか?そうです、キーとなる値「ISBN」でエンティティを検索して取り出してあげる必要があります。
複雑な検索条件を指定する方法については第8章でご説明しますが、数個の単純な検索条件程度であればとても簡単に実装することができます。これにはリポジトリを使います。

■ソースコード
【ファイル名:BookRepository.java】 ※記述例のため、実際に記述する必要はありません。

以上、空だったインターフェースに、「findByIsbn」というメソッドを追記しただけです。この「findByIsbn」が、ISBN番号を引数にしてBookインスタンスを取り出すメソッドです。
ただし、ここでは戻り値に「Optional」というクラスを指定しています。このため、import java.util.Optional; も追記しておく必要があります。

取得したエンティティをビューに渡す例としては、下記のようになります。

■登録済みの書籍データを更新するには
更新もとても簡単で、新規登録と同じようにsaveAndFlushを行うだけです。データの保存は、すべてこのメソッドでOKなのです。ただ一つ、新規登録と更新の違いは、「引数のエンティティに、キーとなる値が指定されているかどうか」という点です。
つまり、saveAndFlushでエンティティを保存する際、既に同じキー値(今回はISBN)を持つエンティティが存在すると、その内容を更新して保存します。そうでない場合は、新しいエンティティとして新規登録されるのです。そのため、まだ重複エラー処理実装していない現在の状態であれば、「書籍登録」画面から既に存在するISBNで登録してみると、同じデータが更新されるはずです。

■findByIsbnはどこで実装されている?
すらすらと更新処理について説明をしてきましたが、よく考えると一つだけ、腑に落ちない点があるのに気付いたでしょうか。それは、ISBNでエンティティを検索する「findByIsbn」メソッドです。このメソッド、BookRepositoryインターフェースにメソッドの宣言を書いただけで、実際に行うべき処理はまったく書いていないのです。

なぜ、メソッドが実装されていないのにちゃんと動いているのか?それこそが、リポジトリの最大の利点です。リポジトリは、メソッド名を元にエンティティ検索の処理を自動生成するようになっているのです。
例えば「findByIsbn」メソッドは、引数の値をISBNに持つエンティティを検索する処理が自動生成されて使えるようになっていたのです。この仕組みについては、改めて説明しますが、そんなわけで「リポジトリは、メソッドの宣言を書くだけで具体的な処理は実装する必要が無い」という点はしっかりと覚えておきましょう。

6.7.3 削除(Delete)

最後に、エンティティの削除についてです。削除は、単純に指定のキー値などをクエリーテキストで送ってそのまま消してしまうような実装もできますが、削除するデータの内容を確認するなどの処理を考えると、エンティティの更新と同じやり方をするのがよいでしょう。

■登録済みの書籍データを削除するには
これもとても簡単で、「deleteById」メソッドを実行するだけです。
指定したISBN(1001)を条件にエンティティを削除する例としては、下記のようになります。

この「deleteById」メソッドについても、「saveAndFlush」と同じJpaRepositoryに用意されています。先ほどの「findByIsbn」のようにBookRepositoryインターフェースにメソッドの宣言を書く必要はありません。削除条件とするプライマリーキー名については、エンティティに設定した「@Id」アノテーションが参照されるため、改めて指定する必要がないのです。


NEXT>> 6.8 リポジトリのメソッド自動生成について