Spring Boot 4 Microservices & REST APIs · Lekcja

Operacje CRUD z REST

Zaimplementują Państwo operacje tworzenia, odczytu, aktualizacji i usuwania encji za pośrednictwem punktów końcowych REST.

Lekcja 5 z 612 kroki

Operacje CRUD z REST to bezpłatna lekcja Spring Boot 4 Microservices & REST APIs na CoddyKit. To lekcja 5 z 6. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Spring Boot 4 Microservices & REST APIs, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Spring Boot 4 Microservices & REST APIs zawiera 6 lekcji w sumie.

Operacje CRUD: podstawy

Witamy w lekcji implementowania operacji CRUD w Spring Boot! CRUD oznacza Create, Read, Update i Delete, czyli tworzenie, odczytywanie, aktualizowanie i usuwanie.

Są to cztery podstawowe operacje związane z trwałym przechowywaniem danych, które umożliwiają zarządzanie danymi w aplikacji.

W interfejsach REST każda operacja CRUD jest zwykle powiązana z konkretną metodą HTTP.

Mapowanie operacji CRUD na metody HTTP

Zrozumienie mapowania operacji CRUD na metody HTTP jest kluczowe w projektowaniu interfejsów REST:

  • Create (C): obsługiwane przez żądania POST.
  • Read (R): obsługiwane przez żądania GET.
  • Update (U): obsługiwane przez żądania PUT.
  • Delete (D): obsługiwane przez żądania DELETE.

Użyjemy prostej encji Product i jej repozytorium ProductRepository z poprzednich lekcji.

Implementowanie tworzenia (POST)

Aby utworzyć nowy zasób, używamy metody HTTP POST. W Spring Boot obsługuje ją adnotacja @PostMapping.

Dane nowego produktu są przesyłane w treści żądania, którą Spring automatycznie mapuje na nasz obiekt Product za pomocą @RequestBody.

Przykład tworzenia produktu

Tak można utworzyć endpoint dodający nowy produkt. Uruchom kod, a następnie spróbuj dodać produkt za pomocą narzędzia takiego jak Postman (np. wyślij żądanie POST na adres /api/products z treścią JSON {"name": "Laptop", "price": 1200.0}).

package com.coddykit.crud;

import jakarta.persistence.*;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;

@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; }
}

@Repository
interface ProductRepository extends JpaRepository<Product, Long> {}

@RestController
@RequestMapping("/api/products")
class ProductController {
    @Autowired
    private ProductRepository productRepository;

    @PostMapping
    public Product createProduct(@RequestBody Product product) {
        return productRepository.save(product);
    }
}

@SpringBootApplication
class CrudApplication {
    public static void main(String[] args) {
        SpringApplication.run(CrudApplication.class, args);
    }
}

Implementowanie odczytywania (GET)

Do odczytywania zasobów służy metoda HTTP GET. Utworzymy dwa rodzaje operacji odczytu:

  • Pobieranie wszystkich produktów: mapowane na @GetMapping.
  • Pobieranie pojedynczego produktu po identyfikatorze: mapowane na @GetMapping("/{id}") z użyciem @PathVariable.

Podczas pobierania po identyfikatorze używamy Optional, aby obsłużyć przypadki, w których produkt może nie istnieć.

Przykład odczytywania produktów

Ten kod dodaje metody pobierające wszystkie produkty oraz pojedynczy produkt na podstawie jego identyfikatora. Zwróć uwagę na użycie ResponseEntity do zwrócenia kodu 404, gdy produkt nie zostanie znaleziony.

package com.coddykit.crud;

import jakarta.persistence.*;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import java.util.List;
import java.util.Optional;

@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; }
}

@Repository
interface ProductRepository extends JpaRepository<Product, Long> {}

@RestController
@RequestMapping("/api/products")
class ProductController {
    @Autowired
    private ProductRepository productRepository;

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

    @GetMapping("/{id}")
    public ResponseEntity<Product> getProductById(@PathVariable Long id) {
        Optional<Product> product = productRepository.findById(id);
        return product.map(ResponseEntity::ok)
                      .orElseGet(() -> ResponseEntity.notFound().build());
    }
}

@SpringBootApplication
class CrudApplication {
    public static void main(String[] args) {
        SpringApplication.run(CrudApplication.class, args);
    }
}

Implementowanie aktualizowania (PUT)

Aby zaktualizować istniejący zasób, używamy metody HTTP PUT oznaczonej adnotacją @PutMapping.

Endpoint zazwyczaj zawiera identyfikator zasobu w ścieżce (/{id}), aby wskazać element do zaktualizowania, a zaktualizowane dane są przesyłane w @RequestBody.

Przykład aktualizowania produktu

