Lagrede procedurer med dvale

1. Oversigt

Lagrede procedurer er sæt kompilerede SQL-sætninger bosiddende i databasen. De bruges til at indkapsle og dele logik med andre programmer og drage fordel af databasespecifikke funktioner som indeks tip eller specifikke nøgleord.

Denne artikel viser, hvordan man bruger Dvale at kalde en gemt procedure i en MySQL-database.

2. Gemte procedurer i MySQL

Før vi diskuterer, hvordan man kalder en lagret procedure fra dvale, skal vi oprette den.

Til dette hurtige MySQL-eksempel opretter vi en lagret procedure for at hente alle poster fra en foo bord.

For at oprette en lagret procedure bruger vi OPRET PROCEDURE udmelding:

DELIMITER // Opret PROCEDURE GetAllFoos () SPROG SQL DETERMINISTISK SQL SIKKERHED DEFINER BEGIN SELECT * FRA foo; SLUT // DELIMITER;

Før BEGYNDE erklæring, kan vi definere valgfri udsagn. Du kan se nærmere på detaljerne i disse udsagn ved at følge det officielle MySQL-dokumentationslink.

Vi kan bruge OPKALD erklæring for at sikre, at vores procedure opfører sig på den ønskede måde:

OPKALD GetAllFoos ();

Nu hvor vi har vores lagrede procedure i gang, lad os springe direkte til, hvordan vi kalder det fra dvale.

3. Ring til en lagret procedure med dvale

Fra og fra dvale 3 har vi muligheden for at bruge rå SQL-sætning inklusive lagrede procedurer til at forespørge en database.

I dette afsnit skal vi gennemgå et tilsyneladende grundlæggende eksempel, der illustrerer, hvordan man kalder GetAllFoos () procedure ved hjælp af dvale.

3.1. Konfiguration

Før vi begynder at skrive kode, der kan køre, skal vi have konfigureret Dvaletilstand i vores projekt.

Og selvfølgelig for alt dette - Maven-afhængigheder, MySQL-konfiguration, dvale-konfiguration og SessionFactory instantiering - du kan tjekke dvale-artiklen.

3.2. Ring til en lagret procedure ved hjælp af OpretNativeSQL Metode

Dvaletilstand giver mulighed for at udtrykke forespørgsler i indfødt SQL formatere direkte. Derfor kan vi lige oprette en oprindelig SQL-forespørgsel og bruge OPKALD erklæring at kalde getAllFoos () lagret procedure:

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

Ovenstående forespørgsel returnerer en liste, hvor hvert element er et Foo object.

Vi bruger addEntity () metode til at hente enhedsobjekter fra den oprindelige SQL forespørgsel, ellers en ClassCastException kastes, når en gemt procedure returnerer en ikke-rå værdi.

3.3. Ring til en lagret procedure ved hjælp af @NamedNativeQueries

En anden måde at kalde en gemt procedure på er at bruge @NamedNativeQueries kommentar.

@NamedNativeQueries bruges til at specificere en matrix af native SQL navngivne forespørgsler afgrænset til vedholdenhedsenheden:

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

Hver navngivet forespørgsel har tydeligvis en navn attribut, den faktiske SQL-forespørgsel, og resultatKlasseder henviser til Foo kortlagt enhed.

Forespørgsel = session.getNamedQuery ("callGetAllFoos"); Liste allFoos = query.list ();

Det resultatKlasseattribut spiller den samme rolle som addEntity () metode i vores tidligere eksempel.

Begge disse tilgange kan bruges om hverandre, da der ikke er nogen reelle forskelle mellem de to, når det kommer til ydeevne eller produktivitet.

3.4. Ring til en lagret procedure ved hjælp af @NamedStoredProcedureQuery

Hvis du bruger JPA 2.1 og Dvale gennemførelse af EntityManagerFactoryog EntityManager.

Det @NamedStoredProcedureQuery annotering kan bruges til at erklære en lagret procedure:

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

For at ringe til vores navngivne lagrede procedureforespørgsel skal vi have instanteret en EntityManager, og ring derefter til createNamedStoredProcedureQuery () metode til at oprette proceduren:

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

Vi kan direkte få listen over Fooenheder ved at kalde udføre () metode til StoredProcedureQueryobjekt.

4. Gemte procedurer med parametre

Næsten alle vores lagrede procedurer kræver parametre. I dette afsnit skal vi vise, hvordan man kalder en lagret procedure med parametre fra Dvale.

Lad os oprette en getFoosByName () gemt procedure i MySQL.

Denne procedure returnerer en liste over Foo objekter, hvor navnattributten matcher fooName parameter:

DELIMITER // Opret PROCEDURE GetFoosByName (I fooName VARCHAR (255)) SPROG SQL DETERMINISTISK SQL SIKKERHEDSDEFINERER BEGYND VÆLG * FRA foo HVOR navn = fooName; SLUT // DELIMITER;

At ringe til GetFoosByName ()procedure bruger vi navngivne parametre:

Forespørgsel = session.createSQLQuery ("CALL GetFoosByName (: fooName)") .addEntity (Foo.class) .setParameter ("fooName", "New Foo");

Tilsvarende er den navngivne parameter : fooName kan bruges med @NamedNativeQuery kommentar:

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

Den navngivne forespørgsel kaldes som følger:

Forespørgsel = session.getNamedQuery ("callGetFoosByName") .setParameter ("fooName", "New Foo");

Når du bruger @NamedStoredProcedureQuery kommentar, kan vi specificere parametre ved hjælp af @StoredProcedureParameter kommentar:

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

Vi kan gøre brug af registerStoredProcedureParameter () metode til at kalde vores lagrede procedure med fooName parameter:

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

5. Konklusion

Denne artikel demonstreret hvordan man bruger dvale til at kalde en lagret procedure i en MySQL-database ved hjælp af forskellige tilgange.

Det er værd at nævne det ikke alle RDBMS understøtter lagrede procedurer.

Du kan tjekke eksemplerne i denne artikel i det sammenkædede GitHub-projekt.


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