1概要
Java Data Objectsは、オブジェクト指向データを任意のデータベースに永続化し、Java構文を使用してユーザーフレンドリなクエリ言語を提供するために設計されたAPIです。
この記事では、データベースにオブジェクトを永続化するためのJDO APIの使用方法について説明します。
2 Mavenの依存関係と設定
最新のDataNucleus JDO APIを使用し、JDO 3.2 APIを完全にサポートします。
pom.xml ファイルに次の依存関係を追加しましょう。
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>javax.jdo</artifactId>
<version>3.2.0-m6</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>5.1.0-m2</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-api-jdo</artifactId>
<version>5.1.0-m2</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-rdbms</artifactId>
<version>5.1.0-m2</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-xml</artifactId>
<version>5.0.0-release</version>
</dependency>
依存関係の最新バージョンはここにあります。
javax.jdo 、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.datanucleus%22%20AND%20a%3A%22datanucleus-core%22[datanucleus-core]、https://search.maven org/classic/#検索%7Cgav%7C1%7Cg%3A%22org.datanucleus%22%20AND 20a%3A%22datanucleus-api-jdo%22[datanucleus-api-jdo]、https://search.maven。 org/classic/#検索%7Cgav%7C1%7Cg%3A%22org.datanucleus%22%20AND 20a%3A%22datanucleus-rdbms%22[datanucleus-rdbms]およびhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.datanucleus%22%20AND 20a%3A%22datanucleus-xml%22[datanucleus-xml]。
** 3モデル
**
データをデータベースに保存します。その前に、データを格納するためにJDOで使用されるクラスを作成する必要があります。
そのためには、いくつかのプロパティを持つクラスを作成し、それに__ @ PersistentCapableというアノテーションを付ける必要があります。
@PersistenceCapable
public class Product {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.INCREMENT)
long id;
String name;
Double price = 0.0;
//standard constructors, getters, setters
}
主キーと選択した戦略にも注釈を付けました。
オブジェクトを作成したら、エンハンサーを実行してJDOに必要なバイトコードを生成する必要があります。 Mavenを使って、このコマンドを実行できます。
mvn datanucleus:enhance
この手順は必須です。そうでなければ、クラスが拡張されていないというコンパイル時エラーが発生します。
もちろん、Mavenのビルド中にこれを自動的に行うことができます。
<plugin>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-maven-plugin</artifactId>
<version>5.0.2</version>
<configuration>
<api>JDO</api>
<props>${basedir}/datanucleus.properties</props>
<log4jConfiguration>${basedir}/log4j.properties</log4jConfiguration>
<verbose>true</verbose>
</configuration>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
プラグインの最新バージョンはここにあります。
** 4永続オブジェクト
**
トランザクションの実行を担当するトランザクションマネージャを提供するJDOファクトリを使用してデータベースにアクセスします。
PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null);
PersistenceManager pm = pmf.getPersistenceManager();
トランザクションは、エラーが発生した場合にロールバックを許可するために使用されます。
Transaction tx = pm.currentTransaction();
トランザクションを try/catch ブロック内で作成します。
Product product = new Product("Tablet", 80.0);
pm.makePersistent(product);
私たちの finally ブロックで、私たちは失敗の場合に行われるべきこれらの操作を定義します。
何らかの理由でトランザクションが完了できない場合は、ロールバックを行い、 pm.close() を使用してデータベースへの接続も閉じます。
finally {
if (tx.isActive()) {
tx.rollback();
}
pm.close();
}
プログラムをデータベースに接続するには、実行時に persistence-unit を作成して永続クラス、データベースタイプ、および接続パラメータを指定する必要があります。
PersistenceUnitMetaData pumd = new PersistenceUnitMetaData(
"dynamic-unit", "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の List コレクションに格納します。このコレクションは、永続ストレージからの情報のメモリ内コピーを保持します。
持続マネージャは私達にデータベースと対話することを可能にする問い合わせインターフェースへのアクセスを私達に与えます:
Query q = pm.newQuery(
"SELECT FROM " + Product.class.getName() + " WHERE price < 1");
List<Product> products = (List<Product>) q.execute();
Iterator<Product> iter = products.iterator();
while (iter.hasNext()) {
Product p = iter.next();
//show the product information
}
** 6. オブジェクトの更新
**
データベース内のオブジェクトを更新するには、クエリを使用して更新したいオブジェクトを見つける必要があります。次に、クエリの結果を更新してトランザクションをコミットします。
Query query = pm.newQuery(Product.class, "name == \"Phone\"");
Collection result = (Collection) query.execute();
Product product = (Product) result.iterator().next();
product.setName("Android Phone");
** 7. オブジェクトを削除する
**
更新手順と同様に、まずオブジェクトを検索してから、持続性マネージャを使用してそれを削除します。そのような状況では、JDOは永続ストレージを更新します。
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データストア
**
XMLプラグインを使用して、データを永続化するためにXMLファイルを使用できます。
ConnectionURL を指定して、それがXMLファイルであることを示し、ファイルの名前を指定します。
pumdXML.addProperty("javax.jdo.option.ConnectionURL", "xml:file:myPersistence.xml");
XMLデータストアは自動インクリメントプロパティをサポートしていないため、別のクラスを作成する必要があります。
@PersistenceCapable()
public class ProductXML {
@XmlAttribute
private long productNumber = 0;
@PrimaryKey
private String name = null;
private Double price = 0.0;
//standard getters and setters
@ XmlAttribute アノテーションは、これがXMLファイルに要素の属性として現れることを示します。
私たちの製品を作って持続させましょう
ProductXML productXML = new ProductXML(0,"Tablet", 80.0);
pm.makePersistent(productXML);
製品をXMLファイルに格納します。
<productXML productNumber="0">
<name>Tablet</name>
<price>80.0</price>
</productXML>
** 8.1. XMLデータストアからオブジェクトを回復する
**
クエリを使用してXMLファイルからオブジェクトを回復できます。
Query q = pm.newQuery("SELECT FROM " + ProductXML.class.getName());
List<ProductXML> products = (List<ProductXML>) q.execute();
そして、反復子を使って各オブジェクトと対話します。
** 9 JDOクエリ
**
JDOQLは、Javaオブジェクトを使用してクエリを実行するように設計されたオブジェクトベースのクエリ言語です。
9.1. 宣言型JDOQL
宣言型クエリを使用して、パラメータを宣言し、Javaを使用して設定します。これにより、型の安全性が保証されます。
Query qDJDOQL = pm.newQuery(Product.class);
qDJDOQL.setFilter("name == 'Tablet' && price == price__value");
qDJDOQL.declareParameters("double price__value");
List<Product> resultsqDJDOQL = qDJDOQL.setParameters(80.0).executeList();
9.2. SQL
JDOは標準SQLクエリを実行するためのメカニズムを提供します。
Query query = pm.newQuery("javax.jdo.query.SQL", "SELECT ** FROM PRODUCT");
query.setClass(Product.class);
List<Product> results = query.executeList();
クエリオブジェクトの1つのパラメータとして javax.jdo.query.SQL を使用し、2番目のパラメータはSQL自体です。
9.3. JPQL
JDOはJPAクエリを実行するためのメカニズムも提供します。 JPAクエリ言語の完全な構文を使用できます。
Query q = pm.newQuery("JPQL",
"SELECT p FROM " + Product.class.getName() + " p WHERE p.name = 'Laptop'");
List results = (List) q.execute();
10概要
このチュートリアルでは、
-
JDOを使用した簡単なCRUDアプリケーションを作成しました
-
データをXMLとして保存および取得
-
一般的な問い合わせメカニズムを調べた
いつものように、あなたは記事https://github.com/eugenp/tutorials/tree/master/libraries-data[over on Github]からコードを見つけることができます。