Ta metoda aktualizuje istniejący produkt. Najpierw sprawdza, czy produkt o identyfikatorze ze ścieżki istnieje. Jeśli tak, aktualizuje pola na podstawie treści żądania i zapisuje produkt.

package com.coddykit.crud;

import jakarta.persistence.*;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import java.util.Optional;

@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; }
}

@Repository
interface ProductRepository extends JpaRepository<Product, Long> {}

@RestController
@RequestMapping("/api/products")
class ProductController {
    @Autowired
    private ProductRepository productRepository;

    @PutMapping("/{id}")
    public ResponseEntity<Product> updateProduct(
        @PathVariable Long id, @RequestBody Product productDetails) {
        Optional<Product> product = productRepository.findById(id);
        if (product.isPresent()) {
            Product existingProduct = product.get();
            existingProduct.setName(productDetails.getName());
            existingProduct.setPrice(productDetails.getPrice());
            return ResponseEntity.ok(productRepository.save(existingProduct));
        } else {
            return ResponseEntity.notFound().build();
        }
    }
}

@SpringBootApplication
class CrudApplication {
    public static void main(String[] args) {
        SpringApplication.run(CrudApplication.class, args);
    }
}

Implementowanie usuwania (DELETE)

Aby usunąć zasób, używamy metody HTTP DELETE oznaczonej adnotacją @DeleteMapping.

Podobnie jak w przypadku aktualizowania, identyfikator usuwanego zasobu jest przekazywany jako @PathVariable. Po usunięciu często zwraca się status 204 No Content.

Przykład usuwania produktu

Ta metoda usuwa produkt na podstawie identyfikatora. Wyszukuje produkt i, jeśli istnieje, usuwa go. Zwrócenie ResponseEntity.noContent().build() jest dobrą praktyką w przypadku pomyślnego usunięcia.

package com.coddykit.crud;

import jakarta.persistence.*;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import java.util.Optional;

@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; }
}

@Repository
interface ProductRepository extends JpaRepository<Product, Long> {}

@RestController
@RequestMapping("/api/products")
class ProductController {
    @Autowired
    private ProductRepository productRepository;

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteProduct(@PathVariable Long id) {
        Optional<Product> product = productRepository.findById(id);
        if (product.isPresent()) {
            productRepository.delete(product.get());
            return ResponseEntity.noContent().build();
        } else {
            return ResponseEntity.notFound().build();
        }
    }
}

@SpringBootApplication
class CrudApplication {
    public static void main(String[] args) {
        SpringApplication.run(CrudApplication.class, args);
    }
}

Szybkie sprawdzenie: metody HTTP

Jakiej metody HTTP zwykle używa się do aktualizowania istniejącego zasobu w interfejsie REST API, a jakiej do tworzenia nowego zasobu?

Podsumowanie: CRUD z REST

Pomyślnie nauczyli się Państwo implementować wszystkie cztery operacje CRUD za pomocą kontrolerów REST w Spring Boot!

  • Create: użyj @PostMapping.
  • Read: użyj @GetMapping (dla wszystkich elementów lub na podstawie identyfikatora).
  • Update: użyj @PutMapping.
  • Delete: użyj @DeleteMapping.

Są to podstawowe elementy niemal każdego API opartego na danych. Następnie omówimy walidację i obsługę błędów!

Bezpłatny start

Ucz się Java dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
24
Lekcje
93

Często zadawane pytania

Czy lekcja „Operacje CRUD z REST” jest bezpłatna?

Tak — pełny tekst „Operacje CRUD z REST” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Spring Boot 4 Microservices & REST APIs, przejdź na CoddyKit PRO. Kurs Spring Boot 4 Microservices & REST APIs zawiera 6 lekcji w sumie.

Co nauczysz się w „Operacje CRUD z REST”?

Zaimplementują Państwo operacje tworzenia, odczytu, aktualizacji i usuwania encji za pośrednictwem punktów końcowych REST. Ćwiczysz Spring Boot 4 Microservices & REST APIs z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Spring Boot 4 Microservices & REST APIs?

Nie wymagamy żadnego doświadczenia. Spring Boot 4 Microservices & REST APIs w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 5 z 6.

Ile czasu zajmuje lekcja „Operacje CRUD z REST”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Spring Boot 4 Microservices & REST APIs?

Tak. Każda lekcja Spring Boot 4 Microservices & REST APIs zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Integracja bazy danych H2 i JPA
  2. Wprowadzenie do Spring Data JPA
  3. Tworzenie encji i repozytoriów
  4. Definiowanie encji i repozytoriów
  5. Operacje CRUD z REST
  6. Wykonywanie operacji CRUD
← Powrót do Spring Boot 4 Microservices & REST APIs