JavaRush /جاوا بلاگ /Random-SD /بهار خوفناڪ نه آهي، يا ڪيئن ڊيٽابيس سوال پڇڻ

بهار خوفناڪ نه آهي، يا ڪيئن ڊيٽابيس سوال پڇڻ

گروپ ۾ شايع ٿيل
مضمونن جي چڪر جو مواد اڄ اسان پنهنجي منصوبي جي حصي طور ڊيٽابيس سان گڏ ڪم کي حتمي شڪل ڏئي رهيا آهيون. جيڪڏهن توهان سڀ ڪجهه صحيح طريقي سان ڪيو، پوء توهان کي هيٺين انحصار سان هڪ پوم هجڻ گهرجي:
<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 کوليو، شو-sql ڳوليو: لڪير اتي (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 (?, ?, ?)
اچو ته منطقي طور تي سوچيو: سڀ کان پهريان، اسان لفظ Hibernate کي ڏسون ٿا، جنهن جو مطلب آهي ته هن ڳجهي ماڻهوءَ پنهنجو پيرو پنو هتي رکيو آهي. انٽرنيٽ تي هن جي باري ۾ پڙهڻ کان پوء، اسان ڄاڻون ٿا ته مسٽر هائبر ORM ماڊل جو هڪ عمل آهي. اعتراض سان لاڳاپيل ماڊل بيان ڪري ٿو سافٽ ويئر جي شين ۽ ڊيٽابيس ۾ رڪارڊ جي وچ ۾ لاڳاپا. هن خيال کي درست ڪرڻ بعد، اسان منطقي طور تي سوچڻ جاري رکون ٿا: هڪ طرف، اسان وٽ هڪ FruitEntity اعتراض آهي ، ان ۾ ٽي شعبا آهن: Integer id؛ اسٽرنگ ميوو جو نالو؛ انٽيجر فراهم ڪندڙ ڪوڊ. ٻئي طرف، اسان وٽ ڊيٽابيس ۾ هڪ ٽيبل آهي fruit_table فيلڊز id_fruit ٽائيپ انٽيجر، fruit_name قسم varchar(255) , provider_code type integer. عام طور تي ڳالهائڻ، Hibernate هڪ FruitEntity اعتراض کڻندو آهي ، اعتراض جي فيلڊ جي قيمتن کي ڪڍي ٿو ۽ انهن کي لاڳاپيل ٽيبل جي فيلڊ ڏانهن لکي ٿو. مون وٽ توهان لاءِ هڪ سوال آهي: ڏسو، InitiateUtils ڪلاس ۾ اسان ميوي جي ٽيبل کي ڀرڻ تي عمل ڪيو، پر ڪجهه سببن لاءِ اسان صرف ٻن شعبن جي قيمت مقرر ڪئي، ٽيون ڪٿي آهي؟
new FruitEntity()
        .setFruitName("Fruit1")//раз
        .setProviderCode(Math.abs(new Random().nextInt() % 10)),//два
                                            //три???
مون کي پڪ آهي ته توهان هن کي پنهنجي لاءِ سمجهندا، ان کان علاوه، اسان مختصر طور تي هن مسئلي تي آرٽيڪل ۾ آخري کان اڳ ڇڪيو. پهرين، اهو معلوم ڪريو ته ڪهڙي فيلڊ هتي ناهي، ۽ پوء توهان سڀ ڪجهه سمجهي سگهندا. چڱو، چڱو ٿيو، هائبر اسان لاءِ درخواستن جو هڪ گروپ ٺاهيو. پر اسان انڌا نه آهيون، اچو ته ڪجهه وڌيڪ طريقا لاڳو ڪريون JpaRepository<> انٽرفيس مان FruitService ڪلاس ۾
//возвращает запись из таблицы по 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 ڪلاس ۾ ساڳيا طريقا لاڳو ڪريو. پوءِ انھن کي استعمال ڪريو InitiateUtils ڪلاس ۾ FruitEntity ۽ ProviderEntity لاءِ ۽ نتيجو پرنٽ ڪريو ڪنسول ڏانھن. (انهي سان، جيڪڏهن توهان کي خبر نه هئي، ته توهان جلدي لکي سگهو ٿا "System.out.println()" ٽائيپ ڪندي sout ۽ انٽر کي دٻائڻ سان، ساڳيو ڪم "public static void main(String[] args){} ”بس ٽائيپ ڪريو psvm ۽ اتي وڃو وغيره ). مان سمجهان ٿو ته توهان اڳ ۾ ئي معاملو ڪيو آهي ۽ اسان اڳتي وڌڻ لاء تيار آهيون. اچو ته FruitRepository انٽرفيس تي وڃو ۽ ان ۾ ٽائپنگ شروع ڪريو (يعني ٽائيپ ڪرڻ ۽ ڪاپي نه ڪرڻ) ھيٺ ڏنل طريقو: List<FruitEntity> f توھان کي ھيٺ ڏنل شيءِ حاصل ڪرڻ گھرجي بهار خوفناڪ نه آهي، يا ڊيٽابيس سوال ڪيئن پڇو - 2 بس طريقي کي ڪال ڪريو ڄڻ توھان ڪو سوال ٺاھي رھيا آھيو: findById(Integer id ) - id ذريعي هڪ اعتراض ڳولي ٿو؛ CountFruitEntityByFruitName(اسٽرنگ جو نالو) - ھڪ مخصوص نالي سان ميون جو تعداد شمار ڪندو؛ اهي سوال آهن جيڪي طريقي جي نالي سان ٺاهيا ويا آهن؛ انهن جي باري ۾ پڙهڻ جي پڪ ڪريو ۽ FruitService ڪلاس ۾ (Integer from, Integer to) جي وچ ۾ طريقي کي لاڳو ڪريو List<FruitEntity> کي ڳولڻ لاءِ جنهن ۾ مهيا ڪندڙ_ڪوڊ فيلڊ جي قدر شامل آهن هڪ خاص وقفو، ۽ ڪنسول ۾ ڪم جو نتيجو ڏيکاريو. مثال طور: اهي سڀئي ميوا ڳولھيو جن جو سپلائر نمبر 5 ۽ 7 جي وچ ۾ آھي. اڳتي پڙھڻ لاءِ تڪڙ نه ڪريو جيستائين توھان طريقي تي عمل نه ڪندا، اھو گھڻو وقت نه وٺندو. جيئن ته توھان مضمون ۾ پڙھيو ھوندو آھي سوالن جي باري ۾ طريقن جي نالي سان: ”توھان ھن جھڙا سڀ سوال نه ٿا لکي سگھو، پر سادو لکي سگھجن ٿا. وڌيڪ پيچيده سوالن لاءِ، @Query تشريح استعمال ڪئي ويندي آهي ۽ SQL جي بدران JPQL استعمال ڪيو ويندو آهي (هن مضمون جو پڻ نوٽ وٺو) اسان جي پروجيڪٽ لاءِ، توهان ڪري سگهو ٿا شامل سوال، هن طرح:
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 from fruit_table کاٻي پاسي شامل ڪريو provider_table on fruit_table.provider_code = provider_table.id". هتي توهان آساني سان هڪ خطوط قائم ڪري سگهو ٿا: f ruit_table FruitEntiy f آهي ، جتي FruitEntiy متغير جو قسم آهي، f ان جو نالو آهي، اهو آهي، SQL جدولن ۽ فيلڊن سان ڪم ڪري ٿو، ۽ 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 Fruit. فروٽ اينٽيٽي (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 ها، جيڪڏهن توهان اڳ ۾ ئي تنگ آهيو “pseudo” ۽ ڪنسول ۾ صرف 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 red رنگ ڪرڻ جي قيمت ڪيتري آهي؟ ڪهڙو رنگ آهي؟ سڀ کان مهانگو؟ ماڊلز کي ڪنسول ۾ الفابيٽ جي ترتيب ۾ لکو وغيره.) لائبريري پروجيڪٽ: فرسٽ ڪلاس: BookEntity{Integer id; اسٽرنگ جو نالو ڪتاب؛ Integer year Creat; Integer autorId؛ } ٻيو طبقو: AutorEntity{Integer id; اسٽرنگ 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=اليگزينڊر، lastNameAuthor=Pushkin) سڀني کي مبارڪون، ٻيهر ملندا!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION