首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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等注解:

@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

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/5JAV4l8As7gVZsNYmsBv
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券