JavaRush /Blog Java /Random-PL /Wiosna nie jest straszna, czyli jak zapełnić bazę h2 (i t...
Павел
Poziom 11

Wiosna nie jest straszna, czyli jak zapełnić bazę h2 (i trochę hibernacji)

Opublikowano w grupie Random-PL
TREŚĆ CYKLU ARTYKUŁÓW Kontynuujemy nasz projekt. Jak stworzyć projekt internetowy. Podłączamy bazę danych do naszego projektu internetowego . Tym razem listów będzie więcej, w pięć minut nie zdążymy. W ostatnim artykule radziłem Ci przeczytać kilka stron lub kilka artykułów na temat Springa , lub chociaż poszukać w Google informacji o tym, czym są fasole, kontekst, encje, wstrzykiwanie zależności w Springu, sposoby konfiguracji fasoli. Jeśli nie, radzę zrobić to teraz lub po przeczytaniu tego artykułu. Przed napełnieniem naszej bazy h2. Konieczne jest utworzenie klasy narzędzia, aby uruchamiać w niej metody wypełniania bazy danych. W paczce
ru.java.rush
Tworzenie pakietu dla narzędzi
utils
I samo narzędzie:
package ru.java.rush.utils;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;

@Service //adnotacja помечает бин Jak сервис
public class InitiateUtils implements CommandLineRunner { //имплементируем интерфейс CommandLineRunner (командная строка запуска)

    @Override
//переопределяем метод который позволит
//нам выполнять методы нашего Aplikacje при запуске
    public void run(String... args) throws Exception {
        System.out.println("run"); //проверим что это работает
    }
}
Uruchommy aplikację, a w konsoli wyświetli się komunikat „run” . Potrzebujemy tego narzędzia jako alternatywy dla klasy Aplikacje, ponieważ powinno ono odpowiadać jedynie za uruchomienie aplikacji. Stwórzmy byty. Jednostka to komponent bean, którego celem jest przechowywanie niektórych danych. W paczce
ru.java.rush
Utwórz pakiet dla encji
entities
A sama esencja niech będzie owocem:
package ru.java.rush.entities;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Entity//помечаем бин Jak сущность
@Table(name = "fruit_table")//в этой аннотации можно указать Nazwa создаваемой таблицы
public class FruitEntity {

    @Id//adnotacja из пакета avax.persistence.*, помечает поле Jak id
    @Column(name = "id_fruit")//в этой аннотации можно указать Nazwa поля
    @GenericGenerator(name = "generator", strategy = "increment")//незаметно добрались до hibernate,
// здесь указывается что id будет автоматически увеличиваться при новых записях
    @GeneratedValue(generator = "generator")//adnotacja генерации id
    private Integer id;

    @Column(name = "fruit_name")
    private String fruitName;

    @Column(name = "provider_code")
    private Integer providerCode;

   //что бы в с классом можно было совершать манипуляции создается
  //пустой конструктор, геттеры, сеттеры и переопределяется метод toString()

  public FruitEntity(){ //пустой конструктор

 }

public Integer getId() {
    return id;
}

 //геттеры, сеттеры
public String getFruitName() {
    return fruitName;
}

public FruitEntity setFruitName(String fruitName) {
    this.fruitName = fruitName;
    return this;
}

public Integer getProviderCode() {
    return providerCode;
}

public FruitEntity setProviderCode(Integer providerCode) {
    this.providerCode = providerCode;
    return this;
}

//переопределяем toString()
@Override
public String toString() {
    return "FruitEntity{" +
            "id=" + id +
            ", fruitName='" + fruitName + '\'' +
            ", providerCode=" + providerCode +
            '}';
}
}
Konstruktor, metody pobierające, ustawiające i toString() nie muszą być pisane ręcznie; można je szybko wygenerować . OK, nasz podmiot wchodzi w interakcję z bazą danych i przechowuje dane z bazy danych. Esencja działa. Ale ktoś musi obsługiwać podmiot w aplikacji. W tym celu opracowano „repozytorium”. W paczce
ru.java.rush
Tworzenie pakietu dla repozytoriów
repositories
I samo repozytorium
package ru.java.rush.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import ru.java.rush.entities.FruitEntity;

@Repository//помечаем что этот бин - репозиторий
public interface FruitRepository extends JpaRepository<FruitEntity,Integer> {
//репозиторий является интерфейсом, который наследуется от другого интерфейса JpaRepository<>
//для него необходимо указать с Jakой сущность он должен работать, у нас это FruitEntity
//и тип данных у поля id данной сущности, у нас это Integer
}
Pytanie brzmi: dlaczego treść interfejsu jest pusta i nie ma w nim zadeklarowanej ani jednej metody? Aby odpowiedzieć, przytrzymaj klawisz Ctrl i kliknij JpaRepository i zobacz, że samo dziedziczy z PagingAndSortingRepository<t, ""> i QueryByExampleExecutor<>, deklarują także pewne metody. Nie będę tu kopiować metod, poszukajcie sami. Ponieważ repozytorium jest interfejsem, nic nie robi, jedynie deklaruje metody, do zaimplementowania tych metod potrzebna jest ktoś inny. Dlatego wymyślono „usługę”. W paczce
ru.java.rush
Tworzenie pakietu usług
services
I sama usługa
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
Teraz dotarliśmy do ważnego punktu: „Jak i dlaczego wstrzyknąć komponent bean” (wstrzyknąć zależność). Jeśli nie rozumiesz, co mam na myśli, to proszę o przeczytanie tego tematu, teraz lub później, szczególnie zwrócenie uwagi na metody „iniekcji”, ile ich jest, co jest lepsze, co gorsze i dlaczego . Używamy jednej z metod. Potrzebujemy, aby „usługa” była w jakiś sposób połączona z „repozytorium”. Uzupełniamy naszą usługę o adnotację i zmienną.
package ru.java.rush.services;

import org.springframework.stereotype.Service;
import ru.java.rush.repositories.FruitRepository;

@Service
public class FruitService {

    private final FruitRepository fruitRepository;  //final переменная репозитория

public FruitService(FruitRepository fruitRepository) {//внедрLub зависимость через конструктор
    this.fruitRepository = fruitRepository;
}

}
Teraz możesz zaimplementować metodę z „repozytorium” Uzupełniamy „usługę”
package ru.java.rush.services;

import org.springframework.stereotype.Service;
import ru.java.rush.entities.FruitEntity;
import ru.java.rush.repositories.FruitRepository;

@Service
public class FruitService {

    private final FruitRepository fruitRepository;

public FruitService(FruitRepository fruitRepository) {//внедLub зависимость
    this.fruitRepository = fruitRepository;
}

//создали публичный метод (название любое может быть)
//на вход принимает сущность и сохраняет ее в базу
    public void save(FruitEntity fruitEntity){
        fruitRepository.save(fruitEntity); //реализовали метод внедренного бина
    }

//возвращает лист всех сущностей из базы
    public List<FruitEntity> getAll(){
       return fruitRepository.findAll(); //реализовали метод внедренного бина
    }
}
Pozostaje tylko zaimplementować to w naszym narzędziu.Przechodzimy do klasy InitiateUtils
package ru.java.rush.utils;


import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;
import ru.java.rush.entities.FruitEntity;
import ru.java.rush.services.FruitService;

import java.util.List;

@Service
public class InitiateUtils implements CommandLineRunner {

    private final FruitService fruitService;

public InitiateUtils (FruitService fruitService) {//незабываем конструктор для внедрения
    this. fruitService = fruitService;
}

    @Override
    public void run(String... args) throws Exception {

//создаем несколько сущностей фруктов, через сеттеры заполняем поля
        FruitEntity fruitEntity1 = new FruitEntity();
        fruitEntity1.setFruitName("fruit1");
        fruitEntity1.setProviderCode(1);

        FruitEntity fruitEntity2 = new FruitEntity();
        fruitEntity2.setFruitName("fruit2");
        fruitEntity2.setProviderCode(2);

        FruitEntity fruitEntity3 = new FruitEntity();
        fruitEntity3.setFruitName("fruit3");
        fruitEntity3.setProviderCode(3);

//с помощью переменной сервиса вызываем методы сохранения в базу, по разу для одного obiektа
        fruitService.save(fruitEntity1);
        fruitService.save(fruitEntity2);
        fruitService.save(fruitEntity3);

//здесь вытаскиваем базу обратно
        List<FruitEntity> all = fruitService.getAll();

//и выводим что получилось
        for (FruitEntity entity : all) {
            System.out.println(entity);
        }
    }
}
Dane wyjściowe konsoli: FruitEntity(id=1, nazwa owocu=owoc1, kod dostawcy=1) FruitEntity(id=2, nazwa owocu=owoc2, kod dostawcy=2) FruitEntity(id=3, nazwa owocu=owoc3, kod dostawcy=3) Tutaj możesz zakończyć. "Chwileczkę!" - zawoła najbardziej uważny czytelnik - „Gdzie w ogóle jest Hibernacja?” A Hibernate pełni tutaj rolę wojownika na niewidzialnym froncie, zrobił bardzo ważną rzecz: stworzył dla nas struktury baz danych. Kiedy napisaliśmy pola w „encji” i oznaczyliśmy je niezbędnymi adnotacjami, Hibernate spełnił swoje zadanie. Tak naprawdę, tworząc w locie, raczej nie będziesz zajmować się strukturą bazy danych; wszystko zostanie już dla Ciebie utworzone i wdrożone. Ale w tak małych projektach Hibernate'a z jego możliwością tworzenia struktur baz danych po prostu nie da się zastąpić, oczywiście nie jest to jego jedyna zaleta, na przykład dobrze radzi sobie z tworzeniem powiązanych ze sobą encji (nie będziemy ich używać w tym projekcie). Przywitajmy się z tym skromnym pracownikiem: przejdźmy do IDEA w strukturze projektu (po lewej stronie jest drzewo z folderami i plikami), tam znajdziemy Biblioteki Zewnętrzne, otworzymy i zobaczymy wśród innych bibliotek
Maven: org.hibernate.common:hibernate-commons-annotations:5.1.0.Final
Maven: org.hibernate.validator:hibernate-validator:6.0.17.Final
Maven: org.hibernate:hibernate-core:5.4.6.Final
W szczególności Hibernate został pobrany dla nas przez Mavena i
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Tak naprawdę pan Hiber przeprowadził kolejną tajną operację, ale o tym porozmawiamy w następnym artykule. To wszystko jest teraz pewne. W ramach ćwiczenia sugeruję samodzielne zaimplementowanie metody saveAll() dla FruitEntity , która zapisze wszystkie elementy jednocześnie w bazie danych. Następnie przyjrzyjmy się, jak skrócić kod projektu za pomocą biblioteki Lombok
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION