เนื้อหาของวงจรของบทความ เราดำเนินโครงการของเราต่อไป วิธีสร้างโครงการเว็บ เราเชื่อมต่อฐานข้อมูลกับโครงการเว็บของเรา คราวนี้จะมีจดหมายมาเพิ่ม อีกห้านาทีเราจะไม่ได้รับ ในบทความที่แล้ว ฉันแนะนำให้คุณอ่าน หลายหน้าหรือหลายบทความเกี่ยวกับ Spring หรืออย่างน้อยก็ Googleเกี่ยวกับว่า 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"); //проверим что это работает
    }
}
มาเรียกใช้แอปพลิเคชันแล้ว" 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 +
            '}';
}
}
Constructor, Getters, Setters และ 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
}
คำถามคือ เหตุใดเนื้อความของอินเทอร์เฟซจึงว่างเปล่า ไม่มีวิธีการเดียวที่ประกาศ หากต้องการตอบ ให้กด Ctrl ค้างไว้แล้วคลิกที่ JpaRepository และดูว่าตัวมันเองสืบทอดมาจาก PagingAndSortingRepository<t, ""> และ QueryByExampleExecutor<> อีกทั้งยังประกาศวิธีการบางอย่างด้วย ฉันจะไม่คัดลอกวิธีการที่นี่ มองหาตัวคุณเอง เนื่องจากที่เก็บข้อมูลเป็นอินเทอร์เฟซ จึงไม่ทำอะไรเลย เพียงประกาศวิธีการเท่านั้น จึงจำเป็นต้องมีบุคคลอื่นนำวิธีการเหล่านี้ไปใช้ ด้วยเหตุนี้จึงมีการคิดค้น "บริการ" ขึ้น ในแพ็คเกจ
ru.java.rush
การสร้างแพ็คเกจสำหรับบริการ
services
และบริการนั้นเอง
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
ตอนนี้เรามาถึงจุดสำคัญแล้ว: “อย่างไรและทำไมต้องฉีดถั่ว” (ฉีดการพึ่งพา) หากคุณไม่เข้าใจสิ่งที่ฉันหมายถึงฉันขอให้คุณอ่านหัวข้อนี้ตอนนี้หรือทีหลังโดยเฉพาะให้ความสนใจกับวิธีการ "ฉีด" มีกี่วิธี อันไหนดีกว่า อันไหนแย่กว่า และทำไม . เราใช้วิธีใดวิธีหนึ่ง เราต้องการให้ "บริการ" เชื่อมต่อกับ "พื้นที่เก็บข้อมูล" เราเสริมบริการของเราด้วยคำอธิบายประกอบและตัวแปร
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 ที่มีความสามารถในการสร้างโครงสร้างฐานข้อมูลไม่สามารถถูกแทนที่ได้ แน่นอนว่านี่ไม่ใช่ข้อได้เปรียบเพียงอย่างเดียวเช่นการสร้างเอนทิตีที่เกี่ยวข้อง ได้ดี (เราจะไม่ใช้ในโครงการนี้) ทักทายคนงานผู้ต่ำต้อยคนนี้: ไปที่ 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
โดยเฉพาะอย่างยิ่ง Maven และ Hibernate ดาวน์โหลดให้เรา
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
ในความเป็นจริงมิสเตอร์ไฮเบอร์ได้ดำเนินการลับอีกครั้ง แต่เราจะพูดถึงเรื่องนี้ในบทความหน้า นั่นคือทั้งหมดที่แน่นอนตอนนี้ ในการฝึกหัด ฉันขอแนะนำให้คุณใช้เมธอด saveAll() สำหรับFruitEntity ด้วยตัวเอง ซึ่งจะบันทึกเอนทิตีทั้งหมดลงในฐานข้อมูลในคราวเดียว ต่อไป มาดูวิธีย่อโค้ดโปรเจ็กต์โดยใช้ไลบรารีลอมบอก