JavaRush /Курси /Модуль 5. Spring /Практика: створення сутностей і репозиторіїв

Практика: створення сутностей і репозиторіїв

Модуль 5. Spring
Рівень 5 , Лекція 4
Відкрита

Сьогодні ми реалізуємо невелику, але важливу частину нашого застосунку: створимо сутності і репозиторії. Ми розширимо функціональність проєкту, додавши роботу з базою даних. Під час роботи крок за кроком розберемося з:

  1. Створення сутності — основа роботи з JPA. Використаємо анотації, такі як @Entity, @Id, @GeneratedValue та інші.
  2. Налаштування репозиторіїв. Підключимо JpaRepository і використаємо його стандартні методи.
  3. Практична робота з 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. Запуск і перевірка

  1. Запустіть застосунок на вашому локальному сервері.
  2. Перевірте базу даних, щоб переконатися, що таблиця book була створена.
  3. Використовуйте такі запити:
    • POST /books з тілом:
      
      {
        "title": "Spring in Action",
        "author": "Craig Walls",
        "publishedYear": 2021
      }
      
    • GET /books — для отримання всіх книг.
    • GET /books/{id} — для отримання книги за ID.
    • DELETE /books/{id} — для видалення книги.

Вітаємо! Ви створили свою першу сутність і підключили її до бази з мінімальними зусиллями! Тепер ваш код став ближчим до реального виробництва!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