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和我们联系。
原文链接:
Introducing Jakarta NoSQL
评论