JavaRush /جاوا بلاگ /Random-UR /موسم بہار خوفناک نہیں ہے، یا ڈیٹا بیس سوال کیسے پوچھنا ہے...

موسم بہار خوفناک نہیں ہے، یا ڈیٹا بیس سوال کیسے پوچھنا ہے

گروپ میں شائع ہوا۔
مضامین کے چکر کے مشمولات آج ہم اپنے پروجیکٹ کے حصے کے طور پر ڈیٹا بیس کے ساتھ کام کو حتمی شکل دے رہے ہیں۔ اگر آپ نے سب کچھ صحیح طریقے سے کیا ہے، تو آپ کے پاس مندرجہ ذیل انحصار کے ساتھ ایک پوم ہونا چاہئے:
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <java.version>1.8</java.version>
</properties>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.RELEASE</version>
    <relativePath/><!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>
اور اس منصوبے کا ڈھانچہ یہ ہے: بہار خوفناک نہیں ہے، یا ڈیٹا بیس سے سوال کیسے پوچھیں - 1 کیا آپ جانتے ہیں کہ ہمیں طویل عرصے سے کون یاد نہیں ہے؟ یہ application.yml ہے، ہم نے پچھلے مضامین میں سے ایک میں اس کے بارے میں زیادہ بات نہیں کی۔ اب آگے بڑھیں اور اسے حذف کریں! ہاں، ہاں حذف کریں اور بس! اگر ہم ابھی پروجیکٹ شروع کرتے ہیں تو سب کچھ پہلے کی طرح کام کرے گا، یہ کوشش کریں۔ ایسا اس لیے ہوا کیونکہ اسپرنگ خود ڈیفالٹ سیٹنگز کے ساتھ کنفیگر کی گئی تھی۔ اب ہمیں اپنی yml فائل کو وسائل کے فولڈر میں واپس کرنے کی ضرورت ہے، ہمیں پھر بھی اس کی ضرورت ہوگی: application.yml (نام ایک جیسا ہونا چاہئے)
spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:mem:test;
    username: sa
    password:
    h2:
      console:
        enabled: true
  jpa:
    hibernate.ddl-auto: create
    generate-ddl: true
    show-sql: false
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect
پچھلی بار، ہم نے JpaRepository<> انٹرفیس کے طریقوں کا استعمال کرتے ہوئے ڈیٹا بیس میں کئی سوالات کو لاگو کیا:
//сохранить одну запись в таблицу фруктов
public void save(FruitEntity fruitEntity){
    fruitRepository.save(fruitEntity);
}
//получить все записи из таблицы фруктов
public List<FruitEntity> getAll(){
   return fruitRepository.findAll();
}
//сохранить несколько записей в таблицу фруктов
public void saveAll(List<FruitEntity> fruits){
    fruitRepository.saveAll(fruits);
}
اگر آپ SQL کے بارے میں پڑھتے ہیں ، جیسا کہ میں نے آپ کو پچھلی بار کرنے کے لیے کہا تھا، تو آپ کو معلوم ہونا چاہیے کہ ڈیٹا بیس کے ساتھ ایسی کارروائیاں SQL استفسارات کا استعمال کرتے ہوئے کی جانی چاہیے۔ لیکن پروجیکٹ میں اس کا کوئی اشارہ نہیں ہے؛ یہاں تک کہ کنسول لاگ میں بھی ایسا کچھ نہیں ہے۔ آئیے انہیں ڈھونڈیں، application.yml کھولیں، وہاں show-sql: لائن تلاش کریں (sql دکھائیں) اور غلط کو سچ میں تبدیل کریں۔ ہم پروجیکٹ لانچ کرتے ہیں اور کنسول کو دیکھتے ہیں، لاگز ایس کیو ایل سے بہت ملتی جلتی نئی اندراجات سے بھرے ہوتے ہیں، درحقیقت ان میں سے اکثر کو سمجھنا مشکل نہیں ہوتا، مثال کے طور پر:
Hibernate: drop table fruit_table if exists //удалить таблицу fruit_table  если она есть
Hibernate: drop table provider_table if exists
Hibernate: create table fruit_table (id_fruit integer not null, fruit_name varchar(255), provider_code integer, primary key (id_fruit))//создать таблицу fruit_table с полями id_fruit тип integer not null, fruit_name  тип varchar(255), provider_code тип integer, назначить первичным ключем поле id_fruit
Hibernate: create table provider_table (id_provider integer not null, provider_name varchar(255), primary key (id_provider))
لیکن یہ اندراج اس کے سوالیہ نشانات کی وجہ سے بہت سے سوالات اٹھا سکتا ہے:
Hibernate: insert into fruit_table (fruit_name, provider_code, id_fruit) values (?, ?, ?)
آئیے منطقی طور پر سوچیں: سب سے پہلے، ہم لفظ ہائبرنیٹ دیکھتے ہیں، جس کا مطلب ہے کہ اس خفیہ آدمی نے اپنا پیارا پن یہاں رکھا ہے۔ انٹرنیٹ پر ان کے بارے میں پڑھنے کے بعد، ہمیں معلوم ہوا کہ مسٹر ہائبر ORM ماڈل کا نفاذ ہے۔ آبجیکٹ-ریلیشنل ماڈل ڈیٹا بیس میں سافٹ ویئر آبجیکٹ اور ریکارڈ کے درمیان تعلقات کو بیان کرتا ہے۔ اس خیال کو طے کرنے کے بعد، ہم منطقی طور پر سوچتے رہتے ہیں: ایک طرف، ہمارے پاس ایک FruitEntity آبجیکٹ ہے ، اس کے تین فیلڈز ہیں: Integer id؛ سٹرنگ پھل کا نام؛ انٹیجر فراہم کنندہ کوڈ۔ دوسری طرف، ہمارے پاس ڈیٹا بیس فروٹ_ٹیبل میں ایک ٹیبل ہے جس میں فیلڈز id_fruit type integer، fruit_name type varchar(255) , provider_code type integer ہیں۔ موٹے الفاظ میں، ہائبرنیٹ ایک FruitEntity آبجیکٹ لیتا ہے ، آبجیکٹ کے فیلڈز کی قدریں نکالتا ہے اور انہیں متعلقہ ٹیبل فیلڈز میں لکھتا ہے۔ میرا آپ سے ایک سوال ہے: دیکھو، InitiateUtils کلاس میں ہم نے پھلوں کی میز کو بھرنا لاگو کیا، لیکن کسی وجہ سے ہم نے صرف دو فیلڈز پر ویلیو سیٹ کی، تیسرا کہاں ہے؟
new FruitEntity()
        .setFruitName("Fruit1")//раз
        .setProviderCode(Math.abs(new Random().nextInt() % 10)),//два
                                            //три???
