Spring Data JPAを使ってテーブルにアクセスする
Spring Data JPAでは、図3のようにテーブルに相当するEntityクラスとそのテーブルにアクセスするためのRepositoryクラスを用いてデータの管理を行います。
ただし、プログラマはRepositoryクラスの実装ではなくインターフェースの定義だけを行います。
Entityクラスを作成する
テーブルに相当するEntityクラスを作成します。リスト6は、サンプルアプリケーションで住所録を管理するためのcontactテーブルに相当するクラスです。
import javax.persistence.*; @Entity // (1) @Table(name = "contact") // (2)テーブル指定 public class ContactModel { @Id // (3)IDを指定する @GeneratedValue // (4)自動生成される値 private Integer id; // (5)各フィールドを定義する @Column(name = "zip", nullable = false) private String zip; @Column(name = "address", nullable = false) private String address; @Column(name = "name", nullable = false) private String name; @Column(name = "tel", nullable = false) private String tel; : (以下省略 setter/getterを定義する) }
(1)では、指定したクラスがEntityクラスであることを示すアノテーションを指定します。(2)では対応するテーブル名を指定します。クラス名と同じテーブル名であれば省略可能ですが、筆者は必ず明示的に指定するようにしています。
(3)は、指定したフィールドが主キーであることを示します。(4)は、主キーの値が自動生成される値であることを示しています。
また、(5)ではカラムであることを指定します。指定できる項目には主に表6のような項目があります。
属性キー | 説明 |
---|---|
name | カラム名を指定。省略した場合には変数名と同じと見なされる |
unique | ユニーク属性が必要な場合にはtrueを設定する。デフォルトはfalse |
nullable | NULL値であることが許されるかどうかの指定。NULL値が許されない場合にはfalseにする。デフォルトはtrue |
length | 文字列の場合に、文字列長をいくつにするのかの指定。デフォルトは255 |
columnDefinition | カラム定義を手動にて場合に指定する。この指定を利用するのであれば、前述したschema.sqlなどを使うことを検討した方が良いと思われる |
insertable | NSERT時にカラムとして含むかどうかの指定。デフォルトはtrue |
updatable | UPDATE時にカラムとして含むかどうかの指定。デフォルトはtrue |
また、Javaで指定したフィールドの型はテーブル上の型に自動的にマッピングされます。そのマッピングはHibernate ORMのドキュメントを見ると詳しくわかります。
EntityクラスにアクセスするためのRepositoryインターフェースを定義する
Entityクラスに相当するテーブルデータの取得や追加・保存・削除などは、JpaRepositoryインターフェースを継承することで行います。
今回のサンプルアプリケーションでは基本的なCRUD(Create/Read/Update/Delete)操作のみのため、リスト7のように、具体的なコードは何も実装する必要はありません。
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository // (1) // (2) 扱うEntityクラスと主キーの型を指定 public interface ContactRepository extends JpaRepository<ContactModel,Integer> { }
(1)では、このインターフェースがJPAに置けるRepositoryであることを指定します。また、JpaRepositoryを継承する際には(2)のように扱うEntityクラスであるContactModelクラスとそのクラスの主キーの方であるIntegerを指定します。
データの取得
作成したContactRepositoryを使ってデータを取得する場合にはfindById、findOneやfindAllといったメソッドを利用します。リスト8はこれらの利用例です。
// (省略) public class ContactController { // (省略) // (1)Repositoryインスタンスを取得する @Autowired ContactRepository contactRepository; // (省略) @GetMapping("/item/{id}") public Response itemAction(@PathVariable("id") String id){ : (省略) // (2)主キーを指定した値の取得 Optional<ContactModel> model = contactRepository.findById(rid); : (省略) } : (省略) @GetMapping("/list") public Response listAction(){ // (3)全件データの取得 List<ContactModel> list = contactRepository.findAll(); return Response.createSuccessResponse(list); } }
(1)ではContactRepositoryを取得します。また、(2)で主キーを使った取得メソッドであるfindByIdを使ってデータを取得します。
また、すべてのデータを取得するには、(3)のようにfindAllメソッドで取得できます。
データの追加・更新・削除
データの登録と更新は、いずれもsaveもしくはsaveAndFlushメソッドにて行います。また、削除はdeleteもしくは、deleteByIdメソッドなどを利用します。
リスト9はデータの登録と更新、削除を行うコード例です。
public Response addAction(@RequestBody(required = false) ContactModel item){ // (1)データの登録 contactRepository.save(item); return Response.createSuccessResponse(item); } // : (省略) public Response updateAction(@PathVariable("id") String id,@RequestBody(required = false) ContactModel item){ // (2)更新対象の取得 Optional<ContactModel> model = contactRepository.findById(rid); // : (省略) ContactModel updateModel = model.get(); updateModel.setZip(item.getZip()); updateModel.setAddress(item.getAddress()); updateModel.setName(item.getName()); updateModel.setTel(item.getTel()); // (3)更新 contactRepository.save(updateModel); } // : (省略) public Response deleteAction(@PathVariable("id") String id){ Optional<ContactModel> model = contactRepository.findById(rid); // : (省略) // (4)削除 contactRepository.delete(model.get()); }
(1)ではJSON形式から自動的にContactModelオブジェクトに変換したデータを用いてデータを登録しています。
この際、IDが指定されていないことから、自動的にsaveメソッドがデータ登録を行います。また更新では、(2)のようにIDを指定しオブジェクトを指定し、それぞれの変更データを設定し、(3)のsaveメソッドで更新を行います。
オブジェクトにいはIDが指定されていることから自動的にデータは更新されます。また、(4)のようにdeleteメソッドで削除可能です。
ここで説明した以外にもデータ数を取得するcountメソッドやその他のメソッドもありますので、JpaRepositoryのJavaDocを参照してみてください。
最後に
Spring Bootでのデータベース操作についても、前回同様、今回だけでは紹介しきれない内容がまだまだたくさんあります。
プログラム部分ではSpring Data JPAを用いた簡単なデータ操作のみについて紹介しましたが、トランザクションを使った操作や、特定の条件を指定した場合のデータ取得など実際の利用時にまだ多くのことを理解する必要があります。
ただし、これらは、Spring Bootというよりは個別のプロジェクトの内容になるため、本稿では詳しく紹介しません。JPAについて詳しく知りたい方は、その他のブログ、書籍やSpring Data JPAのリファレンスドキュメントなども併せてご覧ください。
参考資料
- Spring
- Spring フレームワークのリファレンスドキュメント
- Spring Bootのリファレンスドキュメント
- Spring Bootのソースコード
- Spring Data JPAのリファレンスドキュメント
- HikariCPのリファレンス
- Hibernate ORM
本連載の書籍が発売されました!
Javaによる高速Webアプリケーション開発のためのSpring Boot入門
著者:WINGSプロジェクト 小林昌弘
発売日:2020年5月31日(水)
価格(POD):2,200円(税込)
価格(電書):1,760円(税込)