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-операции больше не представляют тайны! Так что, пора делать базы данных своими союзниками.

Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Артём Уровень 112
4 сентября 2025
Что-то эта лекция совсем одинаковая с прошлой.
Алексей Уровень 115
30 октября 2025
Повторение - мать учения