Base 北京的同学看过来!3 月 24 日 阿里云瑶池数据库峰会将在北京落地。报名请戳👉 了解详情
写点什么

Jakarta NoSQL 介绍

  • 2019-10-31
  • 本文字数:2526 字

    阅读完需:约 8 分钟

Jakarta NoSQL介绍

Jakarta NoSQL 是 Jakarta EE 中的一个规范, 最近被批准为 EE4J 项目,它可以帮助开发人员使用 Java 和 NoSQL 技术来创建企业级的应用程序。JNoSQL 是 Jakarta NoSQL 的参考实现,它为一系列 NoSQL 数据库(如CassandraMongoDBNeo4JCouchDBOrientDB等)提供了一组 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 等注解:


@Entitypublic 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 生产者的示例如下:


@ApplicationScopedpublic 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();
//使用 ColumnTemplateColumnTemplate 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);
//使用 PersonRepositoryPersonRepository 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 的生产者示例如下:


@ApplicationScopedpublic 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();
//使用 DocumentTemplateDocumentTemplate 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);
//使用 PersonRepositoryPersonRepository 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


2019-10-31 08:001642

评论

发布
暂无评论
发现更多内容

Docker架构

混沌畅想

Docker 容器 Docker架构

在线EXCEL编辑器-Luckysheet

奇异石榴果

Java 开源 Excel bigtable js

程序员喜欢的 5 款最佳最牛代码比较工具

程序员生活志

编程 工具

架构师训练营第一周作业

爱码士

架构设计

6小时搞定云原生:从基础概念到上手实践

京东科技开发者

云原生

项目吐槽之需求分析一

Geek_XOXO

项目管理 pmp

不会java的人能不能读《Head First设计模式》?

Nydia

技术都是相通的

小黄鱼

极客大学架构师训练营

【得物技术】谈谈缓存的一二三四五

得物技术

缓存 架构 技术 缓存穿透 缓存击穿

「架构师训练营」第 1 周作业 - 食堂就餐卡系统设计

小黄鱼

极客大学架构师训练营

iOS性能优化 — 二、卡顿监控及处理

iOSer

性能优化 编程语言 监控 ios开发 卡顿

勾魂!在Github白嫖左程云1470页数据结构与算法+视频

996小迁

Java 架构 面试

普通人如何站在时代风口学好AI?这是我看过最好的答案

华为云开发者联盟

AI 算法

发布3个月获得5K Star的Luckysheet - 基于MIT协议的开源电子表格

奇异石榴果

Java 开源 大前端 Excel html/css

架构师训练营 1 期 - 第五周 - 技术选型

三板斧

极客大学架构师训练营

技术体系的构成

凌晞

技术 技术管理 研发体系

架构师训练营第2期 第1周 作业二:学习总结.md

老坛酸菜

一文搞懂ReactNative生命周期的进化

凌宇之蓝

react.js 面试 大前端 React Native

一文带你读懂 Swift 社区最新开源的算法库

镜画者

ios swift 算法 apple

1024!奈学教育致敬程序员3+2战略发布会重磅来袭

奈学教育

1024 奈学教育

极客时间架构师训练营第一周学习总结

爱码士

课程总结

一份超级完整实用的PyCharm图解教程,8K字赶紧收藏起来

计算机与AI

Python IDLE 开发环境

MyBatis-技术专题-动态SQL

洛神灬殇

为什么说容器的崛起预示着云原生时代到来?

华为云开发者联盟

容器 云原生

MyBatis-技术专题-拦截器介绍

洛神灬殇

Scikit-Learn中的特征排名与递归特征消除

计算机与AI

学习 数据科学 特征选择 降维 scikit-learn

分布式文件存储数据库 MongoDB

哈喽沃德先生

数据库 nosql mongodb mongo 非关系型数据库

项目吐槽之需求分析二

Geek_XOXO

项目管理 pmp 项目实战

1024!奈学教育致敬程序员3+2战略发布会重磅来袭

古月木易

程序员 奈学教育

想自己写框架?不会写Java注解可不行

Java架构师迁哥

【API进阶之路】研发需求突增3倍,测试团队集体闹离职

华为云开发者联盟

软件开发 开发 开发测试

Jakarta NoSQL介绍_编程语言_Diogo Carleto_InfoQ精选文章