Anleitung zu Java-Datenobjekten

Leitfaden zu Java-Datenobjekten

1. Überblick

Die Java-Datenobjekte sind eine API, mit der objektorientierte Daten in einer beliebigen Datenbank gespeichert und mithilfe der Java-Syntax eine benutzerfreundliche Abfragesprache bereitgestellt werden können.

In diesem Artikel erfahren Sie, wie Sie die JDO-API zum Speichern unserer Objekte in einer Datenbank verwenden.

2. Maven-Abhängigkeiten und Setup

Wir werden die aktuelle DataNucleus-JDO-API verwenden, die vollständige Unterstützung für die JDO 3.2-API bietet.

Fügen wir unsererpom.xml-Datei die folgende Abhängigkeit hinzu:


    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-release

Die neuesten Versionen der Abhängigkeiten finden Sie hier:javax.jdo,datanucleus-core,datanucleus-api-jdo,datanucleus-rdbms unddatanucleus-xml.

3. Modell

Wir werden unsere Daten in einer Datenbank speichern, und bevor wir dies tun können, müssen wir eine Klasse erstellen, die von JDO zum Speichern unserer Daten verwendet wird.

Dazu müssen wir eine Klasse mit einigen Eigenschaften erstellen und mit@PersistentCapable: versehen

@PersistenceCapable
public class Product {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.INCREMENT)
    long id;

    String name;
    Double price = 0.0;

    // standard constructors, getters, setters
}

Wir haben auch unseren Primärschlüssel und die gewählte Strategie mit Anmerkungen versehen.

Sobald wir unser Objekt erstellt haben, müssen wir den Enhancer ausführen, um den für JDO erforderlichen Bytecode zu generieren. Mit Maven können wir diesen Befehl ausführen:

mvn datanucleus:enhance

Dieser Schritt ist obligatorisch. Andernfalls wird beim Kompilieren ein Fehler gemeldet, dass die Klasse nicht erweitert wurde.

Natürlich ist dies während eines Maven-Builds automatisch möglich:


    org.datanucleus
    datanucleus-maven-plugin
    5.0.2
    
        JDO
        ${basedir}/datanucleus.properties
        ${basedir}/log4j.properties
        true
    
    
        
            process-classes
            
                enhance
            
        
    

Die neueste Version des Plugins finden Sie hier:datanucleus-maven-plugin

4. Persistierende Objekte

Wir erhalten Zugriff auf die Datenbank über eine JDO-Factory, die uns den Transaktionsmanager zur Verfügung stellt, der für die Ausführung von Transaktionen verantwortlich ist:

PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null);
PersistenceManager pm = pmf.getPersistenceManager();

Transaktionen werden verwendet, um im Fehlerfall ein Rollback zu ermöglichen:

Transaction tx = pm.currentTransaction();

Wir machen unsere Transaktionen innerhalb einestry/catch Blocks:

Product product = new Product("Tablet", 80.0);
pm.makePersistent(product);

In unseremfinally-Block definieren wir diese Operationen, die im Falle eines Fehlers ausgeführt werden sollen.

Wenn die Transaktion aus irgendeinem Grund nicht abgeschlossen werden kann, führen wir einen Rollback durch und schließen die Verbindung zur Datenbank mitpm.close():

finally {
    if (tx.isActive()) {
        tx.rollback();
    }
    pm.close();
}

Um unser Programm mit der Datenbank zu verbinden, müssen wir zur Laufzeit einpersistence-unit erstellen, um die persistenten Klassen, den Datenbanktyp und die Verbindungsparameter anzugeben:

PersistenceUnitMetaData pumd = new PersistenceUnitMetaData(
  "dynamic-unit", "RESOURCE_LOCAL", null);
