Перш ніж занурюватися в код з головою, давайте освіжимо в пам'яті, що таке 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-операції більше не становлять таємниці! Тож пора робити бази даних своїми союзниками.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