1. 概要

Eclipse JNoSQL は、JavaアプリケーションとNoSQLデータベースとの対話を簡素化するAPIと実装のセットです。

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

2. EclipseJNoSQL通信レイヤー

技術的に言えば、通信層は2つのモジュールで構成されています。 DianaAPIとドライバー。

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

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

2.1. Eclipse JNoSQL Diana API

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

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

  1. diana-key-value
  2. ダイアナコラム
  3. diana-ドキュメント

NoSQLグラフタイプは、 Apache ThinkerPop ですでにカバーされているため、APIではカバーされていません。

APIは、コアモジュールであるdiana-coreに基づいており、構成、ファクトリ、マネージャー、エンティティ、値などの一般的な概念の抽象化を定義します。

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

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

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

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

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

そして最後に、 diana-column モジュールが列指向の場合、次のようになります。

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

最新バージョンは、 MavenCentralにあります。

2.2. EclipseJNoSQLDianaドライバー

ドライバーは、最も一般的なNoSQLデータベース用のAPIの実装のセットです。

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

たとえば、 couchbase-driver は、diana-documentdiana-key-valueの両方を実装します。これは、Couchbaseがドキュメントとキーの両方であるためです。価値志向。

ドライバーが通常データベースベンダーによって提供されるリレーショナルデータベースとは異なり、ここではドライバーはEclipseJNoSQLによって提供されます。 ほとんどの場合、このドライバーは公式ベンダーライブラリのラッパーです。

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

たとえば、MongoDBの場合、次の依存関係を含める必要があります。

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

ドライバーの操作の背後にあるプロセスは簡単です。

まず、ConfigurationBeanが必要です。 クラスパスまたはハードコーディング値から構成ファイルを読み取ることにより、構成ファクトリーを作成できます。次に、それを使用してマネージャーを作成します。

最後に、マネージャーはエンティティをNoSQLデータベースとの間でプッシュおよび取得する責任があります

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

2.3. ドキュメント指向データベースの操作

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

最初に、データベースと適切に対話するためにアプリケーションに必要なすべての設定を提供する必要があります最も基本的な形式では、ホストを提供する必要があります。 MongoDBの実行中のインスタンスの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");

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

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'}
[]

2.4. 列指向データベースの操作

このセクションでは、組み込みバージョンのCassandraデータベースを使用するため、インストールは必要ありません。

列指向データベースを操作するプロセスは非常に似ています。 まず、Cassandraドライバーと列APIをpomに追加します。

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

次に、クラスパスの構成ファイル diana-cassandra.properties、で指定された構成設定が必要です。 または、ハードコードされた構成値を使用することもできます。

次に、同様のアプローチで、 ColumnFamilyManager を作成し、 ColumnEntity:の操作を開始します。

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

したがって、新しいエンティティを作成するには、 insert()メソッドを呼び出します。

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アプリケーションを実行します。

2.5. Key-Value指向データベースの操作

このセクションでは、Hazelcastを使用します。 Hazelcastは、キー値指向のNoSQLデータベースです。 Hazelcastデータベースの詳細については、このリンクを確認してください。

キー値指向タイプを使用するプロセスも同様です。 まず、これらの依存関係をpomに追加します。

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

次に、構成設定を提供する必要があります。 次に、 BucketManager を取得して、 KeyValueEntity:を操作できます。

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

次のBookモデルを保存するとします。

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()メソッドを呼び出して保存します。

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

次に、保存された Book インスタンスを取得するには:

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

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

3. EclipseJNoSQLマッピングレイヤー

マッピングレイヤーArtemisAPIは、Java注釈付きオブジェクトをNoSQLデータベースにマッピングするのに役立つAPIのセットです。 これは、Diana APIとCDI(Context and Dependency Injection)に基づいています。

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

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

3.1. 必要な依存関係

アプリケーションでArtemisを有効にするには、artemis-configuration依存関係を追加する必要があります。 MongoDBはドキュメント指向であるため、依存関係artemis-documentも必要です。

他のタイプのNoSQLデータベースの場合、 artemis-column、artemis-key-value 、およびartemis-graphを使用します。

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

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

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

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

3.2. ドキュメント構成ファイル

構成は、特定のデータベースのプロパティのセットであり、コードの外部で設定を提供できます。 デフォルトでは、META-INFリソースの下にjnosql.jsonファイルを提供する必要があります。

これは構成ファイルの例です。

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

ConfigurationUnit name属性を設定して、上記の構成名を指定する必要があります。構成が別のファイルにある場合は、次のように指定できます。 fileName属性を使用します。

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

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

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

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

DocumentCollectionManager はCDI対応のBeanであり、TemplateRepositoryの両方で使用されます。

3.3. マッピング

マッピングは、EntityモデルがDianaEntityValueに変換される注釈駆動型のプロセスです。

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

@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
}

上記のように、基本的なマッピングアノテーションがあります: @ Entity、@ Id、および@Column。

このモデルを操作するには、TemplateクラスまたはRepositoryインターフェースのいずれかが必要です。

3.4. テンプレートの操作

テンプレートは、エンティティモデルとDianaAPIの間のブリッジです。 ドキュメント指向データベースの場合、DocumentTemplateBeanを挿入することから始めます。

@Inject
DocumentTemplate documentTemplate;

次に、Todoエンティティを操作できます。 たとえば、Todoを作成できます。

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

または、idTodoを取得できます。

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

すべてのエンティティを選択するには、 DocumentQuery を作成してから、 select()メソッドを呼び出します。

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

そして最後に、idによってTodoエンティティを削除できます。

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

3.5. リポジトリの操作

Template クラスに加えて、リポジトリインターフェイスを介してエンティティを管理することもできます。このインターフェイスには、情報を作成、更新、削除、および取得するためのメソッドがあります。

リポジトリインターフェイスを使用するには、リポジトリ:のサブインターフェイスを提供するだけです。

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

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

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

これで使用できます。

@Inject
TodoRepository todoRepository;

Database 修飾子を使用すると、同じアプリケーションで複数のNoSQLデータベースを操作できます。 タイプとプロバイダーの2つの属性があります。

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

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

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

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

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

mvn package liberty:run

このコマンドは、 liberty-maven-plugin のおかげで、 Open Liberty サーバーを構築、デプロイ、および起動します。

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

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

したがって、Todoクラスを保存するには:

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

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

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

または、Todoを1つだけ取得するには:

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

4. 結論

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

まず、JNoSQL Diana APIを使用して、低レベルのコードでデータベースと対話しました。 次に、JNoSQL Artemis APIを使用して、使いやすいJava注釈付きモデルを操作しました。

いつものように、この記事で使用されているコードはGithubにあります。