pumd.addClassName("com.example.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. Objekte lesen

Um Daten aus unserer Datenbank in unserem Transaktionsblock zu lesen, erstellen wir eine Abfrage. Anschließend speichern wir diese Elemente in einer JavaList-Sammlung, die eine speicherinterne Kopie der Informationen aus dem persistenten Speicher enthält.

Der Persistenzmanager gibt uns Zugriff auf die Abfrageoberfläche, über die wir mit der Datenbank interagieren können:

Query q = pm.newQuery(
  "SELECT FROM " + Product.class.getName() + " WHERE price < 1");
List products = (List) q.execute();
Iterator iter = products.iterator();
while (iter.hasNext()) {
    Product p = iter.next();
    // show the product information
}

6. Objekte aktualisieren

Um Objekte in der Datenbank zu aktualisieren, müssen wir die zu aktualisierenden Objekte mithilfe einer Abfrage suchen. Anschließend aktualisieren wir die Ergebnisse der Abfrage und übergeben die Transaktion:

Query query = pm.newQuery(Product.class, "name == \"Phone\"");
Collection result = (Collection) query.execute();
Product product = (Product) result.iterator().next();
product.setName("Android Phone");

7. Objekte löschen

Ähnlich wie bei der Aktualisierung suchen wir zuerst nach dem Objekt und löschen es dann mit dem Persistenzmanager. In diesen Situationen aktualisiert JDO den persistenten Speicher:

Query query = pm.newQuery(Product.class, "name == \"Android Phone\"");
Collection result = (Collection) query.execute();
Product product = (Product) result.iterator().next();
pm.deletePersistent(product);

8. XML-Datenspeicher

Mit dem XML-Plugin können wir XML-Dateien zum Speichern unserer Daten verwenden.

Wir geben unsereConnectionURLan, die angeben, dass es sich um eine XML-Datei handelt, und geben den Namen der Datei an: __

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

Ein XML-Datenspeicher unterstützt die Auto-Increment-Eigenschaft nicht, daher müssen wir eine weitere Klasse erstellen:

@PersistenceCapable()
public class ProductXML {

    @XmlAttribute
    private long productNumber = 0;
    @PrimaryKey
    private String name = null;
    private Double price = 0.0;

    // standard getters and setters

Die Annotation@XmlAttribute gibt an, dass dies in der XML-Datei als Attribut des Elements angezeigt wird.

Lassen Sie uns unser Produkt erstellen und beibehalten:

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

Wir bekommen das Produkt in der XML-Datei gespeichert:


    Tablet
    80.0

8.1. Objekte aus dem XML-Datenspeicher wiederherstellen

Wir können unsere Objekte aus der XML-Datei mit einer Abfrage wiederherstellen:

Query q = pm.newQuery("SELECT FROM " + ProductXML.class.getName());
List products = (List) q.execute();

Und dann verwenden wir den Iterator, um mit jedem Objekt zu interagieren.

9. JDO-Abfragen

JDOQL ist eine objektbasierte Abfragesprache, mit der Abfragen mithilfe von Java-Objekten ausgeführt werden können.

9.1. Deklaratives JDOQL

Mit der deklarativen Abfrage deklarieren wir die Parameter und setzen sie mit Java, um die Typensicherheit zu gewährleisten:

Query qDJDOQL = pm.newQuery(Product.class);
qDJDOQL.setFilter("name == 'Tablet' && price == price_value");
qDJDOQL.declareParameters("double price_value");
List resultsqDJDOQL = qDJDOQL.setParameters(80.0).executeList();

9.2. SQL

JDO bietet einen Mechanismus zum Ausführen von Standard-SQL-Abfragen:

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

Wir verwendenjavax.jdo.query.SQL als einen Parameter für das Abfrageobjekt und der zweite Parameter ist SQL selbst.

9.3. JPQL

JDO bietet auch einen Mechanismus zum Ausführen von JPA-Abfragen. Wir können die vollständige Syntax der JPA-Abfragesprache verwenden:

Query q = pm.newQuery("JPQL",
  "SELECT p FROM " + Product.class.getName() + " p WHERE p.name = 'Laptop'");
List results = (List) q.execute();

10. Zusammenfassung

In diesem Tutorial werden wir:

  • hat eine einfache CRUD-Anwendung erstellt, die JDO verwendet

  • Speichern und Abrufen unserer Daten als XML

  • untersuchten gängige Abfragemechanismen

Wie immer finden Sie den Code aus dem Artikelover on Github.