JavaRush /مدونة جافا /Random-AR /الربيع ليس مخيفًا، أو كيفية ملء قاعدة بيانات h2 (والقليل ...
Павел
مستوى

الربيع ليس مخيفًا، أو كيفية ملء قاعدة بيانات h2 (والقليل من السبات)

نشرت في المجموعة
محتويات دورة المقالات نواصل مشروعنا. كيفية إنشاء مشروع ويب. نحن نربط قاعدة البيانات بمشروع الويب الخاص بنا . هذه المرة سيكون هناك المزيد من الرسائل، ولن نصل خلال خمس دقائق. في المقالة الأخيرة، نصحتك بقراءة عدة صفحات أو عدة مقالات حول الربيع ، أو على الأقل جوجل حول ماهية الفاصوليا، والسياق، والكيانات، وحقن التبعية في الربيع، وطرق تكوين الفاصوليا. إذا لم يكن الأمر كذلك، فإنني أنصحك أن تفعل ذلك الآن أو بعد هذا المقال. قبل ملء قاعدة 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"); //проверим что это работает
    }
}
لنقم بتشغيل التطبيق وسيتم عرض كلمة "تشغيل" في وحدة التحكم . نحن بحاجة إلى هذه الأداة كبديل لفئة التطبيقات، لأنها يجب أن تكون مسؤولة فقط عن تشغيل التطبيق. دعونا نخلق الكيانات. الكيان عبارة عن حبة غرضها تخزين بعض البيانات. في حزمة
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
}
السؤال هو لماذا جسم الواجهة فارغ ولا يوجد طريقة واحدة يعلن عنها؟ للإجابة، اضغط باستمرار على 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 هنا كمقاتل على الجبهة غير المرئية، لقد قام بشيء مهم للغاية: لقد أنشأ هياكل قاعدة بيانات لنا. عندما كتبنا الحقول في "الكيان" ووضعنا علامة عليها بالتعليقات التوضيحية اللازمة، قام السبات بعمله. في الواقع، عند التطوير السريع، من غير المرجح أن تتعامل مع بنية قاعدة البيانات، حيث سيتم بالفعل إنشاء كل شيء ونشره لك. ولكن في مثل هذه المشاريع الصغيرة، لا يمكن ببساطة استبدال السبات بقدرته على إنشاء هياكل قاعدة البيانات، بالطبع، هذه ليست ميزته الوحيدة، على سبيل المثال، إنه جيد في إنشاء الكيانات ذات الصلة (لن نستخدمها في هذا المشروع). دعنا نلقي التحية على هذا العامل المتواضع: انتقل إلى 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>
وفي الحقيقة قام السيد هيبر بعملية سرية أخرى ولكننا سنتحدث عنها في المقال القادم. هذا كل شيء مؤكد الآن. كتمرين تدريبي، أقترح عليك تنفيذ طريقة saveAll()‎ لـ FruitEntity بنفسك ، والتي ستحفظ جميع الكيانات في قاعدة البيانات في وقت واحد. بعد ذلك، دعونا نلقي نظرة على كيفية اختصار رمز المشروع باستخدام مكتبة لومبوك
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION