Eclipse JNoSQLガイド

1概要

Eclipse JNoSQL は、JavaアプリケーションとNoSQLデータベースとの対話を単純化するためのAPIおよび実装のセットです。

この記事では、NoSQLデータベースと対話するようにJNoSQLを設定および構成する方法を学びます。私たちはコミュニケーションとマッピングの両方の層と協力します。

2 Eclipse JNoSQL通信レイヤー

技術的には、通信層は2つのモジュールで構成されています。

Diana APIとドライバ

  • APIはNoSQLデータベースタイプの抽象化を定義していますが、ドライバはほとんどの既知のデータベース** の実装を提供します。

これをリレーショナルデータベースのJDBC APIおよびJDBCドライバと比較できます。

2.1. Eclipse JNoSQL Diana API

簡単に言えば、NoSQLデータベースには、Key-Value、Column、Document、Graphの4つの基本タイプがあります。

そしてEclipse JNoSQL Diana APIは3つのモジュールを定義します。

  1. ダイアナキー値

  2. ダイアナコラム

  3. ダイアナ文書

NoSQLグラフタイプはすでにhttp://tinkerpop.apache.org/[Apache ThinkerPop]でカバーされているので、APIでカバーされていません。

APIはコアモジュール、diana-coreに基づいており、Configuration、Factory、Manager、Entity、Valueなどの一般的な概念に対する抽象概念を定義しています。

APIを使用するには、対応するモジュールのNoSQLデータベースタイプに対する依存関係を提供する必要があります。

したがって、ドキュメント指向のデータベースの場合、 diana-document 依存関係が必要になります。

<dependency>
    <groupId>org.jnosql.diana</groupId>
    <artifactId>diana-document</artifactId>
    <version>0.0.5</version>
</dependency>

同様に、作業中のNoSQLデータベースがキー値指向の場合、 diana-key-value モジュールを使用する必要があります。

<dependency>
    <groupId>org.jnosql.diana</groupId>
    <artifactId>diana-key-value</artifactId>
    <version>0.0.5</version>
</dependency>

最後に、 diana-column モジュールが列指向の場合

<dependency>
    <groupId>org.jnosql.diana</groupId>
    <artifactId>diana-column</artifactId>
    <version>0.0.5</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Corg.jnosql.diana[Maven Central]にあります。

2.2. Eclipse JNoSQL Dianaドライバー

  • ドライバは、最も一般的なNoSQLデータベース用のAPIの実装の集まりです。

NoSQLデータベースごとに1つの実装があります。 データベースがマルチモデルの場合、ドライバはサポートされているすべてのAPIを実装する必要があります

たとえば、https://www.couchbase.com/[Couchbase]はドキュメントとキー値の両方を指向しているため、 couchbase-driver diana-document diana-key-value の両方を実装しています。

ドライバが通常データベースベンダによって提供されるリレーショナルデータベースとは異なり、ここではドライバはEclipse JNoSQLによって提供されます。

ほとんどの場合、このドライバは公式のベンダーライブラリのラッパーです。

ドライバを使い始めるには、選択したNoSQLデータベースのAPIとそれに対応する実装を含める必要があります。

例えばMongoDBの場合、以下の依存関係を含める必要があります。

<dependency>
    <groupId>org.jnosql.diana</groupId>
    <artifactId>diana-document</artifactId>
    <version>0.0.5</version>
</dependency>
<dependency>
    <groupId>org.jnosql.diana</groupId>
    <artifactId>mongodb-driver</artifactId>
    <version>0.0.5</version>
</dependency>

ドライバを使った作業の背後にあるプロセスは簡単です。

まず、Configuration Beanが必要です。クラスパスまたはハードコーディング値から設定ファイルを読み込むことによって、 Configuration Factoryを作成することができます。それからそれを使用して Manager.__を作成します。

  • 最後に、 Manager は、NoSQLデータベースとの間で Entity をプッシュおよび取得する責任があります** 。

次のサブセクションでは、このプロセスを各NoSQLデータベースタイプについて説明します。

2.3. ドキュメント指向のデータベースを使った作業

この例では、始めるのが簡単で、インストールを必要としないため、組み込みMongoDBを使用します。これはドキュメント指向であり、次の手順は他のドキュメント指向のNoSQLデータベースにも適用できます。

最初に、データベースと正しく対話するためにアプリケーションが必要とするすべての必要な設定を提供するべきです。最も基本的な形式で、MongoDBの実行中のインスタンスの host port を提供する必要があります。

これらの設定は、クラスパス上の mongodb-driver.properties で指定できます。

#Define Host and Port
mongodb-server-host-1=localhost:27017

またはハードコードされた値として:

