JavaRush /จาวาบล็อก /Random-TH /Spring ไม่น่ากลัวหรือจะเติมฐานข้อมูล h2 ได้อย่างไร (และไฮ...
Павел
ระดับ

Spring ไม่น่ากลัวหรือจะเติมฐานข้อมูล h2 ได้อย่างไร (และไฮเบอร์เนตเล็กน้อย)

เผยแพร่ในกลุ่ม
เนื้อหาของวงจรของบทความ เราดำเนินโครงการของเราต่อไป วิธีสร้างโครงการเว็บ เราเชื่อมต่อฐานข้อมูลกับโครงการเว็บของเรา คราวนี้จะมีจดหมายมาเพิ่ม อีกห้านาทีเราจะไม่ได้รับ ในบทความที่แล้ว ฉันแนะนำให้คุณอ่าน หลายหน้าหรือหลายบทความเกี่ยวกับ 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 ด้วยตัวเอง ซึ่งจะบันทึกเอนทิตีทั้งหมดลงในฐานข้อมูลในคราวเดียว ต่อไป มาดูวิธีย่อโค้ดโปรเจ็กต์โดยใช้ไลบรารีลอมบอก
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION