1. Обзор
Хранимая процедура-это группа предопределенных инструкций SQL, хранящихся в базе данных. В Java существует несколько способов доступа к хранимым процедурам. В этом руководстве мы покажем, как вызывать хранимые процедуры из репозиториев Spring Data JPA.
2. Настройка проекта
В этом уроке мы будем использовать модуль Spring Boot Starter Data JPA в качестве уровня доступа к данным . Мы также будем использовать MySQL в качестве нашей внутренней базы данных. Поэтому нам понадобятся Spring Data JPA , Spring Data JDBC и MySQL Connector зависимости в вашем проекте pom.xml файл:
org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-data-jdbc mysql mysql-connector-java
Как только у нас будет определение зависимости MySQL, мы сможем настроить соединение с базой данных в файле application.properties :
spring.datasource.url=jdbc:mysql://localhost:3306/baeldung spring.datasource.username=baeldung spring.datasource.password=baeldung
3. Класс сущности
В Spring Data JPA entity представляет таблицу, хранящуюся в базе данных. Поэтому мы можем построить класс сущностей для отображения таблицы базы данных 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{ // ... }
Затем давайте добавим в наш репозиторий некоторые методы, вызывающие хранимые процедуры.
5.1. Прямое сопоставление Имени хранимой процедуры
Мы можем определить метод хранимой процедуры, используя @Процедура аннотирование и отображение имени хранимой процедуры напрямую.
Есть четыре эквивалентных способа сделать это. Например, мы можем использовать имя хранимой процедуры непосредственно в качестве имени метода:
@Procedure int GET_TOTAL_CARS_BY_MODEL(String model);
Если мы хотим определить другое имя метода, мы можем поместить имя хранимой процедуры в качестве элемента аннотации @Procedure :
@Procedure("GET_TOTAL_CARS_BY_MODEL") int getTotalCarsByModel(String model);
Мы также можем использовать Имя процедуры атрибут для сопоставления имени хранимой процедуры:
@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. Ссылка на хранимую процедуру, определенную в Entity
Мы также можем использовать @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) ListfindCarsAfterYear(@Param("year_in") Integer year_in);
В этом методе мы используем собственный запрос для вызова хранимой процедуры. Мы сохраняем запрос в атрибуте value аннотации.
Аналогично, мы используем @Param для сопоставления входного параметра хранимой процедуры. Кроме того, мы сопоставляем выходные данные хранимой процедуры со списком объектов entity Car .
6. Резюме
В этом руководстве мы показали, как получить доступ к хранимым процедурам через репозитории JPA. Кроме того, мы обсудили два простых способа ссылки на хранимые процедуры в репозиториях JPA.
Как всегда, исходный код статьи доступен на GitHub .