Opkald til lagrede procedurer fra Spring Data JPA Repositories

1. Oversigt

En lagret procedure er en gruppe af foruddefinerede SQL-sætninger, der er gemt i databasen. I Java er der flere måder at få adgang til lagrede procedurer. I denne vejledning viser vi, hvordan man kalder lagrede procedurer fra Spring Data JPA Repositories.

2. Opsætning af projekt

I denne vejledning vi bruger Spring Boot Starter Data JPA-modulet som dataadgangslaget. Vi bruger også MySQL som vores backend-database. Derfor har vi brug for Spring Data JPA, Spring Data JDBC og MySQL Connector afhængigheder i vores projekt pom.xml fil:

 org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-data-jdbc mysql mysql-connector-java 

Når vi har MySQL-afhængighedsdefinitionen, kan vi konfigurere databaseforbindelsen i application.properties fil:

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

3. Enhedsklasse

I Spring Data JPA repræsenterer en enhed en tabel, der er gemt i en database. Derfor kan vi konstruere en enhedsklasse til at kortlægge bil databasetabel:

@Entity public class Car {@Id @GeneratedValue (strategi = GenerationType.IDENTITY) @Column privat langt id; @Kolonne privat strengmodel; @Kolonne privat helår; // standard getters og setter}

4. Oprettelse af lagret procedure

En lagret procedure kan have parametre så vi kan få forskellige resultater baseret på input. For eksempel kan vi oprette en lagret procedure, der tager en inputparameter af heltalstype og returnerer en liste over biler:

OPRET PROCEDURE FIND_CARS_AFTER_YEAR (IN year_in INT) BEGIN SELECT * FRA bil HVOR year> = year_in ORDER BY year; ENDE

En lagret procedure kan også bruge outputparametre til at returnere data til opkaldsapplikationerne. For eksempel kan vi oprette en lagret procedure, der tager en inputparameter af strengtype og gemmer forespørgselsresultatet i en outputparameter:

Opret 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; ENDE

5. Reference lagrede procedurer i arkivet

I Spring Data JPA er opbevaringssteder, hvor vi leverer databasefunktioner. Derfor kan vi konstruere et lager til databasens operationer på Bil enhed og reference lagrede procedurer i dette lager:

@Repository offentlig grænseflade CarRepository udvider JpaRepository {// ...} 

Lad os derefter tilføje nogle metoder til vores lager, der kalder lagrede procedurer.

5.1. Kortlæg et lagret procedurenavn direkte

Vi kan definere en lagret fremgangsmåde ved hjælp af @Procedure annotering og kortlægge det gemte procedure navn direkte.

Der er fire ækvivalente måder at gøre det på. For eksempel kan vi bruge det lagrede procedure navn direkte som metodens navn:

@Procedure int GET_TOTAL_CARS_BY_MODEL (strengmodel); 

Hvis vi ønsker at definere et andet metodenavn, kan vi sætte det lagrede procedurenavn som elementet i @Procedure kommentar:

@Procedure ("GET_TOTAL_CARS_BY_MODEL") int getTotalCarsByModel (strengmodel); 

Vi kan også bruge procedure Navn attribut til kortlægning af det lagrede procedurens navn:

@Procedure (procedureName = "GET_TOTAL_CARS_BY_MODEL") int getTotalCarsByModelProcedureName (strengmodel); 

På samme måde kan vi bruge værdi attribut til kortlægning af det lagrede procedure navn:

@Procedure (værdi = "GET_TOTAL_CARS_BY_MODEL") int getTotalCarsByModelValue (strengmodel); 

5.2. Henvis til en lagret procedure defineret i enheden

Vi kan også bruge @NamedStoredProcedureQuery kommentar til at definere en lagret procedure i enhedsklassen:

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

Derefter kan vi henvise til denne definition i arkivet:

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

Vi bruger navn attribut til reference den lagrede procedure defineret i enhedsklassen. Til arkivmetoden bruger vi @Param for at matche inputparameteren for den lagrede procedure. Vi matcher også outputparameteren for den lagrede procedure til returværdien af ​​arkivmetoden.

5.3. Henvis en lagret procedure med @Forespørgsel Kommentar

Vi kan også ringe til en lagret procedure direkte med @Forespørgsel kommentar:

@Query (værdi = "OPKALD FIND_CARS_AFTER_YEAR (: year_in);", nativeQuery = true) Liste findCarsAfterYear (@Param ("year_in") Heltal år_in);

I denne metode bruger vi en indfødt forespørgsel til at kalde den lagrede procedure. Vi gemmer forespørgslen i værdi kommentarens attribut.

På samme måde bruger vi @Param for at matche inputparameteren for den lagrede procedure. Vi kortlægger også den lagrede procedureoutput til listen over enheder Bil genstande.

6. Resume

I denne vejledning viste vi, hvordan du får adgang til lagrede procedurer gennem JPA-arkiver. Vi diskuterede også to enkle måder at henvise til de lagrede procedurer i JPA-arkiver.

Som altid er kildekoden til artiklen tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found