Это REST API для управления смартфонами, пользователями и заказами. Проект реализован на Spring Boot и использует базу данных MySQL через Spring Data JPA. Также добавлен in-memory кеш для ускорения повторных запросов.
-
Подключение БД (MySQL) и использование Hibernate/Spring Data JPA
- Сущности:
Smartphone,Order,User. - Связи:
Order↔Smartphone(один ко многим / многие к одному)User↔Smartphone(многие ко многим)
- Настроены каскадные операции и ленивые/жадные загрузки.
- Сущности:
-
Добавление in-memory кеша
- Для кастомного GET-запроса с параметрами (по
customerNameзаказа) результаты запросов к БД кешируются вConcurrentHashMap. - При повторном обращении с тем же ключом (
customerName) данные возвращаются из кеша.
- Для кастомного GET-запроса с параметрами (по
- CRUD для смартфонов: создание, получение, удаление (
/phones). - CRUD для заказов: создание, получение, удаление (
/orders). - CRUD для пользователей: создание, получение, обновление, удаление (
/users). - Фильтрация смартфонов по
customerNameзаказа (через кастомный запрос@Query). - In-memory кеш для ранее запрошенных данных.
- Java 17
- Spring Boot (Web, Data JPA, Security*)
- Hibernate
- MySQL
- Maven
- MapStruct (для маппинга DTO)
- REST API
* Spring Security по умолчанию отключён для удобства тестирования (см. SecurityConfig).
MobileApp
├── src
│ ├── main
│ │ ├── java
│ │ │ └── app
│ │ │ ├── MobileApplication.java # Главный класс Spring Boot
│ │ │ ├── config # Настройки Spring (SecurityConfig и т.д.)
│ │ │ ├── controller # REST-контроллеры
│ │ │ │ ├── SmartphoneController.java
│ │ │ │ ├── OrderController.java
│ │ │ │ ├── UserController.java
│ │ │ │ └── GlobalExceptionHandler.java
│ │ │ ├── dao (repositories) # Интерфейсы JpaRepository
│ │ │ │ ├── SmartphoneRepository.java
│ │ │ │ ├── OrderRepository.java
│ │ │ │ └── UserRepository.java
│ │ │ ├── dto # DTO-классы (UserDTO, SmartphoneDTO, OrderDTO)
│ │ │ ├── entities (или models) # JPA-сущности
│ │ │ │ ├── Smartphone.java
│ │ │ │ ├── Order.java
│ │ │ │ └── User.java
│ │ │ ├── mapper # MapStruct мапперы
│ │ │ │ ├── BaseMapper.java
│ │ │ │ ├── SmartphoneMapper.java
│ │ │ │ └── OrderMapper.java
│ │ │ ├── service # Сервисный слой
│ │ │ │ ├── SmartphoneService.java
│ │ │ │ ├── OrderService.java
│ │ │ │ └── UserService.java
│ │ │ └── cache # In-memory кеш
│ │ │ └── SmartphoneCache.java
│ │ ├── resources
│ │ │ ├── application.properties # Настройки Spring Boot и БД
├── pom.xml
└── README.md
git clone <URL-репозитория>
cd MobileAppВ application.properties пропиши параметры подключения к MySQL:
spring.datasource.url=jdbc:mysql://localhost:3306/smartphones_db
spring.datasource.username=YOUR_USERNAME
spring.datasource.password=YOUR_PASSWORD
spring.jpa.hibernate.ddl-auto=updateСоздай базу данных smartphones_db вручную, либо настроь автоматическое создание при запуске.
mvn spring-boot:runПриложение запустится на http://localhost:8081 (или 8080, если не менял server.port).
-
Получение всех смартфонов
GET /phones -
Получение смартфона по ID
GET /phones/{id} -
Создание смартфона
POST /phones{ "brand": "Samsung", "model": "Galaxy S21", "price": 799.99, "orderId": 1 } -
Удаление смартфона
DELETE /phones/{id} -
Фильтрация по имени заказчика (кастомный запрос + кеш)
GET /phones/by-customer?customerName=Alice[&nativeQuery=true]customerName– имя заказчикаnativeQuery– (опционально)trueдля использования нативного SQL- Результаты кешируются в
SmartphoneCache. При повторном запросе с тем жеcustomerNameданные возвращаются из кеша.
-
Получение всех заказов
GET /orders -
Получение заказа по ID
GET /orders/{id} -
Создание заказа
POST /orders{ "customerName": "Alice", "smartphoneIds": [] } -
Удаление заказа
DELETE /orders/{id}
-
Получение всех пользователей
GET /users -
Получение пользователя по ID
GET /users/{id} -
Создание пользователя
POST /users{ "username": "JohnDoe", "password": "secret123", "smartphoneIds": [] } -
Обновление пользователя
PUT /users/{id}{ "username": "JohnUpdated", "smartphoneIds": [2, 3] }Пароль не обновляется, если не передан (MapStruct маппер игнорирует поле password при merge).
-
Удаление пользователя
DELETE /users/{id}
# Получить смартфоны для заказчика 'Alice' через JPQL
curl -X GET "http://localhost:8081/phones/by-customer?customerName=Alice"
# Получить смартфоны для заказчика 'Bob' через native query
curl -X GET "http://localhost:8081/phones/by-customer?customerName=Bob&nativeQuery=true"При повторном запросе с тем же customerName результат возвращается из кеша.
- Валидация: При создании/обновлении сущностей, если поля не соответствуют ограничениям (
@NotBlank,@Sizeи т.д.), срабатываетGlobalExceptionHandler, возвращая 400 Bad Request с описанием ошибок. - Spring Security: Проект содержит базовую конфигурацию (см.
SecurityConfig). По умолчанию доступ открыт для всех (пара строк закомментированы). Если требуется защита, раскомментируй и укажи правила доступа. - MapStruct: Для маппинга между сущностями и DTO (UserDTO, SmartphoneDTO, OrderDTO) используются интерфейсы, расширяющие
BaseMapper. При сборке (Maven) автоматически генерируются реализации мапперов.
Автор: Nikita
Проект для учебных целей. Если у вас есть вопросы или предложения, открывайте issue или пишите на e-mail.
Это README охватывает:
- Подключение к БД
- Связи сущностей
- Использование JPA (кастомные запросы)
- In-memory кеширование запросов
- Примеры запросов для тестирования
Надеюсь, оно поможет быстро разобраться в проекте и его возможностях. Удачи!