Сьогодні ми реалізуємо невелику, але важливу частину нашого застосунку: створимо сутності і репозиторії. Ми розширимо функціональність проєкту, додавши роботу з базою даних. Під час роботи крок за кроком розберемося з:
- Створення сутності — основа роботи з JPA. Використаємо анотації, такі як
@Entity,@Id,@GeneratedValueта інші. - Налаштування репозиторіїв. Підключимо
JpaRepositoryі використаємо його стандартні методи. - Практична робота з CRUD-операціями. Збережемо, оновимо, видалимо та прочитаємо дані з бази.
1. Постановка завдання
Уявіть, що ви працюєте над системою керування бібліотечним каталогом. В рамках навчального прикладу ми створимо сутність Book, яка буде представляти книгу, і забезпечимо базові операції для взаємодії з нею через базу даних. Наші завдання:
- Створити сутність
Bookз полямиid,title,authorтаpublishedYear. - Реалізувати для неї репозиторій.
- Написати методи для збереження та отримання даних.
2. Створення сутності
Почнемо зі створення класу-сутності Book. Нагадаємо головне правило: сутності зіставляють таблиці в базі даних. Кожне поле нашого класу стає колонкою в таблиці. Для цього скористаємося анотаціями @Entity, @Id, @GeneratedValue, @Column.
Відкриваємо проєкт і додаємо новий клас Book в пакет entity.
package com.example.library.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Column;
@Entity
public class Book {
@Id // Вказуємо первинний ключ
@GeneratedValue(strategy = GenerationType.IDENTITY) // Автоматична генерація ID
private Long id;
@Column(nullable = false) // Поле обов'язкове
private String title;
@Column(nullable = false)
private String author;
@Column(name = "published_year") // Вказуємо назву колонки в базі
private Integer publishedYear;
// Конструктори, геттери, сеттери
public Book() {
}
public Book(String title, String author, Integer publishedYear) {
this.title = title;
this.author = author;
this.publishedYear = publishedYear;
}
// Геттери і сеттери
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Integer getPublishedYear() {
return publishedYear;
}
public void setPublishedYear(Integer publishedYear) {
this.publishedYear = publishedYear;
}
}
У коді:
@Entity— позначає, що клас є сутністю і буде зіставлений з таблицею в базі.@Id— поле, яке буде використовуватися як первинний ключ таблиці.@GeneratedValue(strategy = GenerationType.IDENTITY)— автоматична генерація ID для нових записів.@Column— налаштування стовпців таблиці; додалиnullable = false, щоб зробити поле обов'язковим.
Тепер, коли наша сутність готова, переходимо до наступного кроку!
3. Створення репозиторію
Репозиторій відповідає за операції з базою даних. У Spring Data JPA для цього використовуються інтерфейси, такі як JpaRepository. Створимо інтерфейс BookRepository і підключимо стандартні методи.
Додаємо новий інтерфейс у пакет repository.
package com.example.library.repository;
import com.example.library.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
// Тут можна додавати кастомні методи, якщо знадобиться
}
JpaRepository<Book, Long>— типBookвказує на нашу сутність, аLong— на тип її ідентифікатора.- Анотація
@Repositoryдає зрозуміти Spring, що це компонент для роботи з базою даних.
Вбудовані методи JpaRepository
Отримавши наслідування від JpaRepository, ми вже можемо використовувати такі методи:
save()— для збереження об'єкта.findById()— для пошуку об'єкта за ID.findAll()— для отримання списку всіх об'єктів.deleteById()— для видалення об'єкта за ID.
4. Практична робота: CRUD-операції
Тепер протестуємо роботу створених сутностей і репозиторіїв. Для цього створимо базовий сервіс і додамо тестові дані.
Додаємо новий сервіс у пакет service.
package com.example.library.service;
import com.example.library.entity.Book;
import com.example.library.repository.BookRepository;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class BookService {
private final BookRepository bookRepository;
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
// Додавання книги
public Book addBook(Book book) {
return bookRepository.save(book);
}
// Отримання всіх книг
public List<Book> getAllBooks() {
return bookRepository.findAll();
}
// Пошук книги по ID
public Optional<Book> getBookById(Long id) {
return bookRepository.findById(id);
}
// Видалення книги за ID
public void deleteBook(Long id) {
bookRepository.deleteById(id);
}
}
Тепер додамо контролер, щоб протестувати функціональність через HTTP-запити.
package com.example.library.controller;
import com.example.library.entity.Book;
import com.example.library.service.BookService;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/books")
public class BookController {
private final BookService bookService;
public BookController(BookService bookService) {
this.bookService = bookService;
}
@PostMapping
public Book addBook(@RequestBody Book book) {
return bookService.addBook(book);
}
@GetMapping
public List<Book> getAllBooks() {
return bookService.getAllBooks();
}
@GetMapping("/{id}")
public Book getBookById(@PathVariable Long id) {
return bookService.getBookById(id).orElseThrow(() -> new RuntimeException("Book not found"));
}
@DeleteMapping("/{id}")
public void deleteBook(@PathVariable Long id) {
bookService.deleteBook(id);
}
}
Для перевірки можна відправляти запити через Postman або подібний інструмент.
5. Запуск і перевірка
- Запустіть застосунок на вашому локальному сервері.
- Перевірте базу даних, щоб переконатися, що таблиця
bookбула створена. - Використовуйте такі запити:
POST /booksз тілом:{ "title": "Spring in Action", "author": "Craig Walls", "publishedYear": 2021 }GET /books— для отримання всіх книг.GET /books/{id}— для отримання книги за ID.DELETE /books/{id}— для видалення книги.
Вітаємо! Ви створили свою першу сутність і підключили її до бази з мінімальними зусиллями! Тепер ваш код став ближчим до реального виробництва!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