Guide des objets de données Java

Guide des objets de données Java

1. Vue d'ensemble

Java Data Objects est une API conçue pour la persistance de données orientées objet dans toute base de données et fournit un langage de requête convivial utilisant la syntaxe Java.

Dans cet article, nous allons voir comment utiliser l'API JDO pour la persistance de nos objets dans une base de données.

2. Dépendances et configuration de Maven

Nous allons utiliser l’API DataNucleus JDO qui est à jour et offre un support complet pour l’API JDO 3.2.

Ajoutons la dépendance suivante à notre fichierpom.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.datanucleus
    datanucleus-rdbms
    5.1.0-m2


    org.datanucleus
    datanucleus-xml
    5.0.0-release

Les dernières versions des dépendances peuvent être trouvées ici:javax.jdo,datanucleus-core,datanucleus-api-jdo,datanucleus-rdbms etdatanucleus-xml.

3. Modèle

Nous allons enregistrer nos données dans une base de données. Avant de pouvoir le faire, nous devons créer une classe qui sera utilisée par JDO pour stocker nos données.

Pour ce faire, nous devons créer une classe avec certaines propriétés et l'annoter avec les@PersistentCapable:

@PersistenceCapable
public class Product {

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

    String name;
    Double price = 0.0;

    // standard constructors, getters, setters
}

Nous avons également annoté notre clé primaire et la stratégie choisie.

Une fois que nous avons créé notre objet, nous devons exécuter l’amplificateur pour générer le bytecode requis par JDO. En utilisant Maven, nous pouvons exécuter cette commande:

mvn datanucleus:enhance

Cette étape est obligatoire. Sinon, nous obtenons une erreur de compilation indiquant que la classe n'est pas améliorée.

Bien sûr, il est possible de le faire automatiquement lors d'une compilation Maven:


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

La dernière version du plugin peut être trouvée ici:datanucleus-maven-plugin

4. Objets persistants

Nous avons accès à la base de données en utilisant une usine JDO qui nous donne le gestionnaire de transactions chargé d’effectuer les transactions:

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

Les transactions sont utilisées pour permettre une annulation en cas d'erreur:

Transaction tx = pm.currentTransaction();

Nous effectuons nos transactions dans un bloctry/catch:

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

Dans notre blocfinally, nous définissons ces opérations à effectuer en cas d'échec.

Si pour une raison quelconque la transaction ne peut pas être terminée, nous effectuons une annulation, et nous fermons également la connexion à la base de données avecpm.close():

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

Pour connecter notre programme à la base de données, nous devons créer unpersistence-unit à l'exécution pour spécifier les classes persistantes, le type de base de données et les paramètres de connexion:

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. Objets de lecture

Pour lire les données de notre base de données à l'intérieur de notre bloc de transactions, nous créons une requête. Ensuite, nous stockons ces éléments dans une collection JavaList, qui contiendra une copie en mémoire des informations du stockage persistant.

Le gestionnaire de persistance nous donne un accès à l'interface de requête qui nous permet d'interagir avec la base de données:

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. Mise à jour des objets

Pour mettre à jour des objets dans la base de données, nous devons trouver les objets que nous voulons mettre à jour à l'aide d'une requête, puis nous mettons à jour les résultats de la requête et validons la transaction:

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

7. Supprimer des objets

Comme pour la procédure de mise à jour, nous recherchons d'abord l'objet, puis nous le supprimons à l'aide du gestionnaire de persistance. Dans ces situations, JDO met à jour le stockage persistant:

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

8. Banques de données XML

En utilisant le plugin XML, nous pouvons utiliser des fichiers XML pour conserver nos données.

Nous spécifions nosConnectionURL en indiquant qu'il s'agit d'un fichier XML et en spécifiant le nom du fichier: __

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

Une banque de données XML ne supporte pas la propriété auto-increment, nous devons donc créer une autre classe:

@PersistenceCapable()
public class ProductXML {

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

    // standard getters and setters

L'annotation@XmlAttribute indique que cela apparaîtra dans le fichier XML en tant qu'attribut de l'élément.

Créons et persistons notre produit:

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

Nous obtenons le produit stocké dans le fichier XML:


    Tablet
    80.0

8.1. Récupérer des objets à partir de la banque de données XML

Nous pouvons récupérer nos objets à partir du fichier XML en utilisant une requête:

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

Et ensuite, nous utilisons l’itérateur pour interagir avec chaque objet.

9. Requêtes JDO

JDOQL est un langage de requête à base d'objets conçu pour effectuer des requêtes à l'aide d'objets Java.

9.1. JDOQL déclaratif

À l'aide de la requête déclarative, nous déclarons les paramètres et les définissons à l'aide de Java, ce qui garantit la sécurité du type:

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 fournit un mécanisme pour l'exécution de requêtes SQL standard:

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

Nous utilisonsjavax.jdo.query.SQL comme paramètre pour l'objet de requête et le deuxième paramètre est le SQL lui-même.

9.3. JPQL

JDO fournit également un mécanisme pour l'exécution de requêtes JPA. Nous pouvons utiliser la syntaxe complète du langage de requête JPA:

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

10. Sommaire

Dans ce tutoriel, nous:

  • créé une application CRUD simple utilisant JDO

  • enregistré et récupéré nos données en XML

  • examiné les mécanismes de requête communs

Comme toujours, vous pouvez trouver le code de l'articleover on Github.