JavaRush /جاوا بلاگ /Random-SD /بهار خوفناڪ نه آهي، يا هڪ h2 ڊيٽابيس کي ڪيئن آباد ڪجي (۽ ...

بهار خوفناڪ نه آهي، يا هڪ h2 ڊيٽابيس کي ڪيئن آباد ڪجي (۽ ٿورڙو Hibernate)

گروپ ۾ شايع ٿيل
مضمونن جي چڪر جو مواد اسان اسان جي منصوبي کي جاري رکون ٿا. هڪ ويب پروجيڪٽ ڪيئن ٺاهيو اسان ڊيٽابيس کي اسان جي ويب پروجيڪٽ سان ڳنڍيندا آهيون . هن ڀيري وڌيڪ اکر هوندا، اسان پنجن منٽن ۾ حاصل نه ڪنداسين. پوئين آرٽيڪل ۾، مون توهان کي صلاح ڏني ته بهار جي باري ۾ ڪيترائي صفحا يا ڪيترائي مضمون پڙهو ، يا گهٽ ۾ گهٽ گوگل ان باري ۾ ته شيام ڇا آهن، حوالا، ادارا، بهار ۾ انحصار انجيڪشن، ڀاڄين کي ترتيب ڏيڻ جا طريقا. جيڪڏهن نه، ته آئون توهان کي صلاح ڏيو ته اهو هاڻي يا هن مضمون کان پوء. اسان جي 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