使用 Jakarta NoSQL 1.0.0-b5 探索 Java 的 MongoDB 功能

NoSQL 是一种在多个领域越来越受欢迎和成熟的数据库解决方案,包括金融和电子商务等企业解决方案的多个领域。在本教程中,我们将解释如何使用 Jakarta EE 和最新版本的 Jakarta NoSQL 来使用 MongoDB 和 Java。

如果您不熟悉 Jakarta NoSQL,它是 Jakarta 规范,旨在让 JavaNoSQL 之间更轻松交互。主要目标是使用 commons annotation 来映射目前支持 key-value、wide-column、document 和 graph 的多种数据库类型。

Jakarta NoSQL 最新版本1.0.0-b5具有三个热门特性:

  • 支持备案

  • 简化数据库配置

  • 增强文件

为了探索这些功能,让我们在 MongoDB 实例上使用 Jakarta NoSQL 和 Java SE 创建一个简单的MongoDB应用程序。第一步是安装和执行数据库。为了让它更流畅,让我们运行一个 Docker 镜像。

docker run -d --name mongodb-instance -p 27017:27017 mongo

运行 MongoDB 后,让我们返回 Java 应用程序端并包含 Maven 依赖项。因此,需要包括 CDI、JSON-B 和 JSON-P 实现,此外,还包括 Jakarta NoSQL 依赖项。
我们将创建一个Book包含 ISBN、书名、作者、年份和版本的实体。该book实体是一个不可变的案例,一旦您发布它就不会更改它。

@Entity
public record Book(@Id String isbn,
                   @Column("title") String title,
                   @Column("author") String author,
                   @Convert(YearConverter.class) @Column("year") Year year,
                   @Column("edition") int edition) {


    public Book nextEdition(String isbn, Year year) {
        Objects.requireNonNull(isbn, "isbn is required");
        Objects.requireNonNull(year, "year is required");
        return new Book(isbn, this.title, this.author, year, this.edition + 1);
    }

}

作为记录的Book实体减少了样板文件以创建不可变类。必须强调的是,记录功能仍然是一个 Java 类,因此您可以创建诸如构建器之类的方法,以便像我们一样更轻松地创建记录或新版本方法。

下一步是数据库属性。这个新版本探索了约定优于配置的哲学。因此,您不再需要使用任何类。它需要属性来创建它。这些更改破坏了与以前版本的兼容性。请检查JNoSQL 驱动程序存储库中的驱动程序属性。

jnosql.document.database=library
jnosql.mongodb.host=localhost:27017

下一步是执行,我们将创建与 MongoDB 的第一次交互,将使用接口作为第一步Template,它采用数据库中的典型行为。

try (SeContainer container = SeContainerInitializer.newInstance().initialize()) {
      String id = UUID.randomUUID().toString();
      long start = System.currentTimeMillis();
      Template template = container.select(Template.class).get();
      Book book = new Book(id, "Java Concurrency in Practice", " Brian Goetz", Year.of(2006), 1);
      template.insert(book);
      Optional<Book> optional = template.find(Book.class, id);
      System.out.println("The result " + optional);
      long end = System.currentTimeMillis() - start;
      System.out.println("The total operation is: " + end);
      template.delete(Book.class, id);
  }

与任何代码设计一样,Template一旦它采用 Jakarta NoSQL 支持的 NoSQL 数据库类型中的标准行为,就会对功能有限制。文档类型有专门的 NoSQL 类型;有DocumentTemplate,我们可以在其中探索文档类型的功能。

try (SeContainer container = SeContainerInitializer.newInstance().initialize()) {
    DocumentTemplate template = container.select(DocumentTemplate.class).get();
    Book first = new Book(randomUUID().toString(), "Effective Java", "Joshua Bloch",
            Year.of(2001), 1);
    Book second = first.nextEdition(randomUUID().toString(), Year.of(2008));
    Book third = second.nextEdition(randomUUID().toString(), Year.of(2018));
    template.insert(List.of(first, second, third));
    DocumentQuery query = DocumentQuery.select().from("Book")
            .where("title").eq("Effective Java")
            .orderBy("year").desc().build();

    System.out.println("The Effective java editions: ");
    template.select(query).forEach(System.out::println);

    template.delete(Book.class, first.isbn());
    template.delete(Book.class, second.isbn());
    template.delete(Book.class, third.isbn());

}

我们可以插入并按版本降序列出所有书籍。它DocumentTemplate具有文档类型的特征,您可以在其中进一步探索特定的 NoSQL 数据库功能。因此有DocumentTemplate specializations。可以在 Mapping specializations上查看几个样本 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容