JavaRush /Блоги Java /Random-TG /Баҳор дахшатнок нест, ё чӣ гуна савол додан ба пойгоҳи до...
Павел
Сатҳи

Баҳор дахшатнок нест, ё чӣ гуна савол додан ба пойгоҳи додаҳо

Дар гурӯҳ нашр шудааст
МАЗМУРИЯТИ СИКЛИ МАКОЛХО Имрӯз мо дар доираи лоиҳаи худ кор бо базаи маълумотро ба анҷом мерасонем. Агар шумо ҳама чизро дуруст иҷро карда бошед, пас шумо бояд пом бо вобастагии зерин дошта бошед:
<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 аст, мо дар яке аз мақолаҳои қаблӣ дар ин бора чандон сӯҳбат накардаем. Акнун биёед пеш равем ва онро нест кунем! Бале, ҳа, нест кунед ва ҳамин тавр! Агар мо ҳоло лоиҳаро оғоз кунем, ҳама чиз мисли пештара кор хоҳад кард, инро санҷед. Ин аз он сабаб рӯй дод, ки худи Spring бо танзимоти пешфарз танзим карда шуда буд. Ҳоло ба мо лозим аст, ки файли 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-ро нишон) ва false-ро ба ҳақиқӣ иваз кунем. Мо лоиҳаро оғоз мекунем ва ба консол менигарем, гузоришҳо бо сабтҳои нав ба 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 аст. Модели релясионии an objectӣ муносибатҳои байни an objectҳои нармафзор ва сабтҳоро дар пойгоҳи додаҳо тавсиф мекунад. Ин ақидаро ислоҳ карда, мо ба таври мантиқӣ фикр карданро идома медиҳем: Аз як тараф, мо an objectи FruitEntity дорем , он се майдон дорад: ID-и бутун; Номи меваи сатр; Коди провайдери бутун. Аз тарафи дигар, мо дар пойгоҳи додаи fruit_table ҷадвал дорем бо майдонҳои id_fruit type integer, type fruit_name varchar(255) , provider_code type integer. Тахминан, Hibernate an objectи FruitEntity -ро гирифта , арзишҳои майдонҳои an objectро берун мекунад ва онҳоро ба майдонҳои мувофиқи ҷадвал менависад. Ман ба шумо як савол дорам: Инак, дар синфи 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 истифода баред ва натиҷаро дар консол чоп кунед. (Дар омади гап, агар шумо намедонистед, шумо метавонед бо навиштани sout ва пахш кардани Enter зуд "System.out.println()" нависед, ҳамин чиз бо "public static void main(String [] args){} кор мекунад. ” танҳо psvm-ро нависед ва ба он ҷо меравед ва ғайра ). Ман фикр мекунам, ки шумо аллакай онро ҳал кардаед ва мо омодаем, ки пеш равем. Биёед ба интерфейси FruitRepository равем ва дар он ба навиштан (яъне чоп кардан ва на нусхабардорӣ) бо усули зерин шурӯъ кунем: List<FruitEntity> f Шумо бояд чизи зеринро ба даст оред.Танҳо ин усулро Баҳор даҳшатнок нест, ё чӣ гуна ба пойгоҳи додаҳо савол додан мумкин аст - 2 даъват кунед, ки гӯё шумо дархост тартиб дода истода бошед: findById(Integer id) ) - an objectро аз рӯи id пайдо мекунад; countFruitEntityByFruitName(Номи сатр) - шумораи меваҳоро бо номи мушаххас ҳисоб мекунад; Инҳо дархостҳое мебошанд, ки бо номи усул тавлид мешаванд; ҳатман дар бораи онҳо мутолиа кунед ва усули байни(Integer from, Integer to) дар синфи FruitService барои ҷустуҷӯи List<FruitEntity> аз рӯи арзишҳои майдони provider_code дохил кунед. фосилаи муайян ва натиҷаи корро дар консол намоиш диҳед. Масалан: ҳамаи меваҳоро ёбед, ки рақами таъминкунандагонашон аз 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-ро аз fruit_table-ро интихоб кунед, бо чап ҳамроҳ шавед provider_table дар fruit_table.provider_code = provider_table.id". Дар ин ҷо шумо метавонед ба осонӣ мукотиба муқаррар кунед: f ruit_table FruitEntiy f аст , ки дар он FruitEntiy навъи тағирёбанда, f номи он аст, яъне SQL бо ҷадвалҳо ва майдонҳо ва JPQL бо an objectҳо ва майдонҳои онҳо кор мекунад. Боз fruit_table.fruit_name f.fruitName аст ; Азбаски мо бо an objectҳо кор мекунем, мо метавонем an objectро бароварем: Биёед усули дигари 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 Ҷадвали меваҳои онҳо таъминкунандагон FruitEntity(id= 2, fruitName=Fruit2, providerCode=5) FruitEntity(id=3, fruitName=Fruit3, providerCode=2) FruitEntity(id=4, fruitName=Fruit4, providerCode=5) Ҷадвали меваҳо ва таъминкунандагони онҳо Fruit2 ,Provider5 Fruit3,Provider2 Fruit4 ,Provider5 Бале, агар шумо аллакай аз "псевдо" ва танҳо дархостҳои SQL дар консол хаста шуда бошед, шумо метавонед false-ро дар файли yaml ба ҷои он баргардонед. Чаро дар ҷадвали аввал нул мавҷуд аст, шумо хоҳед фаҳмид, ки оё шумо дар бораи JOIN SQL хондаед . Ҳамин тавр, мо бо дархостҳо ба пойгоҳи додаҳо анҷом ёфтем, ман боварӣ дорам, ки шумо ҳоло ҳам саволҳои зиёде доред, аммо ман умедворам, ки шумо ба онҳо ҷавоб меҷӯед, ман кӯшиш кардам, ки роҳҳои ҷустуҷӯро таъкид кунам. Биёед кӯшиш кунем, ки ҳама чизеро, ки дар ин муддат омӯхтаем, ҷамъбаст кунем: 1. Шумо метавонед веб-serverро дар фасли баҳор идора кунед ва ин мушкил нест. 2. Барои фаҳмидани он ки ин ҳама чӣ гуна кор мекунад, шумо бояд ба назария ғарқ шавед. Дар бораи китоб Мақола дар бораи баҳор Мақола дар бораи чизҳои муфид 3. Барои он ки фаҳмиш ба codeи физикӣ табдил ёбад, шумо бояд рамзгузорӣ кунед ва пеш аз он ки ба он ҳаракат кунед, ба лоиҳаҳои оддии Spring-boot муроҷиат кунед. Ва беҳтар аст, ки рамзи навишташударо нусхабардорӣ накунед, балки онро дубора нависед. Ман лоиҳаеро, ки мову шумо дар болои он кор кардаем, дар ин ҷо мегузорам, аммо ман ба огоҳии шумо такя мекунам ва боварӣ дорам, ки шумо бесабаб нусхабардорӣ намекунед. Истинод ба анбори git clone https://FromJava@bitbucket.org/FromJava/jd.git Барои онҳое, ки чӣ тавр истифода бурдани ин истинодро намедонанд, ман тавсия медиҳам, ки ду лоиҳаи омӯзишӣ амалӣ созанд: Лоиҳа дар бораи ранг кардани мошинҳо: Синфи якум: CarEntity{ Integer id; Номи модели сатр; ранги сатр; } Синфи дуюм: ColorEntity{ ID integer; ранги сатр; Нархи бутун; } Пойгоҳи додаҳоро пур кунед (бо номҳои воқеӣ пайдо кунед, то фаҳмидани он осонтар шавад), амалӣ кунед: , an object, анборҳо, хидматҳо, эҷод кардани дархостҳои стандартӣ ва байни ҷадвал (Ранг кардани BMW-и сурх чанд пул аст? Кадом ранг аст? гаронтарин?.. Моделҳоро ба консол бо тартиби алифбо нависед ва ғайра); Лоиҳаи китобхона: Синфи якум: BookEntity{ Integer ID; Номи сатр; Соли бутуни Creat; AutorId бутун; } Синфи дуюм: AutorEntity{ ID integer; String firstNameAutor; String LastNameAutor; } Пойгоҳи маълумотро пур кунед (номҳои воқеӣ пайдо кунед, то фаҳмидани он осонтар бошад), амалӣ кунед: an object, анборҳо, хидматҳо, эҷоди дархостҳои стандартӣ ва байни ҷадвал (Кӣ кадом китобро навиштааст? Кадом китоб аввал навишта шудааст? Кадом китобҳо навишта шудаанд. аз 1800 то 1900 Кадоме аз муаллифон бештар китоб навиштааст?); Намунаҳо барои пур кардани базаи лоиҳаи «Китобхона». Ҷадвали китоб BookEntity(id=1, nameBook=Вой аз Wit, yearCreat=1824, authorId=1) BookEntity(id=2, nameBook=Ҷанг ва сулҳ, yearCreat=1863, authorId=2) BookEntity(id=3, nameBook=) Mtsyri, yearCreat=1838, authorId=3) BookEntity(id=4, nameBook=Евгений Онегин, yearCreat=1833, authorId=4) Ҷадвали муаллифон AuthorEntity(id=1, firstNameAuthor=Александр, lastNameAuthor=Griboedov) Aut=2 , firstNameAuthor=Lev, lastNameAuthor=Толстой) AuthorEntity(id=3, firstNameAuthor=Михаил, LastNameAuthor=Лермонтов) AuthorEntity(id=4, firstNameAuthor=Александр, LastNameAuthor=Пушкин) Барори кор ба ҳама ! Боз дидани шумо
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION