Spring Data JPAによるDBアクセスについて勉強しました。
- JPAはJava標準のO/Rマッパーに関する仕様。
- 実装ライブラリとしてHibernateやEclipseLinkが有名。
JPAの特徴
- Javaオブジェクトとデータベースに格納されているデータとのマッピング機能
- データベースへのCRUD処理をカプセル化したAPI
- Javaオブジェクトを検索するためのクエリ言語(JPQL)
Spring Data JPAはJPAを用いたプログラミングをより簡単にするために開発されている。これを使用するためにはpom.xmlをつぎのように設定します。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies>
追加されるライブラリを実行すると確認できます。
$ mvn dependency:tree
JPAのエンティティクラス作成例
Customer.javaを次のように作成
package com.example.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.*; @Entity @Table(name = "customers") @Data @NoArgsConstructor @AllArgsConstructor public class Customer { @Id @GeneratedValue private Integer id; @Column(nullable = false) private String firstName; @Column(nullable = false) private String lastName; }
@Entityを宣言するとJPAのエンティティであることを宣言できます
@Tableでテーブル名が宣言できます。(デフォルトはクラス名=テーブル名)
エンティティの主キーになるものに@Idを付ける
@CoumnでDBカラムに対する名前や制約を設定できます。
CustomerRepository.javaを次のように作成
package com.example.repository; import com.example.domain.Customer; import org.springframework.data.jpa.repository.JpaRepository; public interface CustomerRepository extends JpaRepository<Customer, Integer> { }
JpaReposiotryにはCRULD操作のための基本的なメソッドが定義されています。
JPQLでクエリの定義
CustomerRepositoryにクエリを定義
package com.example.repository; import com.example.domain.Customer; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import java.util.List; public interface CustomerRepository extends JpaRepository<Customer, Integer> { @Query("SELECT x FROM Customer x ORDER BY x.firstName, x.lastName") List<Customer> findAllOrderByName(); }
Spring Dataのページング処理
JpaRepositoryにページング処理を行うためのメソッドが用意されています。これにより1ページあたりN件のデータを取得したときにN件目のデータを取得するといったことが可能になっているみたいです。
App.java
@Override public void run(String... strings) throws Exception { // データ追加 Customer created = customerRepository.save(new Customer(null, "Sugio", "Deki")); System.out.println(created + " is created!"); // ページング処理 Pageable pageable = new PageRequest(0, 3); Page<Customer> page = customerRepository.findAll(pageable); System.out.println("1ページのデータ数=" + page.getSize()); System.out.println("現在のページ=" + page.getNumber()); System.out.println("全ページ数=" + page.getTotalPages()); System.out.println("全データ数=" + page.getTotalElements()); page.getContent().forEach(System.out::println); }