EclipseJNoSQLのガイド
1. 概要
Eclipse JNoSQL は、JavaアプリケーションとNoSQLデータベースとの対話を簡素化するAPIと実装のセットです。
この記事では、NoSQLデータベースと対話するようにJNoSQLを設定および構成する方法を学習します。 コミュニケーションレイヤーとマッピングレイヤーの両方を使用します。
2. EclipseJNoSQL通信レイヤー
技術的に言えば、通信層は2つのモジュールで構成されています。
APIはNoSQLデータベースタイプへの抽象化を定義しますが、ドライバーはほとんどの既知のデータベースの実装を提供します。
これを、リレーショナルデータベースのJDBCAPIおよびJDBCドライバーと比較できます。
2.1. Eclipse JNoSQL Diana API
簡単に言うと、NoSQLデータベースには、Key-Value、Column、Document、Graphの4つの基本的なタイプがあります。
また、Eclipse JNoSQL Diana APIは、次の3つのモジュールを定義しています。
- diana-key-value
- ダイアナコラム
- 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-documentとdiana-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であり、TemplateとRepositoryの両方で使用されます。
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);
}
または、idでTodoを取得できます。
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データベースとの相互作用を抽象化する方法について説明しました。
いつものように、この記事で使用されているコードはGithubにあります。