概述
在这个教程中,我们将学习如何使用 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. 数据模型
接下来,我们将创建数据模型。对于此部分,我们将使用带有 name、author 和 publishDate 字段的文章表示法:
@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 但具有数据库中的正确位置。在我们的例子中,这两个值可能是 1 和 articles/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);
之后,我们可以确认 id
和 arangoId
字段都已生成:
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 Data
和 ArangoDB
,我们可以利用衍生仓库功能,简单地通过方法名称定义查询:
@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 源码