JavaRush /Java Blogu /Random-AZ /Bahar qorxulu deyil və ya h2 verilənlər bazasını necə dol...
Павел
Səviyyə

Bahar qorxulu deyil və ya h2 verilənlər bazasını necə doldurmaq olar (və bir az qışlama)

Qrupda dərc edilmişdir
MƏQALƏLƏR DÖVRÜNÜN MÜNDƏRİCASI Layihəmizi davam etdiririk. Veb layihəsini necə yaratmaq olarBiz verilənlər bazasını veb layihəmizə bağlayırıq. Bu dəfə daha çox məktublar olacaq, beş dəqiqəyə çatmayacağıq. Son məqalədə mən sizə Bahar haqqında bir neçə səhifə və ya bir neçə məqalə oxumağı və ya ən azıpaxlanın nə olduğu, kontekst, qurumlar, Baharda asılılıq inyeksiyası, lobya konfiqurasiya yolları haqqında google-da oxumağı tövsiyə etdim. Əgər yoxsa, o zaman bunu indi və ya bu məqalədən sonra etməyi məsləhət görürəm. H2 bazamızı doldurmadan əvvəl. Verilənlər bazasını doldurmaq üçün metodları işə salmaq üçün bir köməkçi sinif yaratmaq lazımdır. Paketdə
ru.java.rush
Kommunal xidmətlər üçün paketin yaradılması
utils
Və köməkçi proqramın özü:
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"); //проверим что это работает
    }
}
Tətbiqi işə salaq və konsolda "çalış" görünəcək . Bizə Proqramlar sinfinə alternativ olaraq bu yardım proqramı lazımdır, çünki o, yalnız proqramın işə salınmasına cavabdeh olmalıdır. Gəlin qurumlar yaradaq. Müəssisə, məqsədi bəzi məlumatları saxlamaq olan bir lobyadır. Paketdə
ru.java.rush
Müəssisələr üçün paket yaradın
entities
Və mahiyyətin özü, meyvə olsun:
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 +
            '}';
}
}
Konstruktor, alıcılar, tənzimləyicilər və toString() əl ilə yazılmalı deyil, onlar tez yaradıla bilər . Tamam, müəssisəmiz verilənlər bazası ilə qarşılıqlı əlaqə qurur və verilənlər bazasından məlumatları saxlayır. Əsas işdədir. Amma kimsə tətbiqdəki obyekti idarə etməlidir. Bu məqsədlə onlar “anbar” yaratdılar. Paketdə
ru.java.rush
Depolar üçün paketin yaradılması
repositories
Və deponun özü
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
}
Sual budur ki, interfeysin gövdəsi niyə boşdur, onun elan etdiyi bircə metod yoxdur? Cavab vermək üçün Ctrl düyməsini basıb saxlayın və JpaRepository üzərinə klikləyin və onun özünün PagingAndSortingRepository<t, ""> və QueryByExampleExecutor<>-dan miras qaldığına baxın, onlar da bəzi üsulları elan edirlər. Mən burada üsulları kopyalamayacağam; özünüzü axtarın. Repozitoriya interfeys olduğu üçün heç bir iş görmür, yalnız metodları elan edir, bu metodları həyata keçirmək üçün başqası lazımdır. Buna görə də “xidmət” icad edilmişdir. Paketdə
ru.java.rush
Xidmətlər paketinin yaradılması
services
Və xidmətin özü
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
İndi vacib bir nöqtəyə gəldik: "Necə və niyə lobya yeritmək lazımdır" (asılılıq yeritmək). Nə demək istədiyimi başa düşmürsünüzsə, indi və ya sonra bu mövzuda oxumağınızı xahiş edirəm, xüsusən "iynə vurma" üsullarına diqqət yetirin, neçə var, hansı yaxşıdır, hansı daha pisdir və niyə . Metodlardan birini istifadə edirik. Bizə "xidmət" lazımdır ki, bir növ "anbar"a qoşulsun. Xidmətimizi annotasiya və dəyişənlə tamamlayırıq.
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;
}

}
İndi metodu "depozitor"dan həyata keçirə bilərsiniz Biz "xidmət"i əlavə edirik
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(); //реализовали метод внедренного бина
    }
}
Qalır ki, bunu yardım proqramımızda həyata keçirək.Gəlin InitiateUtils sinfinə keçək.
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);
        }
    }
}
Konsol çıxışı: FruitEntity(id=1, fruitName=fruit1, providerCode=1) FruitEntity(id=2, fruitName=fruit2, providerCode=2) FruitEntity(id=3, fruitName=fruit3, providerCode=3) Burada bitirə bilərsiniz . "Bir saniyə!" - ən diqqətli oxucu qışqıracaq - "Hibernasiya haradadır?" Və Hibernate burada görünməz cəbhədə döyüşçü kimi çıxış edir; o, çox vacib bir iş gördü: bizim üçün verilənlər bazası strukturları yaratdı. Sahələri “obyekt”ə yazdıqda və onları lazımi qeydlərlə qeyd etdikdə Hibernate öz işini gördü. Əslində, tez inkişaf edərkən, verilənlər bazası strukturu ilə məşğul olma ehtimalınız yoxdur, hər şey artıq sizin üçün yaradılacaq və yerləşdiriləcəkdir. Ancaq bu cür kiçik layihələrdə verilənlər bazası strukturları yaratmaq qabiliyyəti ilə Hibernate sadəcə əvəz edilə bilməz; əlbəttə ki, bu, onun yeganə üstünlüyü deyil, məsələn, əlaqəli qurumlar yaratmaqda yaxşıdır (biz onlardan bu layihədə istifadə etməyəcəyik). Bu təvazökar işçiyə salam deyək: layihə strukturunda IDEA-ya gedin (solda qovluqlar və faylları olan bir ağac var), orada Xarici Kitabxanaları tapacağıq, onu açacağıq və digər kitabxanalar arasında görəcəyik.
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
Xüsusilə, Hibernate bizim üçün Maven tərəfindən endirildi və
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Əslində, cənab Hiber daha bir gizli əməliyyat həyata keçirdi, lakin bu barədə növbəti yazıda danışacağıq. İndi hər şey əmindir. Təlim məşqi kimi mən sizə FruitEntity üçün saveAll() metodunu özünüz tətbiq etməyi təklif edirəm ki, bu da bütün obyektləri bir anda verilənlər bazasında saxlayacaqdır. Sonra, Lombok kitabxanasından istifadə edərək layihə kodunu necə qısaltmağa baxaq
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION