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);
}