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:

pumdXML.addProperty ("javax.jdo.option.ConnectionURL", "xml: file: myPersistence.xml");

En XML-datalager støtter ikke auto-increment-egenskapen, så vi må opprette en annen klasse:

@PersistenceCapable () offentlig klasse ProductXML {@XmlAttribute private long productNumber = 0; @PrimaryKey private Strengnavn = null; privat Dobbel pris = 0,0; // standard getters og setters

De @XmlAttributt merknad angir at dette vil vises i XML-filen som et attributt for elementet.

La oss lage og vedvare produktet vårt:

ProductXML productXML = nytt ProductXML (0, "Tablet", 80.0); pm.makePersistent (productXML);

Vi lagrer produktet i XML-filen:

 Nettbrett 80.0 

8.1. Gjenopprett objekter fra XML-datalageret

Vi kan gjenopprette objektene våre fra XML-filen ved hjelp av et spørsmål:

Spørring q = pm.newQuery ("VELG FRA" + ProductXML.class.getName ()); Liste produkter = (Liste) q. Utfør ();

Og så bruker vi iteratoren til å samhandle med hvert objekt.

9. JDO-spørsmål

JDOQL er et objektbasert spørrespråk designet for å utføre spørsmål ved hjelp av Java-objekter.

9.1. Deklarativ JDOQL

Ved hjelp av den deklarative spørringen deklarerer vi parametrene og setter dem ved hjelp av Java, dette sikrer typesikkerhet:

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

JDO gir en mekanisme for å utføre standard SQL-spørsmål:

Query query = pm.newQuery ("javax.jdo.query.SQL", "SELECT * FROM PRODUCT"); query.setClass (Product.class); Listeresultater = query.executeList ();

Vi bruker javax.jdo.query.SQL som en parameter for søkeobjektet, og den andre parameteren er selve SQL.

9.3. JPQL

JDO gir også en mekanisme for å utføre JPA-spørsmål. Vi kan bruke hele syntaksen til JPA-spørringsspråket:

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

I denne opplæringen:

  • opprettet et enkelt CRUD-program som bruker JDO
  • lagret og hentet dataene våre som XML
  • undersøkte vanlige spørringsmekanismer

Som alltid kan du finne koden fra artikkelen på Github.


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