JavaRush /Java Blog /Random-JA /Spring は怖くない、または h2 データベースにデータを追加する方法 (および少しの Hibernate)
Павел
レベル 11

Spring は怖くない、または h2 データベースにデータを追加する方法 (および少しの Hibernate)

Random-JA グループに公開済み
記事のサイクルの内容 私たちはプロジェクトを続けます。Web プロジェクトの作成方法データベースを Web プロジェクトに 接続します。今度は手紙が増えるので、5分では終わりません。前回の記事では、 Spring に関する いくつかのページまたはいくつかの記事を読むか、少なくともBean とは何か、コンテキスト、エンティティ、Spring での依存関係注入、Bean の構成方法についてグーグルで調べることをお勧めしました。そうでない場合は、今すぐ、またはこの記事の後で実行することをお勧めします。h2 ベースを埋める前。データベースにデータを書き込むためのメソッドを実行するには、ユーティリティ クラスを作成する必要があります。パッケージ内
ru.java.rush
ユーティリティ用のパッケージの作成
utils
そしてユーティリティ自体は次のようになります。
package ru.java.rush.utils;

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

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

    @Override
//переопределяем метод который позволит
//нам выполнять методы нашего applications при запуске
    public void run(String... args) throws Exception {
        System.out.println("run"); //проверим что это работает
    }
}
アプリケーションを実行してみましょう。コンソールに「実行」と表示されます。このユーティリティはアプリケーションの起動のみを担当する必要があるため、Applications クラスの代替として必要です。エンティティを作成しましょう。エンティティは、データを保存することを目的とした Bean です。パッケージ内
ru.java.rush
エンティティのパッケージを作成する
entities
そしてその本質自体が実となるようにしましょう。
package ru.java.rush.entities;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

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

    @Id//annotation из пакета avax.persistence.*, помечает поле How id
    @Column(name = "id_fruit")//в этой аннотации можно указать Name поля
    @GenericGenerator(name = "generator", strategy = "increment")//незаметно добрались до hibernate,
// здесь указывается что id будет автоматически увеличиваться при новых записях
    @GeneratedValue(generator = "generator")//annotation генерации 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 +
            '}';
}
}
コンストラクター、ゲッター、セッター、および toString() は手動で記述する必要はなく、すぐに生成できます。さて、私たちのエンティティはデータベースと対話し、データベースからのデータを保存します。本質が働いているのです。ただし、誰かがアプリケーション内のエンティティを操作する必要があります。この目的のために、彼らは「リポジトリ」を考案しました。パッケージ内
ru.java.rush
リポジトリ用のパッケージの作成
repositories
そしてリポジトリ自体
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<>
//для него необходимо указать с Howой сущность он должен работать, у нас это FruitEntity
//и тип данных у поля id данной сущности, у нас это Integer
}
問題は、インターフェースの本体が空であり、宣言されているメソッドが 1 つもないのはなぜでしょうか。答えるには、Ctrl キーを押しながら JpaRepository をクリックすると、JpaRepository 自体が PagingAndSortingRepository<t, ""> および QueryByExampleExecutor<> から継承していることを確認します。また、いくつかのメソッドも宣言されています。ここで紹介する方法は真似しませんので、自分で探してください。リポジトリはインターフェイスであるため、何もせず、メソッドを宣言するだけであり、これらのメソッドを実装するには他の人が必要です。そこで考えられたのが「サービス」です。パッケージ内
ru.java.rush
サービスのパッケージの作成
services
そしてサービス自体も
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
ここで、「Bean を注入する方法と理由」(依存関係を注入する) という重要なポイントに到達しました。私の言っていることが理解できない場合は、今すぐまたは後でこのトピックを読んでください。特に「注射」の方法、その数、どれが良いか、どれが悪いのか、そしてその理由に注目してください。 。私たちはいずれかの方法を使用します。「サービス」を何らかの方法で「リポジトリ」に接続する必要があります。アノテーションと変数を使用してサービスを補完します。
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) {//внедрor зависимость через конструктор
    this.fruitRepository = fruitRepository;
}

}
「リポジトリ」からメソッドを実装できるようになりました 「サービス」を補完します
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) {//внедor зависимость
    this.fruitRepository = fruitRepository;
}

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

//возвращает лист всех сущностей из базы
    public List<FruitEntity> getAll(){
       return fruitRepository.findAll(); //реализовали метод внедренного бина
    }
}
残っているのは、これをユーティリティに実装することだけです。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);

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

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

//и выводим что получилось
        for (FruitEntity entity : all) {
            System.out.println(entity);
        }
    }
}
コンソール出力: FruitEntity(id=1, FruitName=fruit1, ProviderCode=1) FruitEntity(id=2, FruitName=fruit2, ProviderCode=2) FruitEntity(id=3, FruitName=fruit3, ProviderCode=3) これで完了です 。"ちょっと待って!" - 最も注意深い読者はこう叫ぶでしょう - 「そもそも Hibernate はどこにあるの?」ここでは Hibernate が目に見えない前線で戦闘機として機能し、非常に重要なことを行いました。つまり、データベース構造を作成してくれました。「エンティティ」にフィールドを書き込み、必要な注釈をマークすると、Hibernate がその機能を果たしました。実際、オンザフライで開発する場合、データベース構造を扱うことはほとんどなく、すべてがすでに作成され、デプロイされています。しかし、このような小規模なプロジェクトでは、データベース構造を作成する機能を備えた Hibernate を置き換えることはできません; もちろん、Hibernate の利点はこれだけではなく、たとえば、関連エンティティの作成に優れています(このプロジェクトでは使用しません)。この謙虚な作業員に挨拶しましょう。プロジェクト構造の IDEA に移動します (左側にフォルダーとファイルが含まれるツリーがあります)。そこで外部ライブラリを見つけて開き、他のライブラリの中でそれを確認します。
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
特に、Hibernate は Maven によってダウンロードされ、
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
実はハイバー氏は別の秘密工作を行っていたのですが、それについては次回の記事でお話します。これでもう確かです。トレーニング演習として、FruitEntityの saveAll() メソッドを自分で実装することをお勧めします 。これにより、すべてのエンティティが一度にデータベースに保存されます。 次に、Lombok ライブラリを使用してプロジェクト コードを短縮する方法を見てみましょう。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION