Перейти к основному содержимому

Весенние данные с ArangoDB

· 6 мин. чтения

1. Введение

В этом руководстве мы узнаем, как работать с модулем Spring Data и базой данных ArangoDB . ArangoDB — это бесплатная мультимодельная система баз данных с открытым исходным кодом. Он поддерживает модели данных «ключ-значение», «документ» и «график» с одним ядром базы данных и унифицированным языком запросов: AQL (язык запросов ArangoDB).

Мы рассмотрим необходимую конфигурацию, основные операции CRUD, пользовательские запросы и отношения сущностей.

2. Настройка ArangoDB

Чтобы установить ArangoDB, нам сначала нужно загрузить пакет со страницы загрузки официального сайта ArangoDB.

Для целей этого руководства мы установим версию сообщества ArangoDB. Подробные шаги установки можно найти здесь .

Установка по умолчанию содержит базу данных с именем

_system

и

root

пользователя, имеющего доступ ко всем базам данных.

В зависимости от пакета установщик либо запросит пароль root в процессе установки, либо установит случайный пароль.

С конфигурацией по умолчанию мы увидим сервер ArangoDB, работающий на

8529

порту.

После завершения настройки мы можем взаимодействовать с сервером, используя веб-интерфейс, доступный на

http://localhost:8529

. Мы будем использовать этот хост и порт для конфигурации Spring Data позже в этом руководстве.

В качестве альтернативы мы также можем использовать

arangosh

синхронную оболочку для взаимодействия с сервером.

Начнем с запуска

arangosh

для создания новой базы данных с именем

foreach-database

и пользователем

foreach

с доступом к этой вновь созданной базе данных.

arangosh> db._createDatabase("foreach-database", {}, [{ username: "foreach", passwd: "password", active: true}]);

3. Зависимости

Чтобы использовать Spring Data с ArangoDB в нашем приложении, нам понадобится следующая зависимость :

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

4. Конфигурация

Прежде чем мы начнем работать с данными, нам нужно настроить подключение к 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("foreach").password("password"); }

Для создания подключения необходимо четыре параметра: хост, порт, имя пользователя и пароль.

В качестве альтернативы мы можем пропустить настройку этих параметров в классе конфигурации:

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

Поскольку мы можем хранить их в файле ресурсов arango.properties :

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

Это место по умолчанию для поиска Аранго. Его можно перезаписать, передав InputStream в файл пользовательских свойств:

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

Второй метод, который мы должны реализовать, — просто указать имя базы данных, которое нам нужно в нашем приложении:

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

Кроме того, класс конфигурации нуждается в аннотации @EnableArangoRepositories , которая сообщает Spring Data, где искать репозитории ArangoDB:

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

5. Модель данных

В качестве следующего шага мы создадим модель данных. Для этой части мы будем использовать представление статьи с полями 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. Один с аннотацией @Id от Spring, а второй с аннотацией @ArangoId от Arango . В первом хранится сгенерированный идентификатор объекта. Второй хранит ту же самую гайку id с правильным расположением в базе данных. В нашем случае это могут быть соответственно 1 и article/1 .

Теперь, когда мы определили сущность, мы можем создать интерфейс репозитория для доступа к данным:

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

Он должен расширить интерфейс ArangoRepository двумя общими параметрами. В нашем случае это класс Article с идентификатором типа String .

6. CRUD-операции

Наконец, мы можем создать некоторые конкретные данные.

Для начала нам понадобится зависимость от репозитория статей:

@Autowired
ArticleRepository articleRepository;

И простой экземпляр класса Article :

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

Теперь, если мы хотим сохранить эту статью в нашей базе данных, мы должны просто вызвать метод сохранения :

Article savedArticle = articleRepository.save(newArticle);

После этого мы можем убедиться, что поля id и arangoId сгенерировались:

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

Чтобы получить статью из базы данных, нам нужно сначала получить ее идентификатор:

String articleId = savedArticle.getId();

Затем просто вызовите метод findById :

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

Имея сущность article, мы можем изменить ее свойства:

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

Наконец, снова вызовите метод сохранения , чтобы обновить запись в базе данных. Он не создаст новую запись, потому что идентификатор уже был назначен объекту.

Удаление записей также является простой операцией. Мы просто вызываем метод удаления репозитория :

articleRepository.delete(article)

Удалить его по id тоже можно:

articleRepository.deleteById(articleId)

7. Пользовательские запросы

С Spring Data и ArangoDB мы можем использовать производные репозитории и просто определить запрос по имени метода:

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

Второй вариант — использовать AQL (язык запросов ArangoDb) . Это собственный язык синтаксиса, который мы можем применить с помощью аннотации @Query .

Теперь давайте рассмотрим простой запрос AQL, который найдет все статьи с заданным автором и отсортирует их по дате публикации:

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

8. Отношения

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 . Они определяют входящие и исходящие отношения.

9. Заключение

В этом руководстве мы узнали, как настроить ArangoDB и использовать его с Spring Data. Мы рассмотрели основные операции CRUD, пользовательские запросы и отношения сущностей.

Как всегда, весь исходный код доступен на GitHub .