JavaRush /Java Blog /Random-TK /Bahar gorkunç däl, ýa-da maglumat bazasyna nädip sorag be...

Bahar gorkunç däl, ýa-da maglumat bazasyna nädip sorag bermeli

Toparda çap edildi
Makalalaryň sikliniň mazmuny Şu gün taslamamyzyň bir bölegi hökmünde maglumatlar bazasy bilen işi tamamlaýarys. Hemme zady dogry ýerine ýetiren bolsaň, aşakdaky baglylyklar bilen pom bolmaly:
<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>
Taslamanyň gurluşy: Bahar gorkunç däl, ýa-da maglumat bazasyna nädip sorag bermeli - 1 Uzak wagt bäri ýadymyzda bolmadyk adamy bilýärsiňizmi? Bu application.yml, öňki makalalaryň birinde bu hakda kän gürleşmedik. Indi öňe gideliň we pozalyň! Hawa, hawa pozuň we bu! Taslamany häzir başlasak, hemme zat öňküsi ýaly işlär, synap görüň. Bu, Baharyň özi deslapky sazlamalar bilen düzülenligi sebäpli boldy. Indi yml faýlymyzy çeşmeler bukjasyna gaýtaryp bermeli, henizem gerek bolar: application.yml (ady şol bir bolmaly)
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
Geçen gezek JpaRepository <> interfeýsiniň usullaryny ulanyp maglumatlar bazasyna birnäçe soragy amala aşyrdyk:
//сохранить одну запись в таблицу фруктов
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 hakda okasaňyz , geçen gezek haýyş edişim ýaly, maglumatlar bazasy bilen şeýle hereketleriň SQL talaplary bilen ýerine ýetirilmelidigini bilmelisiňiz. Emma taslamada bu barada hiç hili yşarat ýok, hatda konsol ýazgylarynda-da meňzeş zat ýok. Olary tapalyň, application.yml açalyň, show-sql: setiri tapyň (sql görkeziň) we ýalany hakykata üýtgedeliň. Taslamany başlaýarys we konsola seredýäris, surnallar SQL-a gaty meňzeş täze ýazgylar bilen doldurylýar, aslynda köpüsine düşünmek kyn däl, mysal üçin:
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))
Thisöne bu ýazgy, sorag belgileri sebäpli köp sorag döredip biler:
Hibernate: insert into fruit_table (fruit_name, provider_code, id_fruit) values (?, ?, ?)
Logiki taýdan pikirleneliň: Ilki bilen, Gibernate sözüni görýäris, bu gizlin ýigidiň penjesini şu ýere goýandygyny aňladýar. Ol hakda internetde okanymyzdan soň, jenap Hiberiň ORM modeliniň durmuşa geçirilýändigini öwrenýäris. Obýekt bilen baglanyşykly model, maglumatlar bazasyndaky programma üpjünçiliginiň obýektleri bilen ýazgylaryň arasyndaky gatnaşyklary suratlandyrýar. Bu pikiri düzedip, logiki pikirlenmegi dowam etdirýäris: Bir tarapdan, “FruitEntity” obýektimiz bar , onuň üç ugry bar: Integer id; Setir miwesiName; Bitewi üpjün edijiCode. Beýleki tarapdan, maglumatlar bazasynda “ id_fruit” görnüşli bitewi san, “miwe_name” görnüşi “varchar ” (255) , üpjün ediji_kod görnüşi bitewi sanlar bar. Takyk aýdanymyzda, Gibernate “FruitEntity” obýektini alýar , obýektiň meýdanlarynyň bahalaryny çykarýar we degişli tablisa meýdanlaryna ýazýar. Size bir soragym bar: Seret, “InitiateUtils” synpynda miwe stoluny doldurmagy amala aşyrdyk, ýöne näme üçindir bahasyny diňe iki meýdana belledik, üçünjisi nirede?
new FruitEntity()
        .setFruitName("Fruit1")//раз
        .setProviderCode(Math.abs(new Random().nextInt() % 10)),//два
                                            //три???
