נהלים מאוחסנים במצב שינה

1. סקירה כללית

נהלים מאוחסנים הם קבוצות של משפטים SQL מורכבים השוכן במאגר. הם משמשים לתמצית ולשיתוף לוגיקה עם תוכניות אחרות, וליהנות מתכונות ספציפיות למסדי נתונים כמו רמזים לאינדקס או מילות מפתח ספציפיות.

מאמר זה מדגים כיצד להשתמש שינה לקרוא א נוהל מאוחסן ב מסד נתונים של MySQL.

2. נהלים מאוחסנים ב- MySQL

לפני שנדון כיצד לקרוא להליך מאוחסן מ- Hibernate, עלינו ליצור אותו.

עבור דוגמה מהירה זו של MySQL, ניצור נוהל מאוחסן כדי לקבל את כל הרשומות מ- foo שולחן.

כדי ליצור נוהל מאוחסן, אנו משתמשים ב- צור נוהל הַצהָרָה:

מפריד // צור נוהל GetAllFoos () שפה SQL דטרמינלי SQL אבטחת מגדיר בחר התחל * מ foo; END // DELIMITER;

לפני ה התחל הצהרה, אנו יכולים להגדיר הצהרות אופציונליות. תוכל לעיין בפרטי הצהרות אלה על ידי קישור לתיעוד הרשמי של MySQL.

אנחנו יכולים להשתמש ב- שִׂיחָה הצהרה כדי לוודא שהנוהל שלנו מתנהג בצורה הרצויה:

התקשר GetAllFoos ();

כעת, לאחר שהנוהל המאוחסן שלנו פועל, בואו נקפוץ ישר כיצד לקרוא לו ממצב שינה.

3. התקשר להליך מאוחסן עם מצב שינה

החל מ- Hibernate 3, יש לנו אפשרות להשתמש בהצהרת SQL גולמית כולל נהלים מאוחסנים לשאילתת מסד נתונים.

בחלק זה אנו הולכים לעבור על דוגמה בסיסית לכאורה שתמחיש כיצד לקרוא ל GetAllFoos () הליך באמצעות שינה.

3.1. תְצוּרָה

לפני שנתחיל לכתוב קוד שיכול לרוץ, עלינו להגדיר את מצב שינה במצב הפרויקט שלנו.

וכמובן לכל זה - התלות של Maven, תצורת MySQL, תצורת מצב שינה ו- SessionFactory מיידיות - אתה יכול לבדוק את המאמר שינה.

3.2. התקשר להליך מאוחסן באמצעות CreateNativeSQL שיטה

מצב שינה מאפשר להביע שאילתות ב SQL מקורי פורמט ישירות. לכן, אנו יכולים ליצור ישר שאילתת SQL מקומית ולהשתמש ב- שִׂיחָה הצהרה להתקשר ל getAllFoos () נוהל מאוחסן:

שאילתת שאילתות = session.createSQLQuery ("CALL GetAllFoos ()"). AddEntity (Foo.class); רשימת allFoos = query.list (); 

השאילתה לעיל מחזירה רשימה שבה כל אלמנט הוא a פו אוbject.

אנו משתמשים ב- addEntity () שיטה להשיג אובייקטים של ישויות מהמקור SQL שאילתה, אחרת, א ClassCastException יושלך בכל פעם שהליך מאוחסן מחזיר ערך שאינו גולמי.

3.3. התקשר להליך מאוחסן באמצעות @NamedNativeQueries

דרך נוספת להתקשר להליך מאוחסן היא להשתמש ב- @NamedNativeQueries ביאור.

@NamedNativeQueries משמש לציון מערך של הילידים SQL שאילתות בשם הוקף ליחידת ההתמדה:

@NamedNativeQueries ({@NamedNativeQuery (name = "callGetAllFoos", query = "CALL GetAllFoos ()", resultClass = Foo.class)}) @Entity class בכיתה Foo מיישמת ניתן להתבצע באמצעות Serial {// הגדרת מודל}

לכל שאילתה בשם יש ללא ספק א שֵׁם התכונה, בפועל שאילתת SQL, וה resultClassהמתייחס ל פו ישות ממופה.

שאילתת שאילתה = session.getNamedQuery ("callGetAllFoos"); רשימת allFoos = query.list ();

ה resultClassתכונה ממלאת את אותו תפקיד כמו addEntity () השיטה בדוגמה הקודמת שלנו.

ניתן להשתמש בשתי הגישות הללו להחלפה, מכיוון שאין הבדלים אמיתיים בין השניים בכל הנוגע לביצועים או לפרודוקטיביות.

3.4. התקשר להליך מאוחסן באמצעות @NamedStoredProcedureQuery

אם אתה משתמש JPA 2.1 וה שינה יישום ה- EntityManagerFactoryו EntityManager.

ה @NamedStoredProcedureQuery ניתן להשתמש בהערה כדי להכריז על הליך מאוחסן:

@NamedStoredProcedureQuery (name = "GetAllFoos", procedureName = "GetAllFoos", resultClasses = {Foo.class}) @Entity בכיתה הציבורית Foo מיישמת ניתן להתבצע באמצעות סידור {// הגדרת המודל} 

כדי להתקשר לשאילתת הפרוצדורה המאוחסנת בשם שלנו, עלינו להתקין EntityManager, ואז להתקשר ל createNamedStoredProcedureQuery () שיטה ליצירת ההליך:

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

אנחנו יכולים לקבל ישירות את רשימת פוישויות על ידי קריאה ל לבצע() שיטה ב StoredProcedureQueryלְהִתְנַגֵד.

4. נהלים מאוחסנים עם פרמטרים

כמעט כל ההליכים המאוחסנים שלנו דורשים פרמטרים. בחלק זה, אנו מתכוונים להראות כיצד להתקשר להליך מאוחסן עם פרמטרים מ- שינה.

בואו ניצור getFoosByName () הליך מאוחסן ב MySQL.

הליך זה מחזיר רשימה של פו אובייקטים שהמאפיין שם תואם ל fooName פָּרָמֶטֶר:

מפריד // צור נוהל GetFoosByName (IN fooName VARCHAR (255)) שפה SQL DETERMINISTIC SQL מגדיר אבטחה התחל בחר * מ foo שם שם = fooName; סיום // מפריד;

להתקשר ל GetFoosByName ()בהליך נשתמש בפרמטרים בשם:

שאילתת שאילתה = session.createSQLQuery ("CALL GetFoosByName (: fooName)") .addEntity (Foo.class) .setParameter ("fooName", "Foo New");

באופן דומה, הפרמטר שמו : fooName יכול לשמש עם @NamedNativeQuery ביאור:

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

השאילתה הנקראת תיקרא כך:

שאילתת שאילתה = session.getNamedQuery ("callGetFoosByName") .setParameter ("fooName", "Foo חדש");

בעת השימוש ב- @NamedStoredProcedureQuery ביאור, אנו יכולים לציין פרמטרים באמצעות ה- @StoredProcedureParameter ביאור:

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

אנחנו יכולים לעשות שימוש ב- registerStoredProcedureParameter () שיטה לקרוא לנוהל המאוחסן שלנו באמצעות fooName פָּרָמֶטֶר:

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

5. מסקנה

מאמר זה הוכיח כיצד להשתמש במצב שינה כדי לקרוא להליך מאוחסן במסד נתונים של MySQL תוך שימוש בגישות שונות.

ראוי להזכיר זאת לא כל RDBMS תומכים בהליכים המאוחסנים.

אתה יכול לבדוק את הדוגמאות המופיעות במאמר זה בפרויקט GitHub המקושר.


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