مجھے یقین ہے کہ آپ خود ہی اس کا پتہ لگا لیں گے، اس کے علاوہ، ہم نے آخری سے پہلے مضمون میں اس مسئلے کو مختصراً چھوا تھا۔ پہلے یہ معلوم کریں کہ کون سا فیلڈ یہاں نہیں ہے، پھر آپ کو سب کچھ سمجھ آ جائے گا۔ اچھا، شاباش، ہائبر نے ہمارے لیے درخواستوں کا ایک گروپ تیار کیا۔ لیکن ہم اندھے نہیں ہیں، آئیے FruitService کلاس میں JpaRepository<> انٹرفیس سے کچھ اور طریقے لاگو کرتے ہیں۔
//возвращает запись из таблицы по id
public Optional<FruitEntity> getById(Integer id){
   return fruitRepository.findById(id);
}

//удаляет запись из таблицы по id
public void delById(Integer id){
    fruitRepository.deleteById(id);
}

//возвращает true or false при поиске в таблице Фруктов an object который соответствует типу FruitEntity or принадлежит к типу an object который наследуется от FruitEntity
public Boolean exist(Example<? extends FruitEntity> example){
    return fruitRepository.exists(example);
}
ProviderService کلاس میں انہی طریقوں کو لاگو کریں۔ پھر انہیں FruitEntity اور ProviderEntity کے لیے InitiateUtils کلاس میں استعمال کریں اور نتیجہ کو کنسول پر پرنٹ کریں۔ (ویسے، اگر آپ نہیں جانتے تھے، تو آپ جلدی سے "System.out.println()" لکھ سکتے ہیں sout ٹائپ کرکے اور انٹر دبائیں، یہی چیز "public static void main(String[] args) کے ساتھ کام کرتی ہے{} صرف psvm ٹائپ کریں اور وہاں جائیں وغیرہ )۔ مجھے لگتا ہے کہ آپ پہلے ہی کر چکے ہیں اور ہم آگے بڑھنے کے لیے تیار ہیں۔ آئیے FruitRepository انٹرفیس پر جائیں اور اس میں ٹائپ کرنا شروع کریں (یعنی ٹائپ کریں اور کاپی نہ کریں) درج ذیل طریقہ: List<FruitEntity> f آپ کو مندرجہ ذیل چیز ملنی چاہیے۔ بس طریقہ کو اس طرح کال کریں جیسے آپ کوئی سوال لکھ رہے ہوں: findById(Integer id) ) - id کے ذریعہ ایک چیز تلاش کرتا ہے؛ CountFruitEntityByFruitName(String name) - ایک مخصوص نام کے ساتھ پھلوں کی تعداد شمار کرے گا؛ یہ طریقہ کے نام سے پیدا ہونے والے سوالات ہیں؛ ان کے بارے میں ضرور پڑھیں اور FruitService کلاس میں (Integer from, Integer to) کے درمیان طریقہ کو لاگو کریں تاکہ List<FruitEntity> کو تلاش کریں ایک خاص وقفہ، اور کنسول میں کام کا نتیجہ ڈسپلے کریں۔ مثال کے طور پر: وہ تمام پھل تلاش کریں جن کا سپلائر نمبر 5 اور 7 کے درمیان ہے۔ مزید پڑھنے کے لیے جلدی نہ کریں جب تک کہ آپ طریقہ کار کو نافذ نہیں کرتے، اس میں زیادہ وقت نہیں لگے گا۔ جیسا کہ آپ نے طریقہ کے نام سے سوالات کے بارے میں مضمون میں پڑھا ہو گا: "آپ اس طرح کے تمام سوالات نہیں لکھ سکتے، لیکن سادہ سوالات لکھے جا سکتے ہیں۔" مزید پیچیدہ سوالات کے لیے، @Query تشریح استعمال کی جاتی ہے اور SQL کی بجائے JPQL استعمال کیا جاتا ہے (اس مضمون کو بھی نوٹ کریں)۔ ہمارے پروجیکٹ کے لیے، آپ اس طرح کے سوالات میں شامل ہو سکتے ہیں: موسم بہار خوفناک نہیں ہے، یا ڈیٹا بیس سوال کیسے پوچھیں - 2
package ru.java.rush.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import ru.java.rush.entities.FruitEntity;

import java.util.List;

@Repository
public interface FruitRepository extends JpaRepository<FruitEntity,Integer> {

    @Query("select f.fruitName, p.providerName from  FruitEntity f left join ProviderEntity p on f.providerCode = p.id")
    List<String> joinSting();

}
ایک معیاری SQL استفسار یہ ہوگا: "fruit_table.fruit_name، provider_table.provider_name منتخب کریں fruit_table.provider_code = provider_table.id پر فروٹ_ٹیبل بائیں سے جوائن کریں پرووائڈر_ٹیبل"۔ یہاں آپ آسانی سے خط و کتابت قائم کر سکتے ہیں: f ruit_table FruitEntiy f ہے ، جہاں FruitEntiy متغیر کی قسم ہے، f اس کا نام ہے، یعنی ایس کیو ایل ٹیبلز اور فیلڈز کے ساتھ کام کرتا ہے، اور JPQL اشیاء اور ان کی فیلڈز کے ساتھ کام کرتا ہے۔ ایک بار پھر fruit_table.fruit_name f.fruitName ہے ; چونکہ ہم اشیاء کے ساتھ کام کرتے ہیں، ہم آبجیکٹ کو آؤٹ پٹ کر سکتے ہیں: آئیے ایک اور FruitRepository طریقہ لکھیں۔
@Query("select f from  FruitEntity f  join ProviderEntity p on f.providerCode = p.id")
List<FruitEntity> joinFruit();
آئیے FruitService کلاس میں دونوں طریقوں کو لاگو کرتے ہیں۔
public List<String> joinString(){
   return fruitRepository.joinSting();
}

public List<FruitEntity> joinFruit(){
    return fruitRepository.joinFruit();
}
یہ برا نہیں لگتا، لیکن وہ اب بھی پیچیدہ سوالات کے لیے اچھے پرانے SQL استعمال کرتے ہیں۔
@Query(
        value = "select fruit_table.fruit_name, provider_table.provider_name from  fruit_table  join provider_table on fruit_table.provider_code = provider_table.id_provider",  //по идее эту портянку надо засунуть в Howой нибудь  Enum
        nativeQuery = true) //нужно только пометить только nativeQuery = true
ListList<String> joinSqlFruit();
اور ہم ان سب کو InitiateUtils کلاس میں استعمال کرتے ہیں۔
System.out.println("\nТаблица фруктов и их поставщиков");
for (String join : fruitService.joinString()) {
    System.out.println(join);
}

System.out.println("\nТаблица фруктов и их поставщиков");
for (FruitEntity join : fruitService.joinFruit()) {
    System.out.println(join);
}

System.out.println("\nТаблица фруктов и их поставщиков");
        for (String join : fruitService.joinSqlFruit()) {
            System.out.println(join);
        }
ہم پروجیکٹ شروع کرتے ہیں اور کنسول میں نئے لاگز دیکھتے ہیں: پھلوں کا ٹیبل اور ان کے فراہم کنندگان Fruit1,null Fruit2,Provider5 Fruit3,Provider2 Fruit4,Provider5 Fruit5,null Fruit6,null Fruit7,null Fruit8,null Fruit9,null Fruit9,null from their fruits سپلائرز FruitEntity(id=2, fruitName=Fruit2, providerCode=5) FruitEntity(id=3, fruitName=Fruit3, providerCode=2) FruitEntity(id=4, fruitName=Fruit4, providerCode=5) پھلوں کی جدول اور ان کے سپلائرز F2ruit ,Provider5 Fruit3,Provider2 Fruit4,Provider5 جی ہاں، اگر آپ پہلے ہی کنسول میں "سیڈو" اور صرف SQL سوالات سے تھک چکے ہیں، تو آپ yaml فائل میں اس کی جگہ غلط کو واپس کر سکتے ہیں۔ پہلے ٹیبل میں null کیوں ہے، اگر آپ JOIN SQL کے بارے میں پڑھتے ہیں تو آپ کو پتہ چل جائے گا ۔ اور اس طرح، ہم نے ڈیٹا بیس کے سوالات کے ساتھ کیا ہے، مجھے یقین ہے کہ آپ کے پاس اب بھی بہت سے سوالات ہیں، لیکن مجھے امید ہے کہ آپ ان کے جوابات تلاش کریں گے، میں نے تلاش کے راستوں کو اجاگر کرنے کی کوشش کی۔ آئیے اس وقت کے دوران جو کچھ سیکھا ہے اس کا خلاصہ کرنے کی کوشش کریں: 1. آپ بہار میں ویب سرور چلا سکتے ہیں اور یہ مشکل نہیں ہے۔ 2. یہ سمجھنے کے لیے کہ یہ سب کیسے کام کرتا ہے، آپ کو تھیوری میں غوطہ لگانے کی ضرورت ہے۔ کتاب کے بارے میں مضمون بہار کے بارے میں مفید چیزوں کے بارے میں مضمون 3. فزیکل کوڈ میں تبدیل ہونے کے لیے آپ کو کوڈ کرنے کی ضرورت ہے، اور آگے بڑھنے سے پہلے، اسپرنگ بوٹ پر سادہ پروجیکٹس پر ہاتھ ڈالیں۔ اور بہتر ہے کہ تحریری کوڈ کو کاپی نہ کریں بلکہ اسے دوبارہ لکھیں۔ میں اس پروجیکٹ کو پوسٹ کروں گا جس پر آپ اور میں یہاں کام کر رہے ہیں، لیکن میں آپ کی آگاہی پر بھروسہ کروں گا اور مجھے یقین ہے کہ آپ بلاوجہ کاپی پیسٹ نہیں کریں گے۔ گٹ کلون ریپوزٹری کا لنک https://FromJava@bitbucket.org/FromJava/jd.git ان لوگوں کے لیے جو اس لنک کو استعمال کرنا نہیں جانتے ہیں میں دو تربیتی پروجیکٹوں کو لاگو کرنے کی سفارش کرتا ہوں: کاروں کی پینٹنگ کے بارے میں پروجیکٹ: پہلی کلاس: CarEntity{ Integer id سٹرنگ ماڈل کا نام؛ تار کا رنگ؛ } سیکنڈ کلاس: ColorEntity{Integer id; تار کا رنگ؛ عددی قیمت؛ } ڈیٹا بیس کو پُر کریں (حقیقت پسند ناموں کے ساتھ آئیں تاکہ سمجھنے میں آسانی ہو)، لاگو کریں: , entity, repositories, services, create standard and cross-table queries (BMW کو سرخ رنگنے میں کتنا خرچ آتا ہے؟ رنگ کون سا ہے سب سے مہنگا؟ کنسول پر ماڈلز کو حروف تہجی کی ترتیب اور وغیرہ میں لکھیں۔ لائبریری پروجیکٹ: فرسٹ کلاس: BookEntity{ Integer id; اسٹرنگ نام کی کتاب؛ انٹیجر سال کی تخلیق؛ انٹیجر آٹور آئی ڈی؛ } دوسری کلاس: AutorEntity{انٹیجر آئی ڈی؛ String firstNameAutor; اسٹرنگ lastNameAutor؛ } ڈیٹا بیس کو پُر کریں (حقیقت پسند ناموں کے ساتھ آئیں تاکہ سمجھنے میں آسانی ہو)، نافذ کریں: ہستی، ذخیرے، خدمات، معیاری اور انٹر ٹیبل سوالات بنائیں (کون سی کتاب لکھی؟ کون سی کتاب پہلے لکھی گئی؟ کون سی کتابیں لکھی گئیں۔ 1800 سے 1900 تک؟ کس مصنف نے سب سے زیادہ کتابیں لکھیں؟ "لائبریری" پروجیکٹ ڈیٹا بیس کو پُر کرنے کی مثالیں۔ بک ٹیبل BookEntity(id=1, nameBook=Woe from Wit, yearCreat=1824, authorId=1) BookEntity(id=2, nameBook=War and Peace, yearCreat=1863, authorId=2) BookEntity(id=3, nameBook= Mtsyri, yearCreat=1838, authorId=3) BookEntity(id=4, nameBook=Eugene Onegin, yearCreat=1833, authorId=4) مصنف جدول AuthorEntity(id=1, firstNameAuthor=Alexander, lastNameAuthor=Griboyedov) AuthorEntity=2 , firstNameAuthor=Lev, lastNameAuthor=Tolstoy) AuthorEntity(id=3, firstNameAuthor=Mikhail, lastNameAuthor=Lermontov) AuthorEntity(id=4, firstNameAuthor=Alexander, lastNameAuthor=Pushkin) سب کو گڈ لک، دوبارہ ملتے ہیں!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION