Извикване на съхранени процедури от пролетните хранилища на JPA

1. Общ преглед

Съхранената процедура е група от предварително дефинирани SQL изрази, съхранявани в базата данни. В Java има няколко начина за достъп до съхранени процедури. В този урок ще покажем как да извикате съхранени процедури от Spring Data JPA Repositories.

2. Настройка на проекта

В този урок ще използваме JPA модула Spring Boot Starter Data като слой за достъп до данни . Също така ще използваме 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 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 и директно да картографираме името на съхранената процедура.

Има четири еквивалентни начина за това. Например можем да използваме името на съхранената процедура директно като име на метод:

@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 Annotation

Също така можем да извикаме съхранена процедура директно с анотацията @Query :

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

В този метод използваме собствена заявка, за да извикаме съхранената процедура. Съхраняваме заявката в атрибута стойност на анотацията.

По същия начин използваме @Param, за да съответства на входния параметър на съхранената процедура. Също така, ние съпоставяме изхода на съхранената процедура със списъка на обектите Car .

6. Обобщение

В този урок показахме как да осъществим достъп до съхранени процедури чрез JPA хранилища. Също така обсъдихме два прости начина за препращане към съхранените процедури в JPA хранилищата.

Както винаги, изходният код на статията е достъпен в GitHub.