Map<String, Object> map = new HashMap<>();
map.put("mongodb-server-host-1", "localhost:27017");

次に、ドキュメントタイプ用の Configuration Beanを作成します。

DocumentConfiguration configuration = new MongoDBDocumentConfiguration();

この Configuration Beanから、 ManagerFactory を作成することができます。

DocumentCollectionManagerFactory managerFactory = configuration.get();

暗黙的に、 Configuration Beanの get() メソッドはプロパティファイルの設定を使用します。ハードコードされた値からこのファクトリを取得することもできます。

DocumentCollectionManagerFactory managerFactory
  = configuration.get(Settings.of(map));

ManagerFactory には、データベース名をパラメータとして使用して Manager を作成する単純なメソッド__get()があります。

DocumentCollectionManager manager = managerFactory.get("my-db");

そして最後に、準備が整いました。 __Manager は、 DocumentEntityを介して、基になるNoSQLデータベースと対話するために必要なすべてのメソッドを提供します。

そのため、たとえば、文書を挿入することができます。

DocumentEntity documentEntity = DocumentEntity.of("books");
documentEntity.add(Document.of("__id", "100"));
documentEntity.add(Document.of("name", "JNoSQL in Action"));
documentEntity.add(Document.of("pages", "620"));
DocumentEntity saved = manager.insert(documentEntity);

文書を検索することもできます。

DocumentQuery query = select().from("books").where("__id").eq(100).build();
List<DocumentEntity> entities = manager.select(query);

そして同様に、既存の文書を更新することができます。

saved.add(Document.of("author", "baeldung"));
DocumentEntity updated = manager.update(saved);

そして最後に、保存した文書を削除することができます。

DocumentDeleteQuery deleteQuery = delete().from("books").where("__id").eq("100").build();
manager.delete(deleteQuery);

サンプルを実行するには、 jnosql-diana モジュールにアクセスして DocumentApp アプリケーションを実行するだけです。

コンソールに出力が表示されます。

DefaultDocumentEntity{documents={pages=620, name=JNoSQL in Action, __id=100}, name='books'}
DefaultDocumentEntity{documents={pages=620, author=baeldung, name=JNoSQL in Action, __id=100}, name='books'}[]----

[[working-with-entity]]

====  **  2.4. 列指向データベースを使った作業**

このセクションの目的のために、Cassandraデータベースの埋め込みバージョンを使用しますので、インストールは不要です。

列指向データベースを操作するプロセスは非常に似ています。

まず最初に、Cassandraドライバとcolumn APIをpomに追加します。

[source,xml,gutter:,true]

<dependency> <groupId>org.jnosql.diana</groupId> <artifactId>diana-column</artifactId> <version>0.0.5</version> </dependency> <dependency> <groupId>org.jnosql.diana</groupId> <artifactId>cassandra-driver</artifactId> <version>0.0.5</version> </dependency>

次に、設定ファイル____diana-cassandra.propertiesでクラスパス上に指定されている設定が必要です。あるいは、ハードコーディングされた設定値を使用することもできます。

次に、同様の方法で__ColumnFamilyManager__を作成し、__ColumnEntityの操作を開始します。

[source,java,gutter:,true]

ColumnConfiguration configuration = new CassandraConfiguration(); ColumnFamilyManagerFactory managerFactory = configuration.get(); ColumnFamilyManager entityManager = managerFactory.get("my-keySpace");

新しいエンティティを作成するために、__insert()__メソッドを呼び出しましょう。

[source,java,gutter:,true]

ColumnEntity columnEntity = ColumnEntity.of("books"); Column key = Columns.of("id", 10L); Column name = Columns.of("name", "JNoSQL in Action"); columnEntity.add(key); columnEntity.add(name); ColumnEntity saved = entityManager.insert(columnEntity);

サンプルを実行してコンソールの出力を確認するには、__ColumnFamilyApp__アプリケーションを実行します。

[[working-with-entity]]

====  **  2.5. キーバリュー指向のデータベースを扱う**

このセクションでは、ヘーゼルキャストを使用します。 **  Hazelcastはキーバリュー指向のNoSQLデータベースです** 。 Hazelcastデータベースの詳細については、https://www.baeldung.com/java-hazelcast[link]をご覧ください。

キー値指向型を操作するプロセスも同様です。これらの依存関係をpomに追加することから始めます。

[source,xml,gutter:,true]

<dependency> <groupId>org.jnosql.diana</groupId> <artifactId>diana-key-value</artifactId> <version>0.0.5</version> </dependency> <dependency> <groupId>org.jnosql.diana</groupId> <artifactId>hazelcast-driver</artifactId> <version>0.0.5</version> </dependency>

それから、構成設定を提供する必要があります。次に、__BucketManager__を取得してから__KeyValueEntityを操作します。

[source,java,gutter:,true]

KeyValueConfiguration configuration = new HazelcastKeyValueConfiguration(); BucketManagerFactory managerFactory = configuration.get(); BucketManager entityManager = managerFactory.getBucketManager("books");

次の__Book__モデルを保存したいとしましょう。

[source,java,gutter:,true]

public class Book implements Serializable {

private String isbn;
private String name;
private String author;
private int pages;
   //standard constructor
   //standard getters and setters
}
そのため、__Book__インスタンスを作成してから、__put()__メソッドを呼び出して保存します。

[source,java,gutter:,true]

Book book = new Book( "12345", "JNoSQL in Action", "baeldung", 420); KeyValueEntity keyValueEntity = KeyValueEntity.of( book.getIsbn(), book); entityManager.put(keyValueEntity);

次に、保存された__Book__インスタンスを取得します。

[source,java,gutter:,true]

Optional<Value> optionalValue = manager.get("12345"); Value value = optionalValue.get();//or any other adequate Optional handling Book savedBook = value.get(Book.class);

サンプルを実行してコンソールに出力を表示するには、__KeyValueApp__アプリケーションを実行します。

[[mapping-layer]]

===  **  3 Eclipse JNoSQLマッピング層**

** マッピング層のArtemis APIは、Javaアノテーション付きオブジェクトをNoSQLデータベースにマッピングするのに役立つAPIのセットです** 。これは、Diana APIとCDI(Context and Dependency Injection)に基づいています。

** このAPIは、NoSQLの世界のようにJPAまたはORMと見なすことができます。この層は、各NoSQLタイプ用のAPIと共通機能用の1つのコアAPIも提供します。

このセクションでは、MongoDBのドキュメント指向データベースを扱います。

[[dependencies]]

====  **  3.1. 必要な依存関係**

アプリケーションでArtemisを有効にするには、__https://search.maven.org/classic/#search%7Cga%7C1%7Cartemis-configuration[artemis-configuration]__依存関係を追加する必要があります。

MongoDBはドキュメント指向なので、依存関係https://search.maven.org/classic/#search%7Cga%7C1%7Cartemis-document[artemis-document]も必要です。

他の種類のNoSQLデータベースでは、__artemis-column、artemis-key-value__、および__artemis-graph__を使用します。

MongoDB用のDianaドライバも必要です。

[source,xml,gutter:,true]

<dependency> <groupId>org.jnosql.artemis</groupId> <artifactId>artemis-configuration</artifactId> <version>0.0.5</version> </dependency> <dependency> <groupId>org.jnosql.artemis</groupId> <artifactId>artemis-document</artifactId> <version>0.0.5</version> </dependency> <dependency> <groupId>org.jnosql.diana</groupId> <artifactId>mongodb-driver</artifactId> <version>0.0.5</version> </dependency>

ArtemisはCDIに基づいているので、このMaven依存関係も提供する必要があります。

[source,xml,gutter:,true]

<dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>8.0</version> <scope>provided</scope> </dependency>

[[config-file]]

====  **  3.2. ドキュメント設定ファイル**

構成とは、コードの外側で設定を提供できるようにする、特定のデータベースの一連のプロパティです。デフォルトでは、META-INFリソースの下に__jnosql.json__ファイルを提供する必要があります。

これは設定ファイルの例です。

[source,javascript,gutter:,true]

----[    {
        "description": "The mongodb document configuration",
        "name": "document",
        "provider": "org.jnosql.diana.mongodb.document.MongoDBDocumentConfiguration",
        "settings": {
            "mongodb-server-host-1":"localhost:27019"
        }
    }]----

__ConfigurationUnitの__name__属性を設定して上記の設定名を指定する必要があります。設定が別のファイルにある場合は、__fileName__属性を使用して指定できます。

この構成を前提として、ファクトリを作成します。

[source,java,gutter:,true]

@Inject @ConfigurationUnit(name = "document") private DocumentCollectionManagerFactory<MongoDBDocumentCollectionManager> managerFactory;

そしてこのファクトリから、__DocumentCollectionManager__を作成することができます。

[source,java,gutter:,true]

@Produces public MongoDBDocumentCollectionManager getEntityManager() { return managerFactory.get("todos"); }

__DocumentCollectionManager__はCDI対応のBeanであり、__Template__と__Repositoryの両方で使用されます。

====  **  3.3. マッピング**

マッピングは、__Entity__モデルがDiana __EntityValue.__に変換されるアノテーション駆動プロセスです。

__Todo__モデルを定義することから始めましょう:

[source,java,gutter:,true]

@Entity public class Todo implements Serializable {

@Id("id")
public long id;
@Column
public String name;
@Column
public String description;
   //standard constructor
   //standard getters and setters
}
上に示すように、基本的なマッピングアノテーションがあります。

このモデルを操作するためには、__Template__クラスか__Repository__インターフェースが必要です。

====  **  3.4. テンプレートを使った作業**

** テンプレートは、エンティティモデルとDiana APIの間のブリッジです。ドキュメント指向データベースの場合は、まず__DocumentTemplate__ Beanをインジェクトすることから始めます。

[source,java,gutter:,true]

@Inject DocumentTemplate documentTemplate;

そして、__Todo__ Entityを操作できます。たとえば、__Todo__を作成できます。

[source,java,gutter:,true]

public Todo add(Todo todo) { return documentTemplate.insert(todo); }

あるいは、__id__で__Todo__を取得することもできます。

[source,java,gutter:,true]

public Todo get(String id) { Optional<Todo> todo = documentTemplate .find(Todo.class, id); return todo.get();//or any other proper Optional handling }

すべてのエンティティを選択するには、__DocumentQuery__を構築してから__select()__メソッドを呼び出します。

[source,java,gutter:,true]

public List<Todo> getAll() { DocumentQuery query = select().from("Todo").build(); return documentTemplate.select(query); }

そして最後に、__id__で__Todo__エンティティを削除できます。

[source,java,gutter:,true]

public void delete(String id) { documentTemplate.delete(Todo.class, id); }

====  **  3.5. リポジトリを使った作業**

__Template__クラスに加えて、情報を作成、更新、削除、取得するためのメソッドを持つ__Repository__インターフェースを通してエンティティを管理することもできます。

__Repository__インターフェースを使用するために、__Repositoryのサブインターフェースを提供するだけです。

[source,java,gutter:,true]

public interface TodoRepository extends Repository<Todo, String> { List<Todo> findByName(String name); List<Todo> findAll(); }

以下のメソッドとパラメータの命名規則により、このインタフェースの実装は実行時にCDI Beanとして提供されます。

この例では、__name__と一致するすべての__Todo__エンティティが__findByName()__メソッドによって取得されます。

これで使えるようになりました。

[source,java,gutter:,true]

@Inject TodoRepository todoRepository;

__Database__修飾子を使用すると、同じアプリケーション内で複数のNoSQLデータベースを扱うことができます。それは二つの属性、typeとproviderが付属しています。

データベースがマルチモデルの場合、どのモデルを使用しているかを指定する必要があります。

[source,java,gutter:,true]

@Inject @Database(value = DatabaseType.DOCUMENT) TodoRepository todoRepository;

さらに、同じモデルのデータベースが複数ある場合は、プロバイダを指定する必要があります。

[source,java,gutter:,true]

@Inject @Database(value = DatabaseType.DOCUMENT, provider="org.jnosql.diana.mongodb.document.MongoDBDocumentConfiguration") TodoRepository todoRepository;

サンプルを実行するには、jnosql-artemisモジュールにアクセスして次のコマンドを呼び出すだけです。

[source,bash,gutter:,true]

mvn package liberty:run

このコマンドはhttps://github.com/WASdev/ci.maven#liberty-maven-plugin[liberty-maven-のおかげでhttps://www.openliberty.io/[Open Liberty]サーバーを構築、デプロイ、および起動します。プラグイン]。

====  **  3.6. アプリケーションのテスト**

アプリケーションがRESTエンドポイントを公開するので、テストには任意のRESTクライアントを使用できます。ここではカールツールを使いました。

Todoクラスを保存するために:

[source,bash,gutter:,true]

curl -d '{"id":"120", "name":"task120", "description":"Description 120"}' -H "Content-Type: application/json" -X POST http://localhost:9080/jnosql-artemis/todos

そしてすべてのTodoを取得する:

[source,bash,gutter:,true]

curl -H "Accept: application/json" -X GET http://localhost:9080/jnosql-artemis/todos

Todoを1つだけ取得するには

[source,bash,gutter:,true]

curl -H "Accept: application/json" -X GET http://localhost:9080/jnosql-artemis/todos/120

===  **  4結論**

このチュートリアルでは、JNoSQLがNoSQLデータベースとのやり取りを抽象化する方法について説明しました。

** まず、我々は低レベルのコードでデータベースと対話するためにJNoSQL Diana APIを使いました。それから、私たちはJNoSQL Artemis APIを使い、親しみやすいJavaアノテーション付きモデル** と連携しました。

いつものように、この記事https://github.com/eugenp/tutorials/tree/master/persistence-modules/jnosql[over on Github]で使用されているコードを見つけることができます。