Java for Beginner
675 subscribers
548 photos
155 videos
12 files
839 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Создание CRUD API в Spring

Разработка CRUD API (Create, Read, Update, Delete) — стандартная задача для построения RESTful приложений. Использование Spring Boot и PostgreSQL позволяет быстро и эффективно создать такое API.

Шаг 1: Создание проекта Spring Boot

Перейдите на Spring Initializr.

Выберите:
Project: Maven.
Language: Java.
Dependencies: Spring Web, Spring Data JPA, PostgreSQL Driver, Validation (для валидации данных).
Скачайте проект и откройте его в IDE.


Шаг 2: Настройка подключения к PostgreSQL

Добавьте настройки базы данных в файл application.properties.

Пример application.properties:
spring.datasource.url=jdbc:postgresql://localhost:5432/my_database
spring.datasource.username=postgres
spring.datasource.password=password

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect


Расшифровка настроек:
spring.datasource.url: URL подключения к PostgreSQL (с указанием базы данных).
spring.jpa.hibernate.ddl-auto: Автоматическое управление схемой базы данных (update, create, none).
spring.jpa.show-sql: Показывать SQL-запросы в консоли.
spring.jpa.properties.hibernate.dialect: Dialect Hibernate для PostgreSQL.


Шаг 3: Создание сущности (Entity)

Сущность представляет таблицу в базе данных.
import jakarta.persistence.*;
import jakarta.validation.constraints.*;

@Entity
@Table(name = "users")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotBlank(message = "Name is mandatory")
private String name;

@Email(message = "Email should be valid")
@NotBlank(message = "Email is mandatory")
private String email;

@NotNull(message = "Age is mandatory")
private Integer age;
// Геттеры и сеттеры...
}


Примечания:
Аннотация @Entity связывает класс с таблицей в базе данных.
Аннотация @Id указывает первичный ключ.
Аннотация
@GeneratedValue используется для автоинкремента.
@Table(name = "users") указывает имя таблицы.
Аннотации валидации (@NotBlank, @Email, @NotNull) проверяют корректность данных.

Шаг 4: Создание слоя доступа к данным (Repository)

Интерфейс репозитория предоставляет методы для взаимодействия с базой данных.
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}


Особенности:
JpaRepository предоставляет стандартные CRUD-методы (save, findById, findAll, deleteById).
Не нужно реализовывать методы вручную.


Шаг 5: Реализация бизнес-логики (Service)

Слой Service инкапсулирует логику работы с данными.
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Service
public class UserService {

private final UserRepository userRepository;

@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}

public List<User> getAllUsers() {
return userRepository.findAll();
}

public User getUserById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new RuntimeException("User not found with id: " + id));
}

public User createUser(User user) {
return userRepository.save(user);
}

public User updateUser(Long id, User updatedUser) {
User existingUser = getUserById(id);
existingUser.setName(updatedUser.getName());
existingUser.setEmail(updatedUser.getEmail());
existingUser.setAge(updatedUser.getAge());
return userRepository.save(existingUser);
}

public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}


Примечания:
Методы инкапсулируют работу с UserRepository.
Если пользователь не найден, выбрасывается исключение.


#Java #Training #Spring #CRUD_API
Шаг 6: Создание REST-контроллера

Контроллер обрабатывает HTTP-запросы и возвращает данные клиенту.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {

private final UserService userService;

@Autowired
public UserController(UserService userService) {
this.userService = userService;
}

@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}

@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}

@PostMapping
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
return ResponseEntity.status(201).body(userService.createUser(user));
}

@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @Valid @RequestBody User user) {
return ResponseEntity.ok(userService.updateUser(id, user));
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}


Примечания:
Методы контроллера возвращают данные с помощью ResponseEntity.
Данные валидируются аннотацией
@Valid.
Используются стандартные HTTP-коды:
200 OK для успешных операций.
201 Created для создания ресурса.
204 No Content для удаления.


Шаг 7: Тестирование API

Пример запросов (с использованием Postman или curl):

Получение всех пользователей:
GET http://localhost:8080/api/users


Получение пользователя по ID:
GET http://localhost:8080/api/users/1


Создание пользователя:
POST http://localhost:8080/api/users
Content-Type: application/json

{
"name": "Jane Doe",
"email": "jane.doe@example.com",
"age": 28
}


Обновление пользователя:
PUT http://localhost:8080/api/users/1
Content-Type: application/json

{
"name": "John Smith",
"email": "john.smith@example.com",
"age": 35
}


Удаление пользователя:
DELETE http://localhost:8080/api/users/1


Дополнительные возможности

Обработка ошибок: Добавьте обработчик ошибок с помощью @ControllerAdvice:
@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleRuntimeException(RuntimeException ex) {
return ResponseEntity.status(404).body(ex.getMessage());
}
}


Тестирование с помощью MockMvc:
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {

@Autowired
private MockMvc mockMvc;

@Test
public void testGetAllUsers() throws Exception {
mockMvc.perform(get("/api/users"))
.andExpect(status().isOk());
}
}


#Java #Training #Spring #CRUD_API