Veiledning til Java Data Objects
1. Oversikt
Java Data Objects er et API designet for å vedvare objektorientert data i en hvilken som helst database og gi et brukervennlig spørrespråk ved hjelp av Java-syntaksen.
I denne artikkelen skal vi se hvordan du bruker JDO API for å vedvare objektene våre i en database.
2. Maven-avhengigheter og oppsett
Vi skal bruke DataNucleus JDO API som er oppdatert og tilbyr full støtte for JDO 3.2 API.
La oss legge til følgende avhengighet til vår pom.xml fil:
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.datanucleus datanucleus-rdbms 5.1.0-m2 org.datanucleus datanucleus -xml 5.0.0-utgivelse
De siste versjonene av avhengighetene finner du her: javax.jdo, datanucleus-core, datanucleus-api-jdo, datanucleus-rdbms og datanucleus-xml.
3. Modell
Vi skal lagre dataene våre i en database, og før vi kan gjøre det, må vi lage en klasse som skal brukes av JDO for lagring av dataene våre.
For å gjøre det må vi lage en klasse med noen egenskaper og kommentere den med @PersistentCapable:
@PersistenceCapable public class Product {@PrimaryKey @Persistent (valueStrategy = IdGeneratorStrategy.INCREMENT) lang id; Strengnavn; Dobbel pris = 0,0; // standard konstruktører, getters, setters}
Vi kommenterte også vår primære nøkkel og den valgte strategien.
Når vi har opprettet objektet vårt, må vi kjøre forsterkeren for å generere bytekoden som kreves av JDO. Ved hjelp av Maven kan vi kjøre denne kommandoen:
mvn datanucleus: forbedre
Dette trinnet er obligatorisk. Ellers får vi kompilere tidsfeil om at klassen ikke forbedres.
Selvfølgelig er det mulig å gjøre dette automatisk under en Maven-bygging:
org.datanucleus datanucleus-maven-plugin 5.0.2 JDO $ {basedir} /datanucleus.properties $ {basedir} /log4j.properties sanne prosessklasser forbedrer
Den siste versjonen av pluginet finner du her: datanucleus-maven-plugin
4. Vedvarende gjenstander
Vi får tilgang til databasen ved hjelp av en JDO-fabrikk som gir oss transaksjonssjefen som har ansvaret for å utføre transaksjoner:
PersistenceManagerFactory pmf = ny JDOPersistenceManagerFactory (pumd, null); PersistenceManager pm = pmf.getPersistenceManager ();
Transaksjoner brukes til å tillate tilbakeføring i tilfelle en feil:
Transaksjon tx = pm.currentTransaction ();
Vi foretar transaksjonene våre inne i prøve / fange blokkere:
Produktprodukt = nytt produkt ("Tablet", 80.0); pm.makePersistent (produkt);
I vår endelig blokk, definerer vi at disse operasjonene skal utføres i tilfelle en feil.
Hvis transaksjonen av en eller annen grunn ikke kan fullføres, lager vi tilbakeføring, og vi lukker også forbindelsen til databasen med pm.close ():
til slutt {if (tx.isActive ()) {tx.rollback (); } pm.close (); }
For å koble programmet vårt til databasen, må vi lage et utholdenhet ved kjøretid for å spesifisere de vedvarende klassene, databasetypen og tilkoblingsparametrene:
PersistenceUnitMetaData pumd = ny PersistenceUnitMetaData ("dynamisk enhet", "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. Lesing av objekter
For å lese data fra databasen vår i transaksjonsblokken oppretter vi et spørsmål. Deretter lagrer vi disse elementene i en Java Liste samling, som vil inneholde en kopi i minnet av informasjonen fra den vedvarende lagringen.
Persistensbehandling gir oss tilgang til spørregrensesnittet som lar oss samhandle med databasen:
Spørring q = pm.newQuery ("VELG FRA" + Product.class.getName () + "WHERE pris <1"); Liste produkter = (Liste) q. Utfør (); Iterator iter = products.iterator (); while (iter.hasNext ()) {Product p = iter.next (); // vis produktinformasjonen}
6. Oppdatere objekter
For å oppdatere objekter i databasen må vi finne objektene vi vil oppdatere ved hjelp av et spørsmål, og deretter oppdaterer vi resultatene av spørringen og begår transaksjonen:
Query query = pm.newQuery (Product.class, "name == \" Phone \ ""); Samlingsresultat = (Samling) spørring. Utfør (); Produktprodukt = (Produkt) resultat.iterator (). Neste (); product.setName ("Android-telefon");
7. Slette objekter
I likhet med oppdateringsprosedyren søker vi først etter objektet og sletter det deretter ved hjelp av utholdenhetsbehandling. I slike situasjoner oppdaterer JDO vedvarende lagring:
Query query = pm.newQuery (Product.class, "name == \" Android Phone \ ""); Samlingsresultat = (Samling) spørring. Utfør (); Produktprodukt = (Produkt) resultat.iterator (). Neste (); pm.deletePersistent (produkt);
8. XML-datalagre
Ved hjelp av XML-plugin kan vi bruke XML-filer for å vedvare dataene våre.
Vi spesifiserer vår ConnectionURL som indikerer at det er en XML-fil og spesifiserer navnet på filen: En XML-datalager støtter ikke auto-increment-egenskapen, så vi må opprette en annen klasse: De @XmlAttributt merknad angir at dette vil vises i XML-filen som et attributt for elementet. La oss lage og vedvare produktet vårt: Vi lagrer produktet i XML-filen: Vi kan gjenopprette objektene våre fra XML-filen ved hjelp av et spørsmål: Og så bruker vi iteratoren til å samhandle med hvert objekt. JDOQL er et objektbasert spørrespråk designet for å utføre spørsmål ved hjelp av Java-objekter. Ved hjelp av den deklarative spørringen deklarerer vi parametrene og setter dem ved hjelp av Java, dette sikrer typesikkerhet: JDO gir en mekanisme for å utføre standard SQL-spørsmål: Vi bruker javax.jdo.query.SQL som en parameter for søkeobjektet, og den andre parameteren er selve SQL. JDO gir også en mekanisme for å utføre JPA-spørsmål. Vi kan bruke hele syntaksen til JPA-spørringsspråket: I denne opplæringen: Som alltid kan du finne koden fra artikkelen på Github.pumdXML.addProperty ("javax.jdo.option.ConnectionURL", "xml: file: myPersistence.xml");
@PersistenceCapable () offentlig klasse ProductXML {@XmlAttribute private long productNumber = 0; @PrimaryKey private Strengnavn = null; privat Dobbel pris = 0,0; // standard getters og setters
ProductXML productXML = nytt ProductXML (0, "Tablet", 80.0); pm.makePersistent (productXML);
Nettbrett 80.0
8.1. Gjenopprett objekter fra XML-datalageret
Spørring q = pm.newQuery ("VELG FRA" + ProductXML.class.getName ()); Liste produkter = (Liste) q. Utfør ();
9. JDO-spørsmål
9.1. Deklarativ JDOQL
Spørring qDJDOQL = pm.newQuery (Product.class); qDJDOQL.setFilter ("navn == 'Nettbrett' && pris == pris_verdi"); qDJDOQL.declareParameters ("dobbel pris_verdi"); Liste resultaterqDJDOQL = qDJDOQL.setParameters (80.0) .executeList ();
9.2. SQL
Query query = pm.newQuery ("javax.jdo.query.SQL", "SELECT * FROM PRODUCT"); query.setClass (Product.class); Listeresultater = query.executeList ();
9.3. JPQL
Spørsmål q = pm.newQuery ("JPQL", "VELG p FRA" + Product.class.getName () + "p WHERE p.name = 'Laptop'"); Listeresultater = (Liste) q. Utfør ();
10. Sammendrag