מדריך לאובייקטים של Java
1. סקירה כללית
אובייקט הנתונים של Java הוא ממשק API המיועד לעמידה של נתונים מונחי אובייקטים לכל בסיס נתונים ולספק שפת שאילתות ידידותית למשתמש באמצעות התחביר של Java.
במאמר זה, אנו הולכים לראות כיצד להשתמש בממשק ה- API של JDO לצורך התעקשות האובייקטים שלנו במסד נתונים.
2. Maven תלות והתקנה
אנו נשתמש ב- DataNucleus JDO API המעודכן ומציע תמיכה מלאה ב- API של JDO 3.2.
בואו נוסיף את התלות הבאה שלנו pom.xml קוֹבֶץ:
org.datanucleus javax.jdo 3.2.0-m6 org.datanucleus datanucleus-core 5.1.0-m2 org.datanucleus datanucleus-api-jdo 5.1.0-m2 org. -xml 5.0.0-release
הגרסאות האחרונות של התלות נמצאות כאן: javax.jdo, datanucleus-core, datanucleus-api-jdo, datanucleus-rdbms ו- datanucleus-xml.
3. מודל
אנו הולכים לשמור את הנתונים שלנו במסד נתונים, ולפני שנוכל לעשות זאת, עלינו ליצור מחלקה שתשמש את JDO לאחסון הנתונים שלנו.
לשם כך עלינו ליצור מחלקה עם מאפיינים מסוימים ולסמן אותה באמצעות ה- @PersistentCapable:
מוצר @PersistenceCapable בכיתה ציבורית {@PrimaryKey @Persistent (valueStrategy = IdGeneratorStrategy.INCREMENT) מזהה ארוך; שם מחרוזת; מחיר כפול = 0.0; // בונים סטנדרטיים, גטרים, סטרים}
הערנו גם את המפתח העיקרי שלנו ואת האסטרטגיה שנבחרה.
ברגע שניצור את האובייקט שלנו, עלינו להריץ את המשפר כדי ליצור את קוד הביצוע הנדרש על ידי JDO. באמצעות Maven נוכל להפעיל פקודה זו:
mvn datanucleus: שפר
שלב זה הוא חובה. אחרת, אנו מקבלים שגיאת זמן קומפילציה שהמחלקה אינה משופרת.
כמובן, ניתן לעשות זאת באופן אוטומטי במהלך בניית Maven:
org.datanucleus datanucleus-maven-plugin 5.0.2 JDO $ {basedir} /datanucleus.properties $ {basedir} /log4j.properties שיעורי התהליך האמיתיים משפרים
הגרסה האחרונה של התוסף נמצאת כאן: תוסף datanucleus-maven
4. אובייקטים מתמידים
אנו מקבלים גישה למסד הנתונים באמצעות מפעל JDO המספק לנו את מנהל העסקאות האחראי על ביצוע עסקאות:
PersistenceManagerFactory pmf = JDOPersistenceManagerFactory חדש (pumd, null); PersistenceManager pm = pmf.getPersistenceManager ();
עסקאות משמשות כדי לאפשר החזר כספי במקרה של שגיאה:
Transaction tx = pm.currentTransaction ();
אנו מבצעים את העסקאות שלנו בתוך a נסה לתפוס לַחסוֹם:
מוצר מוצר = מוצר חדש ("טאבלט", 80.0); pm.makePersistent (מוצר);
בשלנו סוף כל סוף לחסום, אנו מגדירים פעולות אלה שיש לבצע במקרה של כשל.
אם מסיבה כלשהי לא ניתן להשלים את העסקה, אנו מבצעים החזר כספי, וגם סוגרים את החיבור למסד הנתונים באמצעות pm.close ():
לבסוף {if (tx.isActive ()) {tx.rollback (); } pm.close (); }
כדי לחבר את התוכנית שלנו למסד הנתונים, עלינו ליצור יחידת התמדה בזמן ריצה כדי לציין את המחלקות המתמשכות, סוג מסד הנתונים ופרמטרי החיבור:
PersistenceUnitMetaData pumd = PersistenceUnitMetaData חדש ("יחידה דינמית", "RESOURCE_LOCAL", null); pumd.addClassName ("com.baeldung.jdo.Product"); pumd.setExcludeUnlistedClasses (); pumd.addProperty ("javax.jdo.option.ConnectionDriverName", "org.h2.Driver"); pumd .addProperty ("javax.jdo.option.ConnectionURL", "jdbc: h2: mem: mypersistence"); pumd.addProperty ("javax.jdo.option.ConnectionUserName", "sa"); pumd.addProperty ("javax.jdo.option.ConnectionPassword", ""); pumd.addProperty ("datanucleus.autoCreateSchema", "true");
5. חפצי קריאה
כדי לקרוא נתונים ממסד הנתונים שלנו בתוך חסימת העסקאות שלנו, אנו יוצרים שאילתה. לאחר מכן, אנו מאחסנים פריטים אלה ב- Java רשימה אוסף, שיחזיק עותק בזיכרון של המידע מהאחסון המתמשך.
מנהל ההתמדה נותן לנו גישה לממשק השאילתה המאפשר לנו אינטראקציה עם מסד הנתונים:
שאילתה q = pm.newQuery ("בחר מ-" + Product.class.getName () + "WHERE מחיר <1"); רשימת מוצרים = (רשימה) q.execute (); איטרטור איטר = products.iterator (); בעוד (iter.hasNext ()) {מוצר p = iter.next (); // הצג את פרטי המוצר}
6. עדכון אובייקטים
כדי לעדכן אובייקטים במסד הנתונים עלינו למצוא את האובייקטים שאנו רוצים לעדכן באמצעות שאילתה, ואז אנו מעדכנים את תוצאות השאילתה ומבצעים את העסקה:
שאילתת שאילתה = pm.newQuery (Product.class, "name == \" Phone \ ""); תוצאת אוסף = (אוסף) query.execute (); מוצר מוצר = (מוצר) result.iterator (). הבא (); product.setName ("טלפון אנדרואיד");
7. מחיקת אובייקטים
בדומה לנוהל העדכון, אנו מחפשים תחילה את האובייקט ואז מוחקים אותו באמצעות מנהל ההתמדה. במצבים אלה, JDO מעדכן את האחסון המתמשך:
שאילתת שאילתות = pm.newQuery (Product.class, "name == \" טלפון אנדרואיד \ ""); תוצאת אוסף = (אוסף) query.execute (); מוצר מוצר = (מוצר) result.iterator (). הבא (); pm.deletePersistent (מוצר);
8. מאגרי XML
באמצעות תוסף ה- XML נוכל להשתמש בקובצי XML לצורך התעקשות הנתונים שלנו.
אנו מציינים את שלנו ConnectionURL המציין שהוא קובץ XML ומציין את שם הקובץ: חנות נתונים של XML אינה תומכת במאפיין התוספת האוטומטית, לכן עלינו ליצור מחלקה נוספת: ה @Xml תכונה ביאור מציין כי זה יופיע בקובץ ה- XML כתכונה של האלמנט. בואו ניצור ונמשיך את המוצר שלנו: אנו מאחסנים את המוצר בקובץ ה- XML: אנו יכולים לשחזר את האובייקטים שלנו מקובץ ה- XML באמצעות שאילתה: ואז אנו משתמשים באיטרטור כדי לקיים אינטראקציה עם כל אובייקט. JDOQL היא שפת שאילתות מבוססת עצמים המיועדת לבצע שאילתות באמצעות אובייקטים של Java. באמצעות שאילתת ההצהרה, אנו מצהירים על הפרמטרים וקובעים אותם באמצעות Java, זה מבטיח בטיחות סוג: JDO מספק מנגנון לביצוע שאילתות SQL סטנדרטיות: אנו משתמשים javax.jdo.query.SQL כפרמטר אחד עבור אובייקט השאילתה והפרמטר השני הוא ה- SQL עצמו. JDO מספק מנגנון לביצוע גם שאילתות JPA. אנו יכולים להשתמש בתחביר המלא של שפת שאילתת JPA: במדריך זה אנו: כמו תמיד, תוכל למצוא את הקוד מהמאמר ב- Github.pumdXML.addProperty ("javax.jdo.option.ConnectionURL", "xml: file: myPersistence.xml");
@PersistenceCapable () מחלקה ציבורית ProductXML {@XmlAttribute פרטי ארוך productNumber = 0; @PrimaryKey פרטי שם מחרוזת = null; מחיר כפול פרטי = 0.0; // גטרים וקובעים סטנדרטיים
ProductXML productXML = ProductXML חדש (0, "טאבלט", 80.0); pm.makePersistent (productXML);
טאבלט 80.0
8.1. שחזר אובייקטים ממאגר הנתונים XML
שאילתה q = pm.newQuery ("בחר מ-" + ProductXML.class.getName ()); רשימת מוצרים = (רשימה) q.execute ();
9. שאילתות JDO
9.1. הצהרת JDOQL
שאילתה qDJDOQL = pm.newQuery (Product.class); qDJDOQL.setFilter ("שם == 'טאבלט' && מחיר == מחיר_ערך"); qDJDOQL.declareParameters ("מחיר כפול מחיר"); רשימת תוצאות qDJDOQL = qDJDOQL.setParameters (80.0) .executeList ();
9.2. SQL
שאילתת שאילתות = pm.newQuery ("javax.jdo.query.SQL", "בחר * ממוצר"); query.setClass (Product.class); תוצאות רשימה = query.executeList ();
9.3. JPQL
שאילתה q = pm.newQuery ("JPQL", "בחר p מתוך" + Product.class.getName () + "p WHERE p.name = 'מחשב נייד'"); תוצאות רשימה = (רשימה) q. לבצע ();
10. סיכום