JavaRush /جاوا بلاگ /Random-UR /موسم بہار خوفناک نہیں ہے، یا 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
خاص طور پر، ہائبرنیٹ ہمارے لیے Maven اور
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
درحقیقت، مسٹر ہائبر نے ایک اور خفیہ آپریشن کیا، لیکن ہم اگلے مضمون میں اس کے بارے میں بات کریں گے۔ اب یہ سب یقینی ہے۔ ایک تربیتی مشق کے طور پر، میرا مشورہ ہے کہ آپ FruitEntity کے لیے saveAll() طریقہ خود لاگو کریں ، جو تمام اداروں کو ایک وقت میں ڈیٹا بیس میں محفوظ کر دے گا۔ اگلا، آئیے دیکھتے ہیں کہ لومبوک لائبریری کا استعمال کرتے ہوئے پروجیکٹ کوڈ کو کیسے چھوٹا کیا جائے۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION