Jakarta NoSQL 是Jakarta EE中的一個規範, 最近被批准爲EE4J項目,它可以幫助開發人員使用Java和NoSQL技術來創建企業級的應用程序。JNoSQL是Jakarta NoSQL的參考實現,它爲一系列NoSQL數據庫(如Cassandra、MongoDB、 Neo4J、CouchDB和 OrientDB等)提供了一組API和一個標準實現。
Jakarta NoSQL是由通信層(Diana)組成的,它提供了一組用於定義與NoSQL數據庫通信的API。根據NoSQL數據庫的不同類型,它包含了四個模塊:鍵值(Key-Value)、列族(Column Family)、文檔(Document)和圖(Graph);映射層(Artemis)提供了一系列API來幫助開發人員將Java應用程序與NoSQL數據庫集成。映射層是註解驅動的,它使用了 CDI和 Bean Validation等技術,這使得開發人員使用起來更加簡單。也可以將映射層與傳統RDBMS世界中的JPA/Hibernate進行比較。
讓我們更深入地探討一下如何與鍵值、列族、文檔和圖等NoSQL數據庫進行通信。
實體的定義與JPA非常相似。基本上也是使用@Entity、@Id、@Column等註解:
@Entity
public class Person {
@Id
private long id;
@Column
private String name;
@Column
private List phones;
}
存儲庫和Spring的數據存儲庫看起來很像,可以通過 Repository<T, ID> 進行擴展:
public interface PersonRepository extends Repository {
List<Person> findByName(String name);
Stream<Person> findByPhones(String phone);
}
現在,我們必須稍微調整一下它,因爲maven構件會根據NoSQL數據庫的類型、設置配置以及如何在服務中注入存儲庫而改變。
我們比較一下列和文檔NoSQL數據庫之間的差異:
列(Column)
Maven依賴的構件如下:
<dependency>
<groupId>org.jnosql.artemis</groupId>
<artifactId>artemis-column</artifactId>
<version>0.0.9</version>
</dependency>
<dependency>
<groupId>org.jnosql.diana</groupId>
<artifactId>cassandra-driver</artifactId>
<version>0.0.9</version>
</dependency>
用於設置ColumnFamilyManager生產者的示例如下:
@ApplicationScoped
public class ColumnFamilyManagerProducer {
private static final String KEY_SPACE = "developers";
private ColumnConfiguration<> cassandraConfiguration;
private ColumnFamilyManagerFactory managerFactory;
@PostConstruct
public void init() {
cassandraConfiguration = new CassandraConfiguration();
managerFactory = cassandraConfiguration.get();
}
@Produces
public ColumnFamilyManager getManagerCassandra() {
return managerFactory.get(KEY_SPACE);
}
}
最後,是一個如何執行一些插入/查詢的示例:
Person person = Person.builder()
.withPhones(Arrays.asList("234", "432"))
.withName("Name")
.withId(id)
.build();
//使用 ColumnTemplate
ColumnTemplate columnTemplate = container.select(CassandraTemplate.class).get();
Person saved = columnTemplate.insert(PERSON);
System.out.println("Person saved" + saved);
ColumnQuery query = select().from("Person").where(eq(Column.of("id", 1L))).build();
Optional<Person> person = columnTemplate.singleResult(query);
System.out.println("Entity found: " + person);
//使用 PersonRepository
PersonRepository repository = container.select(PersonRepository.class).select(ofColumn()).get();
Person saved = repository.save(PERSON);
System.out.println("Person saved" + saved);
Optional<Person> person = repository.findById(1L);
System.out.println("Entity found: " + person);
文檔(Document)
Maven依賴的構件如下:
<dependency>
<groupId>org.jnosql.artemis</groupId>
<artifactId>artemis-document</artifactId>
<version>0.0.9</version>
</dependency>
<dependency>
<groupId>org.jnosql.diana</groupId>
<artifactId>mongodb-driver</artifactId>
<version>0.0.9</version>
</dependency>
用於設置DocumentCollectionManager的生產者示例如下:
@ApplicationScoped
public class DocumentCollectionManagerProducer {
private static final String COLLECTION = "developers";
private DocumentConfiguration configuration;
private DocumentCollectionManagerFactory managerFactory;
@PostConstruct
public void init() {
configuration = new MongoDBDocumentConfiguration();
Map<String, Object> settings = Collections.singletonMap("mongodb-server-host-1", "localhost:27017");
managerFactory = configuration.get(Settings.of(settings));
}
@Produces
public DocumentCollectionManager getManager() {
return managerFactory.get(COLLECTION);
}
}
最後,是一個如何執行一些插入/查詢的示例:
Person person = Person.builder()
.withPhones(Arrays.asList("234", "432"))
.withName("Name")
.withId(id)
.build();
//使用 DocumentTemplate
DocumentTemplate documentTemplate = container.select(DocumentTemplate.class).get();
Person saved = documentTemplate.insert(person);
System.out.println("Person saved" + saved);
DocumentQuery query = select().from("Person")
.where(eq(Document.of("_id", id))).build();
Optional<Person> personOptional = documentTemplate.singleResult(query);
System.out.println("Entity found: " + personOptional);
//使用 PersonRepository
PersonRepository repository = container.select(PersonRepository.class)
.select(ofDocument()).get();
repository.save(person);
List<Person> people = repository.findByName("Name");
System.out.println("Entity found: " + people);
repository.findByPhones("234").forEach(System.out::println);
有關Jakarta NoSQL參考實現的更多細節可以在JNoSQL 上找到。
在Jakarta One 上還有一個Jakarta NoSQL的演示視頻。
想要投稿的用戶可以訂閱郵件列表,或者通過Twitter和我們聯繫。
原文鏈接: