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