«1. Введение
Фреймворк Spring Data Key Value упрощает написание приложений Spring, использующих хранилища ключей и значений.
Это сводит к минимуму избыточные задачи и шаблонный код, необходимый для взаимодействия с магазином. Фреймворк хорошо работает для хранилищ ключей и значений, таких как Redis и Riak.
В этом руководстве мы рассмотрим, как мы можем использовать Spring Data Key Value с реализацией по умолчанию на основе java.util.Map.
2. Требования
Двоичные файлы Spring Data Key Value 1.x требуют JDK уровня 6.0 или выше, а также Spring Framework 3.0.x или выше.
3. Зависимость Maven
Для работы со Spring Data Key Value нам нужно добавить следующую зависимость:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-keyvalue</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
Последнюю версию можно найти здесь.
4. Создание объекта
Давайте создадим объект Employee:
@KeySpace("employees")
public class Employee {
@Id
private Integer id;
private String name;
private String department;
private String salary;
// constructors/ standard getters and setters
}
Пространства ключей определяют, в какой части структуры данных должен храниться объект. Эта концепция очень похожа на коллекции в MongoDB и Elasticsearch, ядра в Solr и таблицы в JPA.
По умолчанию пространство ключей объекта извлекается из его типа.
5. Репозиторий
Как и в других средах Spring Data, нам потребуется активировать репозитории Spring Data с помощью аннотации @EnableMapRepositories.
По умолчанию репозитории будут использовать реализацию на основе ConcurrentHashMap:
@SpringBootApplication
@EnableMapRepositories
public class SpringDataKeyValueApplication {
}
Можно изменить реализацию ConcurrentHashMap по умолчанию и использовать некоторые другие реализации java.util.Map:
@EnableMapRepositories(mapType = WeakHashMap.class)
Создание репозиториев с помощью Spring Data Key Value работает так же, как и с другими платформами Spring Data:
@Repository
public interface EmployeeRepository
extends CrudRepository<Employee, Integer> {
}
Чтобы узнать больше о репозиториях Spring Data, мы можем взглянуть на эту статью.
6. Использование репозитория
Расширяя CrudRepository в EmployeeRepository, мы получаем полный набор методов сохраняемости, выполняющих функции CRUD.
Теперь мы посмотрим, как мы можем использовать некоторые из доступных методов сохраняемости.
6.1. Сохранение объекта
Давайте сохраним новый объект Employee в хранилище данных, используя репозиторий:
Employee employee = new Employee(1, "Mike", "IT", "5000");
employeeRepository.save(employee);
6.2. Получение существующего объекта
Мы можем проверить правильность сохранения сотрудника в предыдущем разделе, выбрав сотрудника:
Optional<Employee> savedEmployee = employeeRepository.findById(1);
6.3. Обновление существующего объекта
CrudRepository не предоставляет специального метода для обновления объекта.
Вместо этого мы можем использовать метод save():
employee.setName("Jack");
employeeRepository.save(employee);
6.4. Удаление существующего объекта
Мы можем удалить вставленный объект, используя репозиторий:
employeeRepository.deleteById(1);
6.5. Выбрать все объекты
Мы можем получить все сохраненные объекты:
Iterable<Employee> employees = employeeRepository.findAll();
7. KeyValueTemplate
Другой способ выполнения операций со структурой данных — использование KeyValueTemplate.
В самых общих чертах, KeyValueTemplate использует MapAdapter, обертывающий реализацию java.util.Map для выполнения запросов и сортировки:
@Bean
public KeyValueOperations keyValueTemplate() {
return new KeyValueTemplate(keyValueAdapter());
}
@Bean
public KeyValueAdapter keyValueAdapter() {
return new MapKeyValueAdapter(WeakHashMap.class);
}
Обратите внимание, что в случае, если мы использовали @EnableMapRepositories, нам не нужно указывать KeyValueTemplate. Он будет создан самим фреймворком.
8. Использование KeyValueTemplate
Используя KeyValueTemplate, мы можем выполнять те же операции, что и с репозиторием.
8.1. Сохранение объекта
Давайте посмотрим, как сохранить новый объект Employee в хранилище данных с помощью шаблона:
Employee employee = new Employee(1, "Mile", "IT", "5000");
keyValueTemplate.insert(employee);
8.2. Извлечение существующего объекта
Мы можем проверить вставку объекта, извлекая его из структуры с помощью шаблона:
Optional<Employee> savedEmployee = keyValueTemplate
.findById(id, Employee.class);
8.3. Обновление существующего объекта
В отличие от CrudRepository, шаблон предоставляет специальный метод для обновления объекта:
employee.setName("Jacek");
keyValueTemplate.update(employee);
8.4. Удаление существующего объекта
Мы можем удалить объект с помощью шаблона:
keyValueTemplate.delete(id, Employee.class);
8.5. Выбрать все объекты
Мы можем получить все сохраненные объекты, используя шаблон:
Iterable<Employee> employees = keyValueTemplate
.findAll(Employee.class);
8.6. Сортировка объектов
В дополнение к основным функциям шаблон также поддерживает KeyValueQuery для написания пользовательских запросов.
Например, мы можем использовать запрос для получения отсортированного списка сотрудников в зависимости от их зарплаты:
KeyValueQuery<Employee> query = new KeyValueQuery<Employee>();
query.setSort(new Sort(Sort.Direction.DESC, "salary"));
Iterable<Employee> employees
= keyValueTemplate.find(query, Employee.class);
9. Заключение
В этой статье показано, как мы можем использовать среду Spring Data KeyValue с картой по умолчанию. реализация с использованием Repository или KeyValueTemplate.
«Есть больше Spring Data Frameworks, таких как Spring Data Redis, которые написаны поверх Spring Data Key Value. Обратитесь к этой статье для ознакомления с Spring Data Redis.
И, как всегда, все примеры кода, показанные здесь, доступны на GitHub.