Definiowanie encji i repozytoriów
Twórz encje JPA mapowane na tabele baz danych i definiuj interfejsy repozytoriów do dostępu do danych.
Definiowanie encji i repozytoriów to bezpłatna lekcja Spring Boot 4 Microservices & REST APIs na CoddyKit. To lekcja 4 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.
Wprowadzenie do trwałości danych
W tej lekcji nauczą się Państwo łączyć aplikację Java z bazą danych za pomocą Spring Boot. Nazywa się to trwałością danych i oznacza, że dane pozostają dostępne nawet po zatrzymaniu aplikacji.
Skupimy się na dwóch podstawowych pojęciach:
- Encje: obiekty Javy mapowane na tabele bazy danych.
- Repozytoria: interfejsy udostępniające łatwe sposoby pracy z encjami i bazą danych.
Czym jest encja JPA?
Encja JPA to zwykła klasa Javy reprezentująca tabelę w relacyjnej bazie danych. Każda instancja tej klasy odpowiada jednemu wierszowi w tej tabeli.
Java Persistence API (JPA) to standard zarządzania danymi relacyjnymi w aplikacjach Java. Spring Data JPA bazuje na nim, aby jeszcze bardziej uprościć interakcję z bazami danych.
Definiowanie pierwszej encji
Aby oznaczyć klasę Javy jako encję JPA, należy użyć adnotacji @Entity. Trzeba również zdefiniować klucz główny za pomocą @Id.
Utwórzmy prostą encję Product:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Product {
@Id
private Long id;
private String name;
private double price;
public Product() {}
public Product(Long id, String name, double price) {
this.id = id;
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;
}
@Override
public String toString() {
return "Product{id=" + id + ", name='" + name + "', price=" + price + "}";
}
public static void main(String[] args) {
Product product = new Product(1L, "Laptop", 1200.00);
System.out.println(product);
}
}Automatyczne generowanie kluczy głównych
Ręczne przypisywanie identyfikatorów może być uciążliwe i podatne na błędy. Bazy danych mogą automatycznie generować dla Państwa unikalne identyfikatory!
Należy użyć adnotacji @GeneratedValue wraz ze strategią strategy. GenerationType.IDENTITY jest często używana w bazach danych, które automatycznie zwiększają wartości identyfikatorów (takich jak MySQL i H2).
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
@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) { // No ID in constructor
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;
}
@Override
public String toString() {
return "Product{id=" + id + ", name='" + name + "', price=" + price + "}";
}
public static void main(String[] args) {
Product product = new Product("Keyboard", 75.00);
// In a real app, ID would be generated by the DB when persisted
System.out.println("Product created (ID will be generated by DB): " + product);
}
}Dostosowywanie mapowania kolumn
Domyślnie JPA mapuje pola na kolumny o takich samych nazwach. Można to dostosować za pomocą adnotacji @Column.
Pozwala ona określić nazwę kolumny, to, czy może przyjmować wartość null, jej długość i inne właściwości:
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "product_name", nullable = false, length = 100)
private String name;
@Column(nullable = false)
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;
}
@Override
public String toString() {
return "Product{id=" + id + ", name='" + name + "', price=" + price + "}";
}
public static void main(String[] args) {
Product product = new Product("Mouse", 25.50);
System.out.println("Product with custom columns: " + product);
}
}Wprowadzenie do repozytoriów Spring Data
Skoro mamy już encję, jak zapisać ją w bazie danych lub ją pobrać? Właśnie do tego służą repozytoria Spring Data!
Repozytorium to interfejs udostępniający gotowe, zaawansowane metody do typowych operacji na bazie danych, takich jak tworzenie, odczytywanie, aktualizowanie i usuwanie danych (CRUD). Nie trzeba pisać kodu SQL — Spring Data JPA wygeneruje go za Państwa.
Definiowanie interfejsu JpaRepository
Aby utworzyć repozytorium dla encji, wystarczy zdefiniować interfejs rozszerzający interfejs JpaRepository biblioteki Spring Data JPA.
Interfejs JpaRepository przyjmuje dwa parametry typów: typ encji oraz typ jej klucza głównego.
Oto sposób definiowania repozytorium dla naszej encji Product:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
// Assuming 'Product' entity is defined in the same package or imported
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
// Spring Data JPA automatically provides CRUD methods here!
// You can add custom query methods if needed, e.g.,
// List<Product> findByName(String name);
}Uwaga: adnotacja @Repository jest opcjonalna, ale jej użycie poprawia czytelność kodu.
Wbudowane metody repozytorium
Rozszerzając interfejs JpaRepository, Państwa ProductRepository automatycznie dziedziczy wiele zaawansowanych metod. Oto kilka z nich:
save(entity): zapisuje podaną encję (wstawia ją, jeśli jest nowa, lub aktualizuje, jeśli już istnieje).findById(id): pobiera encję na podstawie jej identyfikatora, zwracając obiektOptional.findAll(): zwraca wszystkie wystąpienia danego typu encji.delete(entity)lubdeleteById(id): usuwa encję.
Oznacza to, że otrzymują Państwo pełną funkcjonalność CRUD bez pisania ani jednej linii kodu implementacji!
Używanie repozytoriów w aplikacji
W rzeczywistej aplikacji Spring Boot repozytorium zostanie wstrzyknięte do serwisu lub kontrolera za pomocą @Autowired, a następnie będzie można wywoływać jego metody.
Nie możemy tutaj uruchomić kompletnej aplikacji Spring Boot z bazą danych, ale poniższy fragment pokazuje sposób użycia repozytorium w typowym komponencie Spring Boot:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
// Assuming Product and ProductRepository are defined
@Service
public class ProductService {
private final ProductRepository productRepository;
@Autowired
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public Product createProduct(String name, double price) {
Product newProduct = new Product(name, price);
return productRepository.save(newProduct);
}
public List<Product> getAllProducts() {
return productRepository.findAll();
}
public Product getProductById(Long id) {
return productRepository.findById(id).orElse(null);
}
}
Ten ProductService byłby następnie używany przez inne części aplikacji.
Szybkie sprawdzenie encji
Które z poniższych adnotacji są niezbędne do zdefiniowania podstawowej encji JPA mapowanej na tabelę bazy danych i mającej automatycznie generowany klucz główny?
Podsumowanie: encje i repozytoria
Świetnie! Poznali Państwo podstawy utrwalania danych za pomocą Spring Data JPA:
- Encje to klasy Java opatrzone adnotacją
@Entity, które mapują się na tabele bazy danych. @Idoznacza klucz główny, a@GeneratedValuepozwala bazie danych obsługiwać generowanie identyfikatorów.@Columnumożliwia dostosowanie mapowania pól na kolumny.- Repozytoria to interfejsy rozszerzające
JpaRepository<Entity, ID>, które udostępniają zaawansowane, gotowe metody CRUD bez konieczności pisania kodu SQL.
W następnej części dokładniej zajmą się Państwo wykonywaniem różnych operacji CRUD!
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 „Definiowanie encji i repozytoriów” jest bezpłatna?
Tak — pełny tekst „Definiowanie encji i repozytoriów” 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 „Definiowanie encji i repozytoriów”?
Twórz encje JPA mapowane na tabele baz danych i definiuj interfejsy repozytoriów do dostępu do danych. Ć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 4 z 6.
Ile czasu zajmuje lekcja „Definiowanie encji i repozytoriów”?
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
- Integracja bazy danych H2 i JPA
- Wprowadzenie do Spring Data JPA
- Tworzenie encji i repozytoriów
- Definiowanie encji i repozytoriów
- Operacje CRUD z REST
- Wykonywanie operacji CRUD