JavaRush /وبلاگ جاوا /Random-FA /بهار ترسناک نیست، یا نحوه پر کردن پایگاه داده h2 (و کمی H...
Павел
مرحله

بهار ترسناک نیست، یا نحوه پر کردن پایگاه داده h2 (و کمی Hibernate)

در گروه منتشر شد
محتویات چرخه مقالات ما پروژه خود را ادامه می دهیم. چگونه یک پروژه وب ایجاد کنیم. ما پایگاه داده را به پروژه وب خود متصل می کنیم . این بار نامه‌های بیشتری وجود خواهد داشت، تا پنج دقیقه دیگر به آن‌ها دست پیدا نمی‌کنیم. در مقاله گذشته به شما توصیه کردم که چندین صفحه یا چندین مقاله در مورد Spring یا حداقلدر مورد اینکه beans چیست، زمینه، موجودیت ها، تزریق وابستگی در Spring، راه های پیکربندی beans را در گوگل جستجو کنید . اگر نه، پس من به شما توصیه می کنم همین الان یا بعد از این مقاله این کار را انجام دهید. قبل از پر کردن پایه 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 نیاز داریم، زیرا فقط باید مسئول راه اندازی برنامه باشد. بیایید موجودیت ایجاد کنیم. یک موجودیت یک لوبیا است که هدف آن ذخیره برخی داده ها است. در بسته بندی
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 کجاست؟" و 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>
در واقع آقای هیبر عملیات مخفی دیگری را انجام داد که در مقاله بعدی در مورد آن صحبت خواهیم کرد. در حال حاضر همه چیز قطعی است. به عنوان یک تمرین آموزشی، پیشنهاد می‌کنم متد saveAll() را خودتان برای FruitEntity پیاده‌سازی کنید که همه موجودیت‌ها را در یک زمان در پایگاه داده ذخیره می‌کند. در مرحله بعد، بیایید نحوه کوتاه کردن کد پروژه با استفاده از کتابخانه Lombok را بررسی کنیم
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION