JavaRush /Java-Blog /Random-DE /Der Frühling ist nicht gruselig, oder wie man eine H2-Dat...
Павел
Level 11

Der Frühling ist nicht gruselig, oder wie man eine H2-Datenbank füllt (und ein wenig Ruhezustand)

Veröffentlicht in der Gruppe Random-DE
INHALT DES ARTIKELZYKLUS Wir setzen unser Projekt fort. So erstellen Sie ein Webprojekt. Wir verbinden die Datenbank mit unserem Webprojekt . Dieses Mal werden es mehr Briefe sein, in fünf Minuten kommen wir nicht durch. Im letzten Artikel habe ich Ihnen empfohlen, mehrere Seiten oder mehrere Artikel über Spring oder zumindest bei Google nachzuforschen, was Beans sind, Kontext, Entitäten, Abhängigkeitsinjektion in Spring und Möglichkeiten zur Konfiguration von Beans. Wenn nicht, rate ich Ihnen, dies jetzt oder nach diesem Artikel zu tun. Bevor wir unsere H2-Basis füllen. Es ist notwendig, eine Dienstprogrammklasse zu erstellen, um darin Methoden zum Füllen der Datenbank auszuführen. Im Paket
ru.java.rush
Erstellen eines Pakets für Dienstprogramme
utils
Und das Dienstprogramm selbst:
package ru.java.rush.utils;

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

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

    @Override
//переопределяем метод который позволит
//нам выполнять методы нашего Anwendungen при запуске
    public void run(String... args) throws Exception {
        System.out.println("run"); //проверим что это работает
    }
}
Lassen Sie uns die Anwendung ausführen und „Ausführen“ wird in der Konsole angezeigt . Wir benötigen dieses Dienstprogramm als Alternative zur Applications-Klasse, da es nur für den Start der Anwendung zuständig sein sollte. Lassen Sie uns Entitäten erstellen. Eine Entität ist eine Bean, deren Zweck darin besteht, einige Daten zu speichern. Im Paket
ru.java.rush
Erstellen Sie ein Paket für Entitäten
entities
Und die Essenz selbst, lass sie Frucht sein:
package ru.java.rush.entities;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

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

    @Id//Anmerkung из пакета avax.persistence.*, помечает поле Wie id
    @Column(name = "id_fruit")//в этой аннотации можно указать Name поля
    @GenericGenerator(name = "generator", strategy = "increment")//незаметно добрались до hibernate,
// здесь указывается что id будет автоматически увеличиваться при новых записях
    @GeneratedValue(generator = "generator")//Anmerkung генерации 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 +
            '}';
}
}
Der Konstruktor, Getter, Setter und toString() müssen nicht von Hand geschrieben werden; sie können schnell generiert werden . Okay, unsere Entität interagiert mit der Datenbank und speichert Daten aus der Datenbank. Die Essenz ist am Werk. Aber jemand muss die Entität in der Anwendung bedienen. Zu diesem Zweck haben sie sich ein „Repository“ ausgedacht. Im Paket
ru.java.rush
Erstellen eines Pakets für Repositorys
repositories
Und das Repository selbst
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<>
//для него необходимо указать с Wieой сущность он должен работать, у нас это FruitEntity
//и тип данных у поля id данной сущности, у нас это Integer
}
Die Frage ist, warum der Hauptteil der Schnittstelle leer ist und keine einzige Methode deklariert wird. Um zu antworten, halten Sie die Strg-Taste gedrückt und klicken Sie auf „JpaRepository“ und sehen Sie, dass es selbst von „PagingAndSortingRepository<t, „“> und „QueryByExampleExecutor<>“ erbt. Sie deklarieren auch einige Methoden. Ich werde die Methoden hier nicht kopieren; überzeugen Sie sich selbst. Da es sich bei dem Repository um eine Schnittstelle handelt, führt es keine Aktionen aus, sondern deklariert nur Methoden. Für die Implementierung dieser Methoden ist jemand anderes erforderlich. Aus diesem Grund wurde ein „Dienst“ erfunden. Im Paket
ru.java.rush
Erstellen eines Pakets für Dienste
services
Und der Service selbst
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
Jetzt sind wir an einem wichtigen Punkt angelangt: „Wie und warum man eine Bean injiziert“ (eine Abhängigkeit injizieren). Wenn Sie nicht verstehen, was ich meine, dann bitte ich Sie, jetzt oder später über dieses Thema zu lesen und insbesondere auf die Methoden der „Injektion“ zu achten, wie viele es gibt, was besser ist, was schlechter ist und warum . Wir verwenden eine der Methoden. Wir brauchen den „Dienst“, der irgendwie mit dem „Repository“ verbunden ist. Wir ergänzen unseren Service durch eine Annotation und eine Variable.
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) {//внедрoder зависимость через конструктор
    this.fruitRepository = fruitRepository;
}

}
Jetzt können Sie die Methode aus dem „Repository“ implementieren. Wir ergänzen den „Service“
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) {//внедoder зависимость
    this.fruitRepository = fruitRepository;
}

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

//возвращает лист всех сущностей из базы
    public List<FruitEntity> getAll(){
       return fruitRepository.findAll(); //реализовали метод внедренного бина
    }
}
Jetzt müssen wir dies nur noch in unserem Dienstprogramm implementieren. Fahren wir mit der InitiateUtils-Klasse fort
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);

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

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

//и выводим что получилось
        for (FruitEntity entity : all) {
            System.out.println(entity);
        }
    }
}
Konsolenausgabe: FruitEntity(id=1, FruitName=Frucht1, AnbieterCode=1) FruitEntity(id=2, FruchtName=Frucht2, AnbieterCode=2) FruitEntity(id=3, FruchtName=Frucht3, AnbieterCode=3) Hier können Sie fertig werden . "Augenblick!" – wird der aufmerksamste Leser ausrufen – „Wo ist Hibernate überhaupt?“ Und Hibernate fungiert hier als Kämpfer an der unsichtbaren Front; es hat etwas sehr Wichtiges getan: Es hat Datenbankstrukturen für uns geschaffen. Als wir die Felder in die „Entität“ schrieben und sie mit den notwendigen Anmerkungen markierten, erledigte Hibernate seine Aufgabe. Tatsächlich ist es unwahrscheinlich, dass Sie sich bei der spontanen Entwicklung mit der Datenbankstruktur befassen; alles wird bereits für Sie erstellt und bereitgestellt. Aber in solch kleinen Projekten kann Hibernate mit seiner Fähigkeit, Datenbankstrukturen zu erstellen, einfach nicht ersetzt werden; das ist natürlich nicht sein einziger Vorteil, zum Beispiel ist es gut darin, verwandte Entitäten zu erstellen (wir werden sie in diesem Projekt nicht verwenden). Sagen wir Hallo zu diesem bescheidenen Arbeiter: Gehen Sie in der Projektstruktur zu IDEA (auf der linken Seite befindet sich ein Baum mit Ordnern und Dateien). Dort finden wir externe Bibliotheken, öffnen sie und sehen sie unter anderen Bibliotheken
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
Insbesondere wurde Hibernate von Maven und heruntergeladen
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Tatsächlich hat Herr Hiber eine weitere verdeckte Operation durchgeführt, aber darüber werden wir im nächsten Artikel sprechen. Das ist jetzt alles sicher. Als Trainingsübung schlage ich vor, dass Sie die Methode saveAll() für FruitEntity selbst implementieren , wodurch alle Entitäten gleichzeitig in der Datenbank gespeichert werden. Schauen wir uns als Nächstes an, wie man den Projektcode mithilfe der Lombok-Bibliothek kürzt
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION