1. Spring Data JPAの統合
Spring Boot はスターター spring-boot-starter-data-jpa を提供します。プロジェクトで JPA を使用するにはスターターを追加するだけです。次のステップごとに、Spring Data JPA を統合するために必要な構成を示します。
ステップ 01 JPA 依存関係を追加します。
まず、新しい Spring Boot プロジェクトを作成し、JPA 関連の依存関係をプロジェクトの pom.xml に追加します。具体的なコードは次のとおりです。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
上記の例では、spring-boot-starter-data-jpa の参照に加えて、MySQL ドライバー mysql-connector-java にも依存する必要があります。
ステップ 02設定ファイルを追加します。
application.properties でデータ ソースと JPA の基本的な関連プロパティを構成します。具体的なコードは次のとおりです。
spring.datasource.url=jdbc:mysql://Localhost:3306/ceshi?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#JPA配置
spring.jpa.properties.hibernate.hbm2ddl.auto=create
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
#SQL输出
spring.jpa.show-sql=true
#format 下SQL输出
spring.jpa.properties.hibernate.format_sql=true
上記のパラメータのうち、主にデータベース接続と JPA プロパティを設定するためのものです。以下では、JPA の 4 つの構成の分析に焦点を当てます。
1) spring.jpa.properties.hibernate.hbm2ddl.auto: この構成は、データベース テーブル構造を維持するためにエンティティ クラスの特定の動作を構成するためによく使用されます。サービスの初回起動時にはデータベースに対応するテーブルが生成され、その後サービスを起動する際、エンティティクラスに属性が追加されていれば、データに対応するフィールドが追加され、元のデータが復元されます。まだ存在します。
- update: エンティティ クラスの属性が変更されると、それに応じてテーブル構造が更新されることを示す一般的に使用される属性。
- create: 起動時に最後に生成されたテーブルを削除し、エンティティ クラスに基づいてテーブルを再生成することを意味します。以前のテーブルのデータはクリアされます。
- create-drop: 起動時にエンティティ クラスに基づいてテーブルが生成されますが、sessionFactory が閉じられるとテーブルが削除されることを示します。
- validate: 起動時にエンティティ クラスとデータ テーブルが一致しているかどうかを検証することを示します。
- none: 何もしません。
2) spring.jpa.show-sql: デバッグを容易にするために、動作中に Hibernate が実際の SQL ステートメントをコンソールに出力することを示します。
3) spring.jpa.properties.hibernate.format_sql: 表示しやすいようにフォーマットされた出力 JSON 文字列を表します。
4) spring.jpa.properties.hibernate.dialect: テーブル名を生成するストレージ エンジンを InnoDB として指定します。
ステップ03エンティティクラスを追加します。
まず、エンティティ クラスであり、データベース内のテーブル構造を定義するクラスである User エンティティ クラスを作成します。サンプル コードは次のとおりです。
@Entity
@Table(name= "Users")
public class User {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private Long id;
@Column(length = 64)
private String name;
@Column(length = 64)
private String password;
private int age;
public User() {
}
public User(String name,String password, int age) {
this.name=name;
this.password=password;
this.age=age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
上記の例では、@Table アノテーションを使用してデータベース内のテーブルをマップし、@Column アノテーションを使用してデータベース内のフィールドをマップします。具体的な手順は次のとおりです。
1) @Entity: このクラスがデータベース テーブルに対応することを示す必須のアノテーション。
2) @Table: オプションのアノテーション。テーブル名、インデックス情報など、データベース エンティティに対応するテーブル情報を宣言します。ここでは、このエンティティクラスに対応するテーブル名が Users であることが宣言されています。指定しない場合、テーブル名とエンティティ名は一貫性を保ち、 @Entity アノテーションと組み合わせて使用されます。
3) @Id アノテーション: エンティティの一意の識別子に対応する属性を宣言します。
4) @Column アノテーション: エンティティ属性を宣言するために使用されるテーブル フィールドの定義。デフォルト エンティティの各属性はテーブル内のフィールドに対応し、フィールド名はデフォルトで属性名と一致します。フィールドのタイプは、エンティティ属性のタイプに自動的に対応します。ここでは主に文字フィールドの長さを宣言しますが、このように宣言されていない場合、システムはフィールドの長さとして 255 を使用します。
5) @GeneratedValue アノテーション: データベースの主キーの自動生成ルールを設定します。Strategy 属性には 4 つの値があります。
- AUTO: 主キーはプログラムによって制御され、デフォルトのオプションです。
- IDENTITY: 主キーはデータベースによって自動的に生成されます。つまり、データベース ID は自動的に増分されます。Oracle はこの方法をサポートしていません。
- SEQUENCE: データベースのシーケンスを通じて主キーを生成し、@SequenceGenerator アノテーションを通じてシーケンス名を指定します。MySQL はこの方法をサポートしていません。
- テーブル: 特定のデータベース テーブルを通じて主キーを生成する この戦略を使用すると、アプリケーションをデータベースに簡単に移行できます。
エンティティのアノテーションには、上記で使用した @Entity アノテーション、@Table アノテーションなどの他に、一般的に使用されるものがいくつかあり、具体的な説明を表 9-1 に示します。これらのアノテーションは、エンティティオブジェクトとデータベースフィールドの対応を記述するために使用されますが、JPA と MyBatis では相違点があるため、混同しないように注意してください。
ステップ 04テスト検証。
以上でJPAを統合するための設定は完了です、設定完了後、プロジェクトを起動すると図のような内容がログに出力されます。
図からわかるように、システムは起動後に自動的にデータベースに接続し、データ テーブル構造を作成し、実行された SQL ステートメントを出力します。データベースを確認すると、データベース内の対応する Users テーブルも正常に作成されていることがわかります。これは、プロジェクトが JPA を正常に統合し、エンティティ テーブルを作成したことを示しています。
2. JPaRepository の概要
JpaRepository は Spring Data JPA の非常に重要なクラスです。Spring Data の統合データ アクセス インターフェイスであるRepositoryを継承し、追加、削除、変更、クエリなどの完全なデータ操作メソッドを実装します。JpaRepositoryでは30以上のデフォルトメソッドが用意されており、プロジェクト内のデータベース操作機能を基本的に満たすことができます。
JpaRepository は、Spring Data JPA テクノロジーを実装してデータベースにアクセスするための重要なインターフェイスです。JpaRepository は PagingAndSortingRepository インターフェースを継承し、PagingAndSortingRepository インターフェースは CrudRepository インターフェースを継承します。CrudRepository および Repository インターフェイスは Spring Data の下部にある共通インターフェイスであり、ほぼすべてのデータベース インターフェイス メソッドを定義し、データ アクセス操作を統合します。
さらに、JPA は、カスタム クエリ、カスタム SQL、名前付きクエリ、その他のデータ クエリ メソッドを含む、非常に完全なデータ クエリ関数を提供します。
3. 実戦:人事情報管理モジュールの実装
JpaRespository は、追加、削除、変更、確認などの完全なデータ操作をデフォルトで実装します。リポジトリ データ アクセス インターフェイスを定義し、JpaRepository クラスを継承するだけです。以下に、以前に作成した User クラスとテーブルを使用して、ユーザーの追加、削除、変更、確認の機能を実装するユーザー管理モジュールの実装を示します。
1. リポジトリの定義
UserRepositoryインタフェースを作成し、@Repositoryアノテーションを付与し、JpaRepositoryクラスを継承することで、コードを記述することなく人事情報管理モジュールのすべての機能を実現できます。具体的なサンプルコードは以下の通りです。
@Repository
public interface UserRepository extends JpaRepository<Users, Long> {
}
UserRepository にはメソッドが定義されていませんが、JpaRepository を継承すると、当然のことながら JpaRepository 内のすべてのメソッドが定義されていることがわかります。
2. 新規追加、変更、削除、クエリの実装
(1) 新規
次に、UserRepositoryTests 単体テスト クラスを作成し、ユーザーの新しいテスト メソッドを実装します。サンプルコードは次のとおりです。
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTest {
@Resource
private UserRepository userRepository;
@Test
public void testSave() {
User user = new User("ysxq","123456",40);
userRepository.save(user);
}
}
上記の例では、UserRepository オブジェクトが UserRepositoryTests 単体テスト クラスに挿入され、JpaRespository で事前に生成された save() メソッドを使用して人事データを保存する機能が実装されています。以下に示すように:
(2) 修正
変更と追加の両方に save() メソッドを使用し、データ エンティティを渡すだけです。JPA は主キー ID に基づいてユーザーデータを自動的に変更します。サンプルコードは次のとおりです。
@Test
public void testUpdate() {
User user = userRepository.findById(1L).get();
user.setPassword("z123456");
userRepository.save(user);
}
(3) 削除
削除も非常に簡単で、JpaRespositoryがあらかじめ生成しているdelete()メソッドを使用しますが、オブジェクトを直接削除することもできますし、deleteByXXXメソッドを使用することもできます。サンプルコードは次のとおりです。
@Test
public void testDetle() {
User user = new User("ysxq","123456",40);
userRepository.delete(user);
}
(4) お問い合わせ
JPA はデータ クエリを完全にサポートしています。事前に生成された findById()、findAll()、findOne() などのメソッドがあり、カスタマイズされた単純なクエリを使用したり、SQL クエリをカスタマイズしたりすることもできます。サンプルコードは次のとおりです。
@Test
public void testSelect() {
userRepository.findById(1L);
}
3. 検証試験
[テストの実行] をクリックするか、メソッドを右クリックして [Run 'UserRepositoryTest'] コマンドを選択して、すべてのテスト メソッドを実行します。結果は図に示すとおりです。
結果は、人事情報の追加、削除、変更、クエリの単体テストがすべて正常に実行され、対応するクエリ結果が出力され、JPAを利用して人事情報管理機能が実装されていることがわかります。