JavaRush /Курси /Модуль 5. Spring /Виконання CRUD-операцій з базою даних

Виконання CRUD-операцій з базою даних

Модуль 5. Spring
Рівень 5 , Лекція 5
Відкрита

Перш ніж занурюватися в код з головою, давайте освіжимо в пам'яті, що таке CRUD. CRUD — це абревіатура, яка позначає чотири основні операції при роботі з даними в базі:

  • Create (створення): додавання нових записів у базу даних.
  • Read (читання): отримання даних з бази.
  • Update (оновлення): зміна вже існуючих записів.
  • Delete (видалення): видалення записів з бази.

Тепер перейдемо до реалізації цих операцій. Ми будемо використовувати вже створені раніше (сутності і репозиторії). Якщо ви щось пропустили, зараз найкращий час «дістати ваш код з кишені»!


Створення тестової сутності

Візьмемо, наприклад, просту сутність Product:


import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Product {

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

    private String name;

    private Double price;

    // Конструктори, геттери і сеттери
    public Product() {}

    public Product(String name, Double price) {
        this.name = name;
        this.price = price;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }
}

Сутність готова! Тепер звернемося до репозиторію, щоб попрацювати з базою і реалізувати всі чотири операції CRUD.


Репозиторій для роботи з базою даних

Ви раніше підключили JpaRepository, щоб працювати з базами даних. Ось приклад репозиторію для нашого Product:


import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Long> {
    // Базові методи CRUD вже вбудовані
}

Зауважте, що ми успадкували інтерфейс від JpaRepository, а це означає, що всі методи CRUD вже є! Але давайте подивимося, як саме ними користуватись.


Реалізація CRUD-операцій

Переходимо до найцікавішого! Створимо сервіс і контролер для виконання CRUD-операцій.

1. Створення (Create)

Збереження нового об'єкта в базу виконується за допомогою методу save().

Приклад методу створення продукту в сервісі:


import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class ProductService {

    private final ProductRepository productRepository;

    @Autowired
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    public Product createProduct(String name, Double price) {
        Product product = new Product(name, price);
        return productRepository.save(product);
    }
}

Тепер додамо метод в контролері:


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/products")
public class ProductController {

    private final ProductService productService;

    @Autowired
    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    @PostMapping
    public Product createProduct(@RequestBody Product product) {
        return productService.createProduct(product.getName(), product.getPrice());
    }
}

Коли ви відправите HTTP POST-запит на /products, передавши в тілі JSON, виконати таку операцію буде просто.

Приклад запиту:


POST /products HTTP/1.1
Content-Type: application/json

{
    "name": "Лаптоп",
    "price": 1200.00
}

Після виконання цього запиту новий продукт буде доданий в базу!


2. Читання (Read)

Для отримання даних з бази ви можете використовувати метод findById() або findAll().

Приклад у сервісі:


import java.util.Optional;
import java.util.List;

public List<Product> getAllProducts() {
  return productRepository.findAll();
  }

  public Optional<Product> getProductById(Long id) {
    return productRepository.findById(id);
    }

Тепер реалізуємо методи в контролері:


@GetMapping
public List<Product> getAllProducts() {
    return productService.getAllProducts();
}

@GetMapping("/{id}")
public Product getProductById(@PathVariable Long id) {
    return productService.getProductById(id)
                         .orElseThrow(() -> new RuntimeException("Product not found"));
}

Ці методи відповідають за:

  • GET /products: повертає список усіх продуктів.
  • GET /products/{id}: повертає продукт за ID.

3. Оновлення (Update)

Оновлення виконується за допомогою методу save(). Якщо об'єкт з вказаним ID існує, він оновлюється.

Спочатку додамо метод оновлення в сервіс:


public Product updateProduct(Long id, String name, Double price) {
    Product product = productRepository.findById(id)
            .orElseThrow(() -> new RuntimeException("Product not found"));

    product.setName(name);
    product.setPrice(price);
    return productRepository.save(product);
}

І додамо його в контролер:


@PutMapping("/{id}")
public Product updateProduct(@PathVariable Long id, @RequestBody Product updatedProduct) {
    return productService.updateProduct(id, updatedProduct.getName(), updatedProduct.getPrice());
}

Приклад запиту:


PUT /products/1 HTTP/1.1
Content-Type: application/json

{
    "name": "Оновлений Лаптоп",
    "price": 1500.00
}

Якщо продукт з ID 1 існує, він буде оновлений.


4. Видалення (Delete)

Видалення виконується за допомогою методу deleteById().

Метод у сервісі:


public void deleteProduct(Long id) {
    productRepository.deleteById(id);
}

Метод в контролері:


@DeleteMapping("/{id}")
public void deleteProduct(@PathVariable Long id) {
    productService.deleteProduct(id);
}

Тепер відправте запит:


DELETE /products/1 HTTP/1.1

Цей запит видалить продукт з ID 1.


Обробка помилок

Під час роботи з базами даних часто виникають помилки, такі як EntityNotFoundException. Переконайтеся, що ви коректно обробляєте їх, використовуючи, наприклад, власні виключення або глобальні обробники помилок.


Практичне застосування

У реальних застосунках CRUD-операції є основою будь-якої системи, що працює з даними. Від управління користувачами й замовленнями до книг у бібліотеці — подібні методи використовуються повсюдно. Ба більше, на співбесідах часто ставлять питання про основні методи CRUD, а також вимагають демонстрацію відповідного коду.


Тепер для вас CRUD-операції більше не становлять таємниці! Тож пора робити бази даних своїми союзниками.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