HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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:001894

评论

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

如何上架自己的应用到各大应用商店?

孙叫兽

证书 安卓 appstore 应用宝 引航计划

借鉴AQS的CHL思路解决消息多线程消费顺序ACK问题

Coder的技术之路

AQS 多线程 高并发 架构设计 消息队列

Go 杂谈——interface与nil的细节让我出了线上BUG

HZFEStudio

Go 语言

Java Stream 源码分析

Yano

Java stream

9个国外最佳免费编程学习一站式网站,谁用谁知道!

北游学Java

Java c++ php JavaScript

2021年程序员可以做哪些副业?

孙叫兽

程序员 副业 副业赚钱

事关每个程序员的职业规划与履历

孙叫兽

生涯规划 程序员 职业规划 人生修炼

【架构实战营】第3模块作业

swordman

架构实战营

Android团队怎样搭建自己的开发仓库

寻找生命中的美好

android maven nexus library

模块3作业 消息队列架构设计文档

TH

架构实战营

消息队列构架设计文档

Chris Cheng

用组合式创新模型做产品建模

石云升

组合式创新 5月日更 产品建模

区块链如何赋能“链”金融

CECBC

金融

网站优化第一次网页加载的速度的办法与思路。

孙叫兽

性能优化 网站 性能调优

第 0 期架构训练营模块 3 作业

架构实战营

所谓区块链去中心化社交产品,究竟是创新还是复旧?

CECBC

区块链

花了两天时间用html+css+js做了一个网页版坦克大战游戏

孙叫兽

JavaScript html 坦克大战

模块3 学习总结

TH

架构实战营

HBase与Hadoop的关系

大数据技术指南

HBase 5月日更

架构实战营 - 模块 03 作业

架构实战营

FFmpeg音视频处理工具三剑客(ffmpeg、ffprobe、ffplay)

liuzhen007

音视频 5月日更

GoF23 中的对象行为模式草图!

鲁米

通过 Netty、ZooKeeper 手撸一个 RPC 服务!

Yano

Java 微服务 Netty RPC

Spark中将DAG划分为Stage核心算法

五分钟学大数据

spark 5月日更

读写锁

wzh

Java 并发编程 并发 JUC

ceph-csi源码分析(6)-rbd driver-nodeserver分析(下)

良凯尔

Kubernetes 源码分析 Ceph CSI

模块1作业

刘丽

优秀程序员都在注意的十个点

好好学习,天天向上

Java 设计模式 代码 技巧

Semaphore

wzh

Java 并发 java工具类

架构实训营 作业三——消息队列架构设计文档

开拓纪

第三章作业 #架构实战营

消息队列架构设计

俞嘉彬

架构实战营

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