1. 概要

ストアドプロシージャは、データベースに格納されている事前定義されたSQLステートメントのグループです。 Javaでは、ストアドプロシージャにアクセスする方法がいくつかあります。 このチュートリアルでは、SpringデータJPAリポジトリからストアドプロシージャを呼び出す方法を学習します。

2. プロジェクトの設定

データアクセス層としてSpring BootスターターデータJPAモジュールを使用します。 また、バックエンドデータベースとしてMySQLを使用します。 したがって、プロジェクト pom.xml [には、 Spring Data JPA Spring Data JDBC 、および MySQLConnectorの依存関係が必要です。 X143X]ファイル:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

MySQL依存関係の定義ができたら、application.propertiesファイルでデータベース接続を構成できます。

spring.datasource.url=jdbc:mysql://localhost:3306/baeldung
spring.datasource.username=baeldung
spring.datasource.password=baeldung

3. エンティティクラス

Spring Data JPAでは、エンティティはデータベースに格納されているテーブルを表します。したがって、carデータベーステーブルをマップするエンティティクラスを構築できます。

@Entity
public class Car {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private long id;

    @Column
    private String model;

    @Column
    private Integer year;

   // standard getters and setters
}

4. ストアドプロシージャの作成

ストアドプロシージャはパラメータを持つことができるため、入力に基づいて異なる結果を得ることができます。 たとえば、整数型の入力パラメータを受け取り、車のリストを返すストアドプロシージャを作成できます。

CREATE PROCEDURE FIND_CARS_AFTER_YEAR(IN year_in INT)
BEGIN 
    SELECT * FROM car WHERE year >= year_in ORDER BY year;
END

ストアドプロシージャは、出力パラメータを使用して、データを呼び出し元のアプリケーションに返すこともできます。 たとえば、文字列タイプの入力パラメータを受け取り、クエリ結果を出力パラメータに格納するストアドプロシージャを作成できます。

CREATE PROCEDURE GET_TOTAL_CARS_BY_MODEL(IN model_in VARCHAR(50), OUT count_out INT)
BEGIN
    SELECT COUNT(*) into count_out from car WHERE model = model_in;
END

5. リポジトリ内の参照ストアドプロシージャ

Spring Data JPAでは、リポジトリはデータベース操作を提供する場所です。 Car エンティティでデータベース操作用のリポジトリを構築し、このリポジトリ内のストアドプロシージャを参照できます。

@Repository
public interface CarRepository extends JpaRepository<Car, Integer> {
    // ...
}

次に、ストアドプロシージャを呼び出すいくつかのメソッドをリポジトリに追加しましょう。

5.1. ストアドプロシージャ名を直接マップする

@Procedure アノテーションを使用してストアドプロシージャメソッドを定義し、ストアドプロシージャ名を直接マップできます。

これを行うには、4つの同等の方法があります。 たとえば、ストアドプロシージャ名をメソッド名として直接使用できます。

@Procedure
int GET_TOTAL_CARS_BY_MODEL(String model);

別のメソッド名を定義する場合は、ストアドプロシージャ名を@Procedureアノテーションの要素として指定できます。

@Procedure("GET_TOTAL_CARS_BY_MODEL")
int getTotalCarsByModel(String model);

procedureName 属性を使用して、ストアドプロシージャ名をマップすることもできます。

@Procedure(procedureName = "GET_TOTAL_CARS_BY_MODEL")
int getTotalCarsByModelProcedureName(String model);

最後に、 value 属性を使用して、ストアドプロシージャ名をマップできます。

@Procedure(value = "GET_TOTAL_CARS_BY_MODEL")
int getTotalCarsByModelValue(String model);

5.2. エンティティで定義されたストアドプロシージャを参照する

@NamedStoredProcedureQuery アノテーションを使用して、エンティティクラスにストアドプロシージャを定義することもできます。

@Entity
@NamedStoredProcedureQuery(name = "Car.getTotalCardsbyModelEntity", 
  procedureName = "GET_TOTAL_CARS_BY_MODEL", parameters = {
    @StoredProcedureParameter(mode = ParameterMode.IN, name = "model_in", type = String.class),
    @StoredProcedureParameter(mode = ParameterMode.OUT, name = "count_out", type = Integer.class)})
public class Car {
    // class definition
}

次に、リポジトリでこの定義を参照できます。

@Procedure(name = "Car.getTotalCardsbyModelEntity")
int getTotalCarsByModelEntiy(@Param("model_in") String model);

name属性を使用して、エンティティクラスで定義されたストアドプロシージャを参照します。リポジトリメソッドの場合、@Paramを使用してストアドプロシージャの入力パラメータを照合します。 また、ストアドプロシージャの出力パラメータをリポジトリメソッドの戻り値と照合します。

5.3. @Queryアノテーションを使用してストアドプロシージャを参照する

@Query アノテーションを使用して、ストアドプロシージャを直接呼び出すこともできます。

@Query(value = "CALL FIND_CARS_AFTER_YEAR(:year_in);", nativeQuery = true)
List<Car> findCarsAfterYear(@Param("year_in") Integer year_in);

このメソッドでは、ネイティブクエリを使用してストアドプロシージャを呼び出します。 アノテーションのvalue属性にクエリを保存します。

同様に、 @Param を使用して、ストアドプロシージャの入力パラメータを照合します。 また、ストアドプロシージャの出力をエンティティCarオブジェクトのリストにマップします。

6. 概要

この記事では、JPAリポジトリを介してストアドプロシージャにアクセスする方法について説明しました。 また、JPAリポジトリのストアドプロシージャを参照する2つの簡単な方法についても説明しました。

いつものように、記事のソースコードはGitHubから入手できます。