概述

在这个教程中,我们将学习如何使用 Spring Data 模块和 ArangoDB 数据库。ArangoDB 是一个免费开源的多模型数据库系统,支持键值对、文档和图形数据模型,使用一个数据库核心和统一的查询语言:AQL(ArangoDB 查询语言)

我们将探讨所需的配置、基本的 CRUD 操作、自定义查询以及实体关系。

1. ArangoDB 配置

要安装 ArangoDB,首先需要从官方 ArangoDB 网站的 下载页面 下载包。

本教程的目的在于安装社区版 ArangoDB。详细的安装步骤可以在 这里 找到。

默认安装包含一个名为 _system 的数据库和一个名为 root 的用户,该用户可以访问所有数据库。

根据安装包,安装过程中可能会要求输入 root 密码,或者设置一个随机密码。

默认配置下,ArangoDB 服务器将在 8529 端口运行。

安装完成后,我们可以通过访问 http://localhost:8529 的 Web 界面与服务器交互。在后续教程中,我们将使用这个主机和端口进行 Spring Data 的配置。

另一种选择是使用 arangosh,一个用于与服务器交互的同步命令行界面。

让我们开始,通过 arangosh 创建一个名为 baeldung-database 的新数据库和一个名为 baeldung 的用户,该用户有权访问新创建的数据库。


2. 依赖项

要在应用程序中使用 Spring Data 与 ArangoDB,我们需要以下依赖项:

<dependency>
    <groupId>com.arangodb</groupId>
    <artifactId>arangodb-spring-data</artifactId>
    <version>3.5.0</version>
</dependency>

3. 配置

在开始处理数据之前,我们需要设置与 ArangoDB 的连接。为此,我们需要创建一个实现 ArangoConfiguration 接口的配置类:

@Configuration
public class ArangoDbConfiguration implements ArangoConfiguration {}

在其中,我们需要实现两个方法。第一个方法应创建一个 ArangoDB.Builder 对象,用于生成与我们的数据库的接口:

@Override
public ArangoDB.Builder arango() {
    return new ArangoDB.Builder()
      .host("127.0.0.1", 8529)
      .user("baeldung").password("password"); }

创建连接需要四个参数:主机、端口、用户名和密码。

也可以选择不在这类中设置这些参数:

@Override
public ArangoDB.Builder arango() {
    return new ArangoDB.Builder();
}

而是将它们存储在名为 arango.properties 的资源文件中:

arangodb.host=127.0.0.1
arangodb.port=8529
arangodb.user=baeldung
arangodb.password=password

这是 Arango 会查找的默认位置,可以通过传递自定义属性文件的 InputStream 来覆盖:

InputStream in = MyClass.class.getResourceAsStream("my.properties");
ArangoDB.Builder arango = new ArangoDB.Builder()
  .loadProperties(in);

第二个需要实现的方法是提供我们在应用中需要的数据库名称:

@Override
public String database() {
    return "baeldung-database";
}

此外,配置类还需要 @EnableArangoRepositories 注解,告诉 Spring Data 在哪里查找 ArangoDB 存储库:

@EnableArangoRepositories(basePackages = {"com.baeldung"})

4. 数据模型

接下来,我们将创建数据模型。对于此部分,我们将使用带有 nameauthorpublishDate 字段的文章表示法:

@Document("articles")
public class Article {

    @Id
    private String id;

    @ArangoId
    private String arangoId;

    private String name;
    private String author;
    private ZonedDateTime publishDate;

    // constructors
}

ArangoDB 实体必须有 @Document 注解,并传入集合名称作为参数。默认情况下,它是类名的小写形式。

接下来,我们有两个 id 字段。一个是带有 Spring 的 @Id 注解的,另一个是带有 Arango 的 @ArangoId 注解的。第一个存储生成的实体 id,第二个存储相同 id 但具有数据库中的正确位置。在我们的例子中,这两个值可能是 1articles/1

当我们定义了实体后,我们可以创建一个用于数据访问的仓库接口:

@Repository
public interface ArticleRepository extends ArangoRepository<Article, String> {}

它应该扩展 ArangoRepository 接口,并带有两个泛型参数。在我们的案例中,它是 Article 类,id 类型为 String

5. CRUD 操作

最后,我们可以创建一些具体的数据。

首先,我们需要依赖文章仓库:

@Autowired
ArticleRepository articleRepository;

然后,我们需要一个简单的 Article 类实例:

Article newArticle = new Article(
  "ArangoDb with Spring Data",
  "Baeldung Writer",
  ZonedDateTime.now()
);

现在,如果我们想将这篇文章存储在数据库中,只需调用 save 方法即可:

Article savedArticle = articleRepository.save(newArticle);

之后,我们可以确认 idarangoId 字段都已生成:

assertNotNull(savedArticle.getId());
assertNotNull(savedArticle.getArangoId());

要从数据库中获取文章,首先需要获取其 id:

String articleId = savedArticle.getId();

然后简单地调用 findById 方法:

Optional<Article> articleOpt = articleRepository.findById(articleId);
assertTrue(articleOpt.isPresent());

有了文章实体,我们可以更改其属性:

Article article = articleOpt.get();
article.setName("New Article Name");
articleRepository.save(article);

最后,再次调用 save 方法来更新数据库条目。它不会创建新的条目,因为实体的 id 已经分配给了它。

删除记录也是一个直接的操作。我们只需调用仓库的 delete 方法:

articleRepository.delete(article)

也可以通过 id 删除它:

articleRepository.deleteById(articleId)

6. 自定义查询

使用 Spring DataArangoDB,我们可以利用衍生仓库功能,简单地通过方法名称定义查询:

@Repository
public interface ArticleRepository extends ArangoRepository<Article, String> {
    Iterable<Article> findByAuthor(String author);
}

另一种选择是使用 AQL(ArangoDb 查询语言)。这是一种定制的语法语言,我们可以通过 @Query 注解在 Spring Data JPA 中使用。

现在,让我们看看一个基本的 AQL 查询,它将找到给定作者的所有文章并按发布日期排序:

@Query("FOR a IN articles FILTER a.author == @author SORT a.publishDate ASC RETURN a")
Iterable<Article> getByAuthor(@Param("author") String author);

7. 关系

ArangoDB 提供了在实体之间创建关系的可能性。

例如,我们可以创建一个 Author 类与其文章之间的关系。

为此,我们需要定义一个新的链接属性,带有 @Relations 注解,它将包含给定作者撰写的文章链接:

@Relations(edges = ArticleLink.class, lazy = true)
private Collection<Article> articles;

如您所见,ArangoDB 中的关系是通过带有 @Edge 注解的单独类定义的:

@Edge
public class ArticleLink {

    @From
    private Article article;

    @To
    private Author author;

    // constructor, getters and setters
}

它有两个字段,分别带有 @From@To 注解。它们定义了入向和出向的关系。

8. 结论

在这个教程中,我们学习了如何配置 ArangoDB 并使用它与 Spring Data。我们涵盖了基本的 CRUD 操作、自定义查询以及实体关系。最后附上 GitHub 源码