Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Создание интерфейса репозитория
Репозиторий — это абстракция для работы с хранилищем данных. Интерфейс репозитория определяет контракт для доступа к данным, скрывая детали реализации (база данных, кэш, REST API).
Принципы проектирования
Инверсия зависимостей: Бизнес-логика зависит от интерфейса, а не от конкретной реализации. Это позволяет легко менять способ хранения данных.
Разделение ответственности: Интерфейс отвечает только за CRUD операции и поиск, не содержит бизнес-логику.
Базовая структура
// Определение интерфейса с основными методами
public interface UserRepository {
// Create - создание новой записи
User save(User user);
// Read - чтение по ID
Optional<User> findById(Long id);
// Update - обновление существующей записи
User update(User user);
// Delete - удаление по ID
void deleteById(Long id);
// Поиск всех записей
List<User> findAll();
}
Расширенные методы поиска
public interface UserRepository {
// Поиск по уникальным полям
Optional<User> findByEmail(String email);
// Поиск с условиями
List<User> findByStatus(String status);
// Поиск с сортировкой
List<User> findByRoleOrderByNameAsc(String role);
// Пагинация
Page<User> findByStatus(String status, Pageable pageable);
// Проверка существования
boolean existsByEmail(String email);
// Подсчёт записей
long countByStatus(String status);
}
Реализация с использованием JPA (Spring Data)
// Spring Data JPA автоматически создаёт реализацию
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
List<User> findByStatus(String status);
Page<User> findByStatus(String status, Pageable pageable);
}
Spring создаёт реализацию на основе соглашений об именовании методов (query method names).
Альтернативная реализация — собственная
public interface UserRepository {
User save(User user);
Optional<User> findById(Long id);
List<User> findAll();
void deleteById(Long id);
}
// Реализация с использованием JDBC или SQL-запросов
@Repository
public class UserRepositoryImpl implements UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public User save(User user) {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
jdbcTemplate.update(sql, user.getName(), user.getEmail());
return user;
}
@Override
public Optional<User> findById(Long id) {
String sql = "SELECT * FROM users WHERE id = ?";
try {
User user = jdbcTemplate.queryForObject(
sql,
new UserRowMapper(),
id
);
return Optional.of(user);
} catch (EmptyResultDataAccessException e) {
return Optional.empty();
}
}
}
Типовые операции
Сохранение и обновление:
- save() автоматически различает INSERT и UPDATE по наличию ID
Безопасность:
- Используй подготовленные запросы (PreparedStatement) для защиты от SQL-injection
- Валидируй входные параметры в интерфейсе
Кэширование:
- Аннотация @Cacheable для кэширования результатов
- @CacheEvict для инвалидации кэша при изменении данных
Лучшие практики
- Называй методы по CRUD шаблону: save, findById, findAll, delete
- Возвращай Optional для методов, которые могут не вернуть результат: findById()
- Используй Pageable для больших наборов данных: для оптимизации памяти
- Отделяй бизнес-логику от доступа к данным: в интерфейсе только CRUD
- Документируй сложные запросы: @Query с комментариями
Интерфейс репозитория — это фундамент чистой архитектуры, позволяющий тестировать бизнес-логику независимо от базы данных.