
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和我们联系。
原文链接:
更多内容推荐
使用 TypeScript 访问 MySQL 数据库
TypeScript已经成为一个强大的Web应用程序开发环境,在与标准JavaScript保持一致的同时,提供了显著的改进。在本文中,我们将深入探讨使用TypeScript相关的细节,创建一个强大的解决方案来管理服务器端TypeScript的数据库访问。
亚马逊 CTO 深入浅出讲图数据库:数据间关系的力量
看Amazon的图数据库如何设计。
Speedment 发布了 Stream ORM 3.0.1 版
基于Java Stream的Speedment ORM发布了3.0.1版,其特性包括全新的声明式Java 8 Stream API、改进的用户接口以及更好的代码生成。本文是InofQ就此产品对Speedment CTO的访谈。
在 Spring 中访问 MongoDB
2019-02-27
Week6 学习总结
分布式数据库与NoSQL
2020-07-15
在 Spring 中同时访问多种不同数据库
在企业应用中同时使用多种数据库总不是一件容易的事。使用Spring框架时,使用单一数据库是非常容易的,但如果要同时访问多个数据库的话事件就变得复杂多了。本文示范了一种在Spring 下同时访问多种数据库的方法,而且尽量地简化配置改动。
Mark Richard 的《Java 消息服务》第二版
Mark Richards的新书《Java消息服务》第二版覆盖了JMS的许多主题,例如两种编程模型:发布和订阅模型以及点对点模型,消息过滤和事务等。InfoQ与Mark谈论了跟他的新作。谈话的内容包括EJB 3.0,Spring的消息驱动对象(Message Driven POJO's,MDP)和企业服务总线(ESB) 架构。
产品图鉴:哪些分布式数据库值得看?
今天这一讲,我会把视角切换到产品方向,为你做一次整体介绍。所以,你也可以将这一讲当作一个产品版的课程索引。
2020-10-16
6.6Doris 分析案例(一): NoSQL 案例
Doris分析案例(一): NoSQL案例
2020-11-02
MySQL 的 Docker 容器化大规模实践
2018-09-12
NoSQL Workbench for Amazon DynamoDB,预览版现已推出
Amazon DynamoDB 的灵活性一直让我赞不绝口,它给我们的客户提供了一个完全托管的键值和文档数据库,可以轻松地从每月几个请求扩展到每秒数百万个请求。
Java 近期新闻:JDK 21 序列集合、JDK 20 向量 API、Gen ZGC、Hilla 2.0
Java近期新闻综述。
开发者如何看 Java 发展趋势?
Java作为一门长青的编程语言,在比较长的发展时间里,时常会有唱衰的声音。但Java一直在不断向前发展,受欢迎程度也一直很高,TIOBE榜单常年保持在Top 2,未来Java将如何发展呢?本文搜集了一些国外开发者和相关从业人员的看法
数据存储:NoSQL 与 RDBMS 如何取长补短、相辅相成?
今天,我通过三个案例分别对比了缓存数据库Redis、时间序列数据库InfluxDB、搜索数据库ES和MySQL的性能。
2020-05-14
Wix 是如何把 MySQL 当 NoSQL 用的
近年来,NoSQL引擎已经成为主流。许多开发人员都将NoSQL引擎(如MongoDB、Cassandra或Redis)作为构建应用程序的首选。Yoav Abrahami是免费建站平台Wix的首席架构师。他认为,MySQL是一个更好的NoSQL选项,理由是:MySQL是一个可靠的引擎,有大量的在线资料可供参考,而且作为键/值存储,能够提供卓越的性能、易用性和稳定性。
BigTable 的开源实现:HBase
今天我们就来领略一下BigTable对应的NoSQL系统HBase,看看它是如何大规模处理海量数据的。
2018-11-29
甲骨文发布 JSON Database,对标 MongoDB
甲骨文发布 JSON Database,这是一款全新的云服务,专为寻求简单易用、经济高效的JSON数据库和NoSQL API的开发人员而打造。
高性能 NoSQL
我们不能盲目地迷信NoSQL是银弹,而应该将NoSQL作为SQL的一个有力补充。
2018-06-02
2021 Java 开发者路线图
成为一名合格的Java开发人员需要多长时间?
座谈:Java 对象持久性
在这个虚拟座谈中,<a href="http://infoQ.com/cn">InfoQ.com</a>和<a href="http://odbms.org/">ODBMS.org</a>的编辑(Floyd Marinescu和Roberto V. Zicari)向一些杰出的持久性解决方案的构架师咨询了他们对于目前Java社区中持久性联盟现状的一些看法。
推荐阅读
如何将 Redis 用于微服务通信的事件存储
Java 近期新闻:JDK 18 进入 RD2、Spring Boot 更新、GraalVM 22、以及 WildFly 2022 年发布计划
程序员练级攻略:数据库
2018-07-05
嵌入式数据库 Perst 3.0 发布了
架构师训练营 No.6 周总结
2020-07-15
Spring Data 常见错误
2021-06-02
SAP 的 HANA 战略(上)
2018-09-05
电子书

大厂实战PPT下载
换一换 
李向辉 | 腾讯云 容器技术专家
高振泽 | 美团 前端技术专家
王栋 | 字节跳动 基础架构研发工程师
评论