
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和我们联系。
原文链接:
更多内容推荐
Java Persistence 2.0 最终建议草案
Java Persistence API 2.0版已经进入最终建议草案阶段。它为条件查询增加了类型安全API及相应的元模型(metamodel)API,并支持Bean Validation。
在 Spring 中访问 Redis
2019 年 2 月 27 日
53|DataStream & DataSet 与 Table 相互转换
2020 年 10 月 29 日
2008 EclipseCon 综述
上周的EclipseCon大会给超过1400个与会人员带来了300份演讲资料和教程。Infoq注意到这一精采会议文献选辑包括了新宣布的Eclipse Runtime以及EclipseLink和OSGi的进展。
面试官问你 MyBatis SQL 是如何执行的?把这篇文章甩给他
MyBatis 是第一个支持自定义 SQL、存储过程和高级映射的类持久框架。MyBatis 消除了大部分 JDBC 的样板代码、手动设置参数以及检索结果。MyBatis 能够支持简单的 XML 和注解配置规则。使 Map 接口和 POJO 类映射到数据库字段和记录。
甲骨文发布 JSON Database,对标 MongoDB
甲骨文发布 JSON Database,这是一款全新的云服务,专为寻求简单易用、经济高效的JSON数据库和NoSQL API的开发人员而打造。
开发者如何看 Java 发展趋势?
Java作为一门长青的编程语言,在比较长的发展时间里,时常会有唱衰的声音。但Java一直在不断向前发展,受欢迎程度也一直很高,TIOBE榜单常年保持在Top 2,未来Java将如何发展呢?本文搜集了一些国外开发者和相关从业人员的看法
Java EE 终于通过 Jakarta EE 8 “开源”
Eclipse基金会日前发布了开源的Jakarta EE 8,它是第一款真正意义上开源、厂商中立的Java企业版。
云上大数据:云计算遇上大数据,为什么堪称天作之合?
云上大数据服务的出现和发展,使得在云上存储、处理和查询大数据变得简单而高效,也把云计算的计算存储分离特性体现得淋漓尽致。
2020 年 4 月 1 日
JPA 2.2 带来一些备受期待的变更
JPA 2.2去年夏天发布,交付了一些备受期待的功能改善,特别是提供了对Java 8特性的更好支持,例如支持Date和Time API以及获取Stream形式的查询结果。
在 Spring 中同时访问多种不同数据库
在企业应用中同时使用多种数据库总不是一件容易的事。使用Spring框架时,使用单一数据库是非常容易的,但如果要同时访问多个数据库的话事件就变得复杂多了。本文示范了一种在Spring 下同时访问多种数据库的方法,而且尽量地简化配置改动。
深入理解 Spring Cloud 的配置抽象
2019 年 5 月 16 日
MongoDB、Java 及 ORM
MongoDB是一种非常易用的NoSQL方案,Brian C. Dilley在这篇文章里介绍了MongoDB的优劣势,并介绍了MJORM项目。MJORM用于MongoDB,是一个没有注解的Java ORM库。
部署 Java EE 应用到 Azure: 第 2 部分
Azure 中文精选
Java 十大常用框架介绍 (spring 系 +dubbo+RabbitMQ+Ehcache+redis)
一、SpringMVC
2020 年 7 月 29 日
设计数据持久层(上):理论分析
讲一讲最后面一层的数据持久层怎样设计,使整个设计层面上的体系变得完整。
2019 年 11 月 6 日
DataNucleus 访问平台 1.0 最终版发布
Java持久化平台JPOX的继任者DataNucleus发布了DataNucleus访问平台(DataNucleus Access Platform)1.0.0,为使用JDO/JPA API的Java应用提供了对多种数据存储的访问。
Java 对象持久性:联盟状态
在这个虚拟座谈中,InfoQ.com和ODBMS.org的编辑(Floyd Marinescu和Roberto V. Zicari)向一些杰出的持久性解决方案的构架师咨询了他们对于目前Java社区中持久性联盟现状的一些看法。
06 技术选型(二)分布式数据库、CAP 、NoSQL
架构师训练营第 1 期第 6 周学习笔记,分布式数据库、CAP 原理、NoSQL 数据库架构……TL;DL
2020 年 11 月 1 日
社交公司们的大数据贡献
Hadoop开源以后,三大社交公司Facebook、LinkedIn和Twitter都加入了这个生态圈,并做出巨大贡献。
2018 年 3 月 28 日
推荐阅读
Extensible XML authoring 扩展原理
2020 年 4 月 2 日
MicroProfile 对微服务框架的影响 | InfoQ 圆桌
Java EE 规范重命名为 Jakarta EE
构造器依赖注入:官方为什么推荐使用构造器注入?
2020 年 2 月 6 日
NoSQL 的现状
程序员练级攻略:分布式架构经典图书和论文
2018 年 7 月 12 日
部署 Java EE 应用到 Azure: 第 1 部分
电子书

大厂实战PPT下载
换一换 
李运华 | 前阿里 P9 技术专家 《从0开始学架构》专栏作者
刘潭仁 | 顺丰科技 架构委员会负责人
高楼 | 盾山科技 CEO,7DGroup 创始人 《高楼的性能工程实战课》专栏作者
评论