CrudRepository, JpaRepository ו- Paging AndSortingRepository בנתוני האביב

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

במאמר מהיר זה נתמקד בסוגים שונים של ממשקי מאגר נתונים של Spring Data ובפונקציונליות שלהם. ניגע ב:

  • מאגר Crud
  • PagingAndSortingRepository
  • מאגר Jpa

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

2. מאגרי נתונים באביב

נתחיל במאגר JpaRepository - שמתארך PagingAndSortingRepository ובתורו, מאגר Crud.

כל אחד מאלה מגדיר את הפונקציונליות שלו:

  • מאגר Crud מספק פונקציות CRUD
  • PagingAndSortingRepository מספק שיטות לעשות עימוד ולמיין רשומות
  • מאגר Jpa מספק שיטות הקשורות ל- JPA כגון שטיפת הקשר ההתמדה ומחיקת רשומות באצווה

וכך, בגלל יחסי ירושה אלה, ה מאגר Jpa מכיל את ה- API המלא של מאגר Crud ו PagingAndSortingRepository.

כאשר איננו זקוקים לפונקציונליות המלאה המסופקת על ידי מאגר Jpa ו PagingAndSortingRepositoryאנחנו יכולים פשוט להשתמש ב- מאגר Crud.

בואו נסתכל על דוגמה מהירה כדי להבין טוב יותר את ממשקי ה- API הללו.

נתחיל בפשטות מוצר יֵשׁוּת:

מוצר מחלקה ציבורית @Entity {@ Id מזהה פרטי פרטי; שם מחרוזת פרטי; // גטרים וקובעים}

ובוא נבצע פעולה פשוטה - מצא a מוצר על סמך שמו:

ממשק ציבורי @Repository ProductRepository מרחיב את JpaRepository {Product findByName (String productName); }

זה הכל. מאגר הנתונים של Spring ייצור אוטומטית את היישום בהתבסס על השם שסיפקנו לו.

זו הייתה דוגמה מאוד פשוטה כמובן; אתה יכול להעמיק יותר ב- Spring Data JPA כאן.

3. מאגר Crud

בואו נסתכל על הקוד של ה- מאגר Crud מִמְשָׁק:

ממשק ציבורי CrudRepository מרחיב מאגר {S save (S entity); T findOne (ID primaryKey); Iterable findAll (); ספירה ארוכה (); מחיקה בטלה (ישות T); בוליאני קיים (ID primaryKey); }

שימו לב לפונקציונליות ה- CRUD האופיינית:

  • שמור (...) - שave an ניתן לנידון של ישויות. כאן נוכל להעביר מספר עצמים כדי לשמור אותם באצווה
  • findOne (...) - קבל ישות אחת המבוססת על ערך המפתח הראשי שעבר
  • מצא הכל() קבל ניתן לנידון של כל הגופים הזמינים במסד הנתונים
  • ספירה () - rמשוב את ספירת סך היישויות בטבלה
  • לִמְחוֹק(…) - מחק ישות על בסיס האובייקט שעבר
  • קיים (...) - ודא אם ישות קיימת על בסיס ערך המפתח הראשי שעבר

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

4. PagingAndSortingRepository

עכשיו, בואו נסתכל על ממשק מאגר אחר, שמתארך מאגר Crud:

ממשק ציבורי PagingAndSortingRepository מרחיב את CrudRepository {Iterable findAll (Sort sort); עמוד findAll (Pageable pageable); }

ממשק זה מספק שיטה findAll (Pageable pageable), שהוא המפתח ליישום דִפּוּף.

כשמשתמש תומכי, אנו יוצרים a תומכי אובייקט עם מאפיינים מסוימים ועלינו לציין לפחות:

  1. גודל עמוד
  2. מספר העמוד הנוכחי
  3. מִיוּן

אז נניח שאנחנו רוצים להציג את העמוד הראשון של קבוצת התוצאות ממוינת לפי שם משפחה, עולה, עם לא יותר מחמישה רשומות כל אחד. כך נוכל להשיג זאת באמצעות א PageRequest ו סוג הַגדָרָה:

Sort sort = new Sort (סדר חדש. Sort (Direction.ASC, "שם משפחה")); Pageable pageable = PageRequest חדש (0, 5, מיין);

העברת האובייקט הניתן לתיק לשאילתת נתוני האביב תחזיר את התוצאות המדוברות (הפרמטר הראשון של PageRequest הוא מבוסס אפס).

5. מאגר Jpa

לבסוף, נסתכל על ה- מאגר Jpa מִמְשָׁק:

ממשק ציבורי JpaRepository מרחיב את PagingAndSortingRepository {List findAll (); רשימה findAll (מיין מיין); שמור רשימות (ישויות ניתנות לנידון) סומק ריק (); T saveAndFlush (ישות T); בטל deleteInBatch (ישויות ניתנות לניתנים לניתנים לשינוי); }

שוב, בואו נסתכל בקצרה על כל אחת משיטות אלה:

  • מצא הכל() - לקבל רשימה של כל הגופים הזמינים במסד הנתונים
  • מצא הכל(…) - לקבל רשימה של כל הגופים הזמינים ומיין אותם לפי התנאי שסופק
  • שמור (...) - שave an ניתן לנידון של ישויות. כאן נוכל להעביר מספר עצמים כדי לשמור אותם באצווה
  • סומק () - fשופע את כל המשימות הממתינות למסד הנתונים
  • saveAndFlush (...) - שמור את הישות ושטוף שינויים באופן מיידי
  • deleteInBatch (...) - מחק ניתן לנידון של ישויות. כאן נוכל להעביר מספר עצמים למחיקתם באצווה

ברור שהממשק מעל מתרחב PagingAndSortingRepository כלומר יש לו את כל השיטות הקיימות ב מאגר Crud גם כן.

6. חסרונות של מאגרי נתונים באביב

מעבר לכל היתרונות השימושיים מאוד של מאגרים אלה, ישנם כמה חסרונות בסיסיים של ישירות בהתאם גם לאלה:

  1. אנו מצמידים את הקוד שלנו לספרייה ולהפשטות הספציפיות שלה, כגון 'עמוד' או 'דף'; זה כמובן לא ייחודי לספרייה זו - אך עלינו להיזהר לא לחשוף את פרטי היישום הפנימיים הללו
  2. על ידי הרחבת למשל מאגר Crud, אנו חושפים סט שלם של שיטת התמדה בבת אחת. זה כנראה בסדר גם ברוב הנסיבות, אך אנו עלולים להיתקל במצבים שבהם נרצה להשיג שליטה דקה יותר בשיטות שנחשפו, למשל. ליצור ReadOnlyRepository זה לא כולל את לשמור(…) ו לִמְחוֹק(…) שיטות של מאגר Crud

7. מסקנה

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

למידע נוסף, עיין בסדרה בנושא התמדה באביב.