Среди сайтов выделяют две категории:
- Статические сайты состоят из готовых наборов HTML-страничек и не содержат программного кода на бэкенде. Например, так сделаны гайды Хекслета
- Динамические сайты формируют свои странички на основе информации, которую разработчики и пользователи сайта добавляют в базу данных. Наглядные примеры — соцсети или почтовые сервисы
Далее в курсе мы будем работать над динамическими сайтами, но с одной особенностью. Вместо использования полноценной базы данных мы будем хранить данные в памяти с помощью репозиториев.
Что такое репозиторий
Репозиторий, специальный класс который занимается тем, что сохраняет данные объектов куда-то, обычно в базу данных. Репозитории позволят хранить данные между запросами к сайту. Но наша реализация репозиториев будет хранить данные в памяти приложения, без их сохранения в базу. Это значит, что если перезапустить приложение, то данные пропадут.
Почему мы так решили не работать с базами данных? В ближайших уроках мы сосредоточимся на том, как работает веб. Чтобы изучить эту тему, достаточно хранить данные в памяти, не отвлекаясь на работу с базой данных. Подключением базы мы займемся в конце курса.
Посмотрим на примере, как работают репозитории:
// import org.example.hexlet.repository.CourseRepository;
// Где-то в обработчиках
// В случае курсов
var course = new Course("name", "description");
course.getId(); // null
// Во время сохранения присваиваем идентификатор id
CourseRepository.save(course);
Optional<Course> course2 = CourseRepository.find(course.getId()).get();
course.getId(); // 1
course == course2; // Это одно и тоже
CourseRepository.delete(course.getId());
// После удаления ничего не находим
CourseRepository.find(course.getId()).isEmpty(); // true
// Возвращаем список сохраненных курсов
CourseRepository.getEntities(); // List<Course>
// Ищем по началу имени
CourseRepository.search("na"); // List<Course>
// В случае пользователей все то же самое
var user = new User("Mike", "mike@email.com");
UserRepository.save(user);
UserRepository.delete(user.getId());
UserRepository.getEntities(); // List<User>
У этого класса есть несколько статических методов для сохранения и извлечения объектов. Этого достаточно для наших задач.
Ниже мы приводим исходный код класса CourseRepository
для тех, кому интересно:
package org.example.hexlet.repository;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.example.hexlet.model.Course;
public class CourseRepository {
// Тип зависит от того, с какой сущностью идет работа в упражнении
private static List<Course> entities = new ArrayList<Course>();
public static void save(Course course) {
// Формируется идентификатор
course.setId((long) entities.size() + 1);
entities.add(course);
}
public static List<Course> search(String term) {
var courses = entities.stream()
.filter(entity -> entity.getName().startsWith(term))
.toList();
return courses;
}
public static Optional<Course> find(Long id) {
var course = entities.stream()
.filter(entity -> entity.getId().equals(id))
.findAny();
return course;
}
public static List<Course> getEntities() {
return entities;
}
}
Точно такой же класс мы создадим под каждую сущность, с которой будем работать.
Самостоятельная работа
- Откройте наш демонстрационный проект
- Изучите в нем примеры классов репозиториев, которые помогают для работы с данными
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.