Lagrede prosedyrer med dvalemodus

1. Oversikt

Lagrede prosedyrer er sett med kompilerte SQL-setninger bosatt i databasen. De brukes til å kapsle inn og dele logikk med andre programmer, og dra nytte av databasespesifikke funksjoner som indekshint eller spesifikke nøkkelord.

Denne artikkelen viser hvordan du bruker Dvalemodus å kalle en lagret prosedyre i en MySQL-database.

2. Lagrede prosedyrer i MySQL

Før vi diskuterer hvordan vi skal kalle en lagret prosedyre fra dvalemodus, må vi lage den.

For dette raske MySQL-eksemplet oppretter vi en lagret prosedyre for å få alle postene fra en foo bord.

For å lage en lagret prosedyre bruker vi LAG PROSEDYRE uttalelse:

DELIMITER // OPPRETT PROSEDYRE GetAllFoos () SPRÅK SQL DETERMINISTISK SQL SIKKERHET DEFINERER BEGYNN VELG * FRA foo; SLUTT // DELIMITER;

Før BEGYNNE uttalelse, kan vi definere valgfrie utsagn. Du kan gå ned i detaljene i disse uttalelsene ved å følge den offisielle MySQL-dokumentasjonskoblingen.

Vi kan bruke ANROP uttalelse for å sikre at prosedyren vår oppfører seg på ønsket måte:

RING GetAllFoos ();

Nå som vi har vår lagrede prosedyre i gang, la oss hoppe rett til hvordan vi kaller det fra dvalemodus.

3. Ring en lagret prosedyre med dvalemodus

Fra og fra dvalemodus 3 har vi muligheten til å bruke rå SQL-setninger inkludert lagrede prosedyrer for å spørre om en database.

I denne delen skal vi gå gjennom et tilsynelatende grunnleggende eksempel som vil illustrere hvordan man kan kalle GetAllFoos () prosedyren ved bruk av dvalemodus.

3.1. Konfigurasjon

Før vi begynner å skrive kode som kan kjøre, må vi ha konfigurert dvalemodus i prosjektet vårt.

Og selvfølgelig for alt dette - Maven-avhengighetene, MySQL-konfigurasjonen, dvalemodus-konfigurasjonen og SessionFactory instantiering - du kan sjekke ut Hibernate-artikkelen.

3.2. Ring en lagret prosedyre ved hjelp av CreateNativeSQL Metode

Dvalemodus gjør det mulig å uttrykke spørsmål i innfødt SQL formatere direkte. Derfor kan vi enkelt lage et eget SQL-spørsmål, og bruke ANROP uttalelse å kalle getAllFoos () lagret prosedyre:

Query query = session.createSQLQuery ("CALL GetAllFoos ()"). AddEntity (Foo.class); Liste allFoos = query.list (); 

Spørringen ovenfor returnerer en liste der hvert element er et Foo object.

Vi bruker addEntity () metode for å få objektobjekter fra den opprinnelige SQL spørring, ellers, a ClassCastException kastes når en lagret prosedyre returnerer en ikke-rå verdi.

3.3. Ring en lagret prosedyre ved hjelp av @NamedNativeQueries

En annen måte å ringe til en lagret prosedyre er å bruke @NamedNativeQueries kommentar.

@NamedNativeQueries brukes til å spesifisere en rekke innfødte SQL navngitte spørsmål rettet til utholdenhetsenheten:

@NamedNativeQueries ({@NamedNativeQuery (name = "callGetAllFoos", query = "CALL GetAllFoos ()", resultClass = Foo.class)}) @Entity offentlig klasse Foo implementerer Serializable {// Modelldefinisjon}

Hvert navngitte spørsmål har åpenbart en Navn attributt, selve SQL-spørring, og resultatKlassesom refererer til Foo kartlagt enhet.

Query query = session.getNamedQuery ("callGetAllFoos"); Liste allFoos = query.list ();

De resultatKlasseattributt spiller samme rolle som addEntity () metoden i vårt forrige eksempel.

Begge disse tilnærmingene kan brukes om hverandre, da det ikke er noen reelle forskjeller mellom de to når det gjelder ytelse eller produktivitet.

3.4. Ring en lagret prosedyre ved hjelp av @NamedStoredProcedureQuery

Hvis du bruker JPA 2.1 og Dvalemodus gjennomføring av EntityManagerFactoryog EntityManager.

De @NamedStoredProcedureQuery merknader kan brukes til å erklære en lagret prosedyre:

@NamedStoredProcedureQuery (name = "GetAllFoos", procedureName = "GetAllFoos", resultClasses = {Foo.class}) @Entity offentlig klasse Foo implementerer Serializable {// Model Definition} 

For å ringe vårt navngitte lagrede prosedyrespørsmål, må vi ha startet et EntityManager, og ring deretter createNamedStoredProcedureQuery () metode for å lage prosedyren:

StoredProcedureQuery spQuery = entityManager.createNamedStoredProcedureQuery ("getAllFoos"); 

Vi kan få direkte listen over Fooenheter ved å ringe henrette() metode på StoredProcedureQuerygjenstand.

4. Lagrede prosedyrer med parametere

Nesten alle våre lagrede prosedyrer krever parametere. I denne delen skal vi vise hvordan du kan ringe til en lagret prosedyre med parametere fra Dvalemodus.

La oss lage en getFoosByName () lagret prosedyre i MySQL.

Denne prosedyren returnerer en liste over Foo objekter der navnattributtet samsvarer med fooName parameter:

DELIMITER // OPPRETT PROSEDYRE GetFoosByName (IN fooName VARCHAR (255)) SPRÅK SQL DETERMINISTISK SQL SIKKERHETS DEFINER BEGYNN VELG * FRA foo HVOR navn = fooName; SLUTT // DELIMITER;

Å ringe GetFoosByName ()prosedyre vil vi bruke navngitte parametere:

Query query = session.createSQLQuery ("CALL GetFoosByName (: fooName)") .addEntity (Foo.class) .setParameter ("fooName", "New Foo");

Tilsvarende den nevnte parameteren : fooName kan brukes med @NamedNativeQuery kommentar:

@NamedNativeQuery (name = "callGetFoosByName", spørring = "CALL GetFoosByName (: fooName)", resultClass = Foo.class)

Den navngitte spørringen vil bli kalt som følger:

Query query = session.getNamedQuery ("callGetFoosByName") .setParameter ("fooName", "New Foo");

Når du bruker @NamedStoredProcedureQuery merknad, kan vi spesifisere parametere ved hjelp av @StoredProcedureParameter kommentar:

@NamedStoredProcedureQuery (name = "GetFoosByName", procedureName = "GetFoosByName", resultClasses = {Foo.class}, parameters = {@StoredProcedureParameter (name = "fooName", type = String.class, mode = ParameterMode.IN)}) 

Vi kan benytte oss av registerStoredProcedureParameter () metode for å kalle vår lagrede prosedyre med fooName parameter:

StoredProcedureQuery spQuery = entityManager. createNamedStoredProcedureQuery ("GetFoosByName") .registerStoredProcedureParameter ("New Foo", String.class, ParameterMode.IN);

5. Konklusjon

Denne artikkelen demonstrert hvordan du bruker dvalemodus til å ringe en lagret prosedyre i en MySQL-database ved hjelp av forskjellige tilnærminger.

Det er verdt å nevne det ikke alle RDBMS støtter lagrede prosedyrer.

Du kan sjekke eksemplene i denne artikkelen i det tilknyttede GitHub-prosjektet.


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