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つのモジュールを定義します。
-
ダイアナキー値
-
ダイアナコラム
-
ダイアナ文書
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]で使用されているコードを見つけることができます。