Muny özüňiz anyklajakdygyňyza ynanýaryn, üstesine-de, bu mesele barada soňky makalada gysgaça durup geçdik. Ilki bilen haýsy meýdanyň ýokdugyny anyklaň, soň hemme zada düşünersiňiz. Gowy, gowy iş, Hiber biziň üçin bir topar haýyş döretdi. Weöne kör däl, geliň, FruitService synpynda JpaRepository <> interfeýsinden ýene birnäçe usuly durmuşa geçireliň.
//возвращает запись из таблицы по 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);
}
Şol usullary ProviderService synpynda durmuşa geçiriň. Soňra “FruitEntity” we “ProviderEntity” üçin “InitiateUtils” synpynda ulanyň we netijäni konsola çap ediň. (Theeri gelende aýtsak, bilmeýän bolsaňyz, sout ýazyp, enter basyp çalt “System.out.println ()” ýazyp bilersiňiz, şol bir zat “köpçülikleýin statiki boşluk esasy (String [] args)) { "Diňe psvm ýazyň we şol ýere gidiň we ş.m. ). Meniň pikirimçe, siz eýýäm bu meseläni çözdüňiz we biz öňe gitmäge taýýar. “FruitRepository” interfeýsine geçeliň we oňa ýazyp başlalyň (ýagny ýazmak we göçürmezlik) aşakdaky usul: Sanawy <FruitEntity> f Aşakdaky zady almaly. Diňe bir sorag ýazýan ýaly usula jaň ediň: findById (Integer id ) - id arkaly bir zat tapýar; countFruitEntityByFruitName (Setiriň ady) - belli bir at bilen miweleriň sanyny sanar; Bular usulyň ady bilen döredilen soraglar; olar hakda okaň we üpjün ediji_kod meýdançasynyň bahalary boýunça <FruitEntity> sanawyny gözlemek üçin FruitService synpynda (Integer-den Integer-e çenli) usuly ýerine ýetiriň. belli bir aralyk we işiň netijesini konsolda görkeziň. Mysal üçin: üpjün edijiniň sany 5 bilen 7 aralygyndaky ähli miweleri tapyň, usuly durmuşa geçirýänçäňiz has köp okamaga howlukmaň, bu köp wagt almaz. Makalada usulyň ady boýunça soraglar hakda okanyňyz ýaly: "Munuň ýaly soraglary ýazyp bilmersiňiz, ýöne ýönekeýleri ýazyp bilersiňiz." Has çylşyrymly soraglar üçin @Query düşündiriş ulanylýar we SQL-iň ýerine JPQL ulanylýar (bu makala hem üns beriň). Taslamamyz üçin JOIN talaplaryny edip bilersiňiz: Bahar gorkunç däl, ýa-da maglumat bazasyna nädip sorag bermeli - 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();

}
Adaty SQL talap: "fruit_table.provider_code = provayder_table.id-de miwe_table çep goşma üpjünçisinden miwe_table.fruit_name, üpjün ediji_table.provider_name saýlaň". Bu ýerde aňsatlyk bilen hat alyşmagy döredip bilersiňiz: f ruit_table “ FruitEntiy f”, bu ýerde “ FruitEntiy” üýtgeýjiniň görnüşi, f onuň ady, ýagny SQL tablisalar we meýdanlar bilen işleýär, JPQL obýektler we meýdanlar bilen işleýär. Fruitene- de miwe_table.fruit_name f.fruitName ; Obýektler bilen işleýänimiz üçin, obýekti çykaryp bileris: Geliň, başga bir “FruitRepository” usulyny ýazalyň
@Query("select f from  FruitEntity f  join ProviderEntity p on f.providerCode = p.id")
List<FruitEntity> joinFruit();
“FruitService” synpynda iki usuly hem durmuşa geçireliň
public List<String> joinString(){
   return fruitRepository.joinSting();
}

public List<FruitEntity> joinFruit(){
    return fruitRepository.joinFruit();
}
Erbet däl, ýöne çylşyrymly soraglar üçin gowy köne SQL ulanýarlar
@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();
Bularyň hemmesini InitiateUtils synpynda ulanýarys
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);
        }
Taslamany başlaýarys we konsolda täze surnallary görýäris: Miwe we olaryň üpjün edijileri Fruit1, null Fruit2, Provider5 Fruit3, Provider2 Fruit4, Provider5 Fruit5, null Fruit6, null Fruit7, null Fruit8, null Fruit9, null miweler stoly we olaryň üpjün edijiler “FruitEntity” (id = 2, fruitName = Fruit2, üpjün edijiCode = 5) . _ Näme üçin birinji tablisada boşluk bar, JOIN SQL hakda okasaňyz taparsyňyz . Şeýlelik bilen, maglumatlar bazasyna soraglar bilen tamamlandyk, henizem köp soraglaryňyzyň bardygyna ynanýaryn, ýöne olara jogap gözlärsiňiz diýip umyt edýärin, gözleg ýollaryny bellemäge synanyşdym. Bu döwürde öwrenen zatlarymyzyň hemmesini jemlemäge synanyşalyň: 1. Baharda web serwerini işledip bilersiňiz we bu kyn däl. 2. Bularyň nähili işleýändigine düşünmek üçin teoriýa çümmeli. Kitap hakda Bahar hakda makala peýdaly zatlar hakda makala 3. Fiziki koda öwrülmegi üçin kodlaşdyrmaly we dowam etmezden ozal bahar paslynda ýönekeý taslamalara eliňizi çekiň. Writtenazuw koduny göçürmän, täzeden ýazmak has gowudyr. Men we siziň üstümizde işleýän taslamamyzy şu ýerde ýerleşdirerin, ýöne siziň habardarlygyňyza bil baglaryn we pikirlenip göçürmejekdigiňize ynanýaryn. Git klon ammaryna baglanyşyk https: //FromJava@bitbucket.org/FromJava/jd.git Bu baglanyşygy nädip ulanmalydygyny bilmeýänler üçin iki okuw taslamasyny durmuşa geçirmegi maslahat berýärin: Awtoulaglary boýamak baradaky taslama: Birinji synp: CarEntity {Integer id; Setir modeliName; Setir reňki; } Ikinji synp: ColorEntity {Integer id; Setir reňki; Bitewi bahasy; Database Maglumatlar bazasyny dolduryň (düşünmek has aňsat bolar ýaly hakyky atlary tapyň), ýerine ýetiriň :, edara, ammarlar, hyzmatlar, standart we stolüsti soraglary dörediň (BMW gyzyl reňklemek üçin näçe pul gerek? Haýsy reňk? iň gymmatmy? Konsola elipbiý tertibinde we ş.m. ýazyň); Kitaphana taslamasy: Birinji synp: BookEntity {Integer id; Setir adyBook; Bitewi ýyl; Bitewi awtorId; } Ikinji synp: AutorEntity {Integer id; SetirNameAutor; Setir lastNameAutor; Database Maglumatlar bazasyny dolduryň (düşünmek has aňsat bolar ýaly hakyky atlary tapyň), durmuşa geçiriň: edara, ammarlar, hyzmatlar, standart we stolara soraglar dörediň (Haýsy kitap ýazdy? Haýsy kitap ilki ýazyldy? Haýsy kitap ýazyldy? 1800-1900-nji ýyllar? Awtorlaryň haýsysy iň köp kitap ýazdy?); "Kitaphana" taslama maglumatlar bazasyny doldurmak üçin mysallar Kitap tablisasy BookEntity (id = 1, nameBook = Wit-den waý, ýylCreat = 1824, authorId = 1) BookEntity (id = 2, nameBook = Uruş we Parahatçylyk, yearCreat = 1863, authorId = 2) BookEntity (id = 3, nameBook = Mtsyri, yearCreat = 1838, authorId = 3) BookEntity (id = 4, nameBook = Eugene Onegin, yearCreat = 1833, authorId = 4) Awtorlar tablisasy AuthorEntity (id = 1, firstNameAuthor = Alexander, lastNameAuthor = Griboyedov) AuthorEntity (id = 2) . _ _
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION