JavaRush /Blog Jawa /Random-JV /Spring ora medeni, utawa carane takon pitakonan database
Павел
tingkat

Spring ora medeni, utawa carane takon pitakonan database

Diterbitake ing grup
ISI SIKLUS ARTIKEL Dina iki kita ngrampungake karya karo basis data minangka bagéan saka proyek kita. Yen sampeyan nindakake kabeh kanthi bener, sampeyan kudu duwe pom kanthi dependensi ing ngisor iki:
<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>
Lan ing ngisor iki struktur proyek kasebut: Spring ora medeni, utawa carane takon pitakonan database - 1 Apa sampeyan ngerti sapa sing wis suwe ora eling? Iki application.yml, kita ora ngomong akeh babagan ing salah sawijining artikel sadurunge. Saiki ayo diterusake lan mbusak! Ya, ya mbusak lan iku! Yen kita miwiti proyek saiki, kabeh bakal bisa digunakake kaya sadurunge, coba iki. Iki kedadeyan amarga Spring dhewe wis dikonfigurasi karo setelan gawan. Saiki kita kudu mbalekake file yml bali menyang folder sumber daya, kita isih butuh: application.yml (jenenge kudu padha)
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
Pungkasan, kita ngetrapake sawetara pitakon menyang database nggunakake metode antarmuka 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);
}
Yen sampeyan maca babagan SQL , kaya sing dakkarepake, mula sampeyan kudu ngerti yen tumindak kasebut karo database kudu ditindakake nggunakake pitakon SQL. Nanging ora ana pitunjuk babagan proyek kasebut; sanajan ing log konsol ora ana sing padha. Ayo goleki, bukak application.yml, goleki show-sql: baris ana (show sql) lan ganti false to true. Kita miwiti proyek kasebut lan ndeleng konsol, log diisi karo entri anyar sing meh padha karo SQL, nyatane, umume ora angel dingerteni, umpamane:
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))
Nanging entri iki bisa uga nuwuhake akeh pitakon amarga tandha pitakon:
Hibernate: insert into fruit_table (fruit_name, provider_code, id_fruit) values (?, ?, ?)
Ayo dipikir kanthi logis: Kaping pisanan, kita ndeleng tembung Hibernate, sing tegese wong sing rahasia iki wis nyelehake paw wulune ing kene. Sawise maca babagan dheweke ing Internet, kita sinau manawa Pak Hiber minangka implementasi model ORM. Model obyek-relasional nggambarake hubungan antarane obyek piranti lunak lan cathetan ing database. Duwe tetep idea iki, kita terus mikir logis: Ing tangan siji, kita duwe obyek FruitEntity , wis telung lapangan: Integer id; String fruitName; Kode panyedhiya integer. Ing tangan liyane, kita duwe tabel ing database fruit_table karo lapangan id_fruit jinis integer, fruit_name jinis varchar(255) , provider_code tipe integer. Kira-kira, Hibernate njupuk obyek FruitEntity , narik metu nilai kolom obyek lan nulis menyang kolom tabel sing cocog. Aku duwe pitakonan kanggo sampeyan: Deleng, ing kelas InitiateUtils kita ngetrapake ngisi meja woh, nanging sakperangan alesan kita nyetel nilai mung rong lapangan, endi sing katelu?
new FruitEntity()
        .setFruitName("Fruit1")//раз
        .setProviderCode(Math.abs(new Random().nextInt() % 10)),//два
                                            //три???
Aku yakin sampeyan bakal ngerti iki dhewe, kajaba, kita sedhela ndemek masalah iki ing artikel sadurunge pungkasan. Pisanan, goleki lapangan sing ora ana ing kene, banjur sampeyan bakal ngerti kabeh. Inggih, rampung, Hiber ngasilake akeh panjalukan kanggo kita. Nanging kita ora wuta, ayo ngleksanakake sawetara cara liyane saka antarmuka JpaRepository<> ing kelas 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);
}
Ngleksanakake cara sing padha ing kelas ProviderService. Banjur gunakake ing kelas InitiateUtils kanggo FruitEntity lan ProviderEntity lan print asil menyang console. (Oalah, yen sampeyan ora ngerti, sampeyan bisa kanthi cepet nulis "System.out.println()" kanthi ngetik sout lan pencet enter, bab sing padha karo "public static void main (String [] args){} ” Cukup ketik psvm lan ana sampeyan lsp ). Aku mikir sampeyan wis ditangani lan kita siyap nerusake. Ayo pindhah menyang antarmuka FruitRepository lan wiwiti ngetik (yaiku ngetik lan ora nyalin) cara ing ngisor iki: List<FruitEntity> f Sampeyan kudu entuk perkara ing ngisor iki. Spring ora medeni, utawa carane takon pitakonan database - 2 Cukup nelpon metode kasebut kaya-kaya sampeyan nggawe query: findById(ID Integer ) - nemokake obyek kanthi id; countFruitEntityByFruitName(String name) - bakal ngetung jumlah woh kanthi jeneng tartamtu; Iki minangka pitakon sing digawe kanthi jeneng metode kasebut; manawa sampeyan maca babagan lan ngetrapake metode antarane (Integer saka, Integer to) ing kelas FruitService kanggo nggoleki List<FruitEntity> kanthi nilai kolom provider_code sing kalebu ing interval tartamtu, lan nampilake asil karya ing console. Contone: golek kabeh woh-wohan sing nomer supplier antarane 5 lan 7. Aja kesusu maca luwih nganti sampeyan ngleksanakake cara, iku ora njupuk dawa. Kaya sing wis diwaca ing artikel babagan pitakon kanthi jeneng metode: "Sampeyan ora bisa nulis kabeh pitakon kaya iki, nanging sing prasaja bisa ditulis." Kanggo pitakon sing luwih rumit, anotasi @Query digunakake lan JPQL digunakake tinimbang SQL (uga njupuk cathetan artikel iki). Kanggo proyek kita, sampeyan bisa nggawe pitakon JOIN, kaya iki:
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();

}
A query SQL standar bakal: "pilih fruit_table.fruit_name, provider_table.provider_name saka fruit_table kiwa gabung provider_table ing fruit_table.provider_code = provider_table.id". Kene sampeyan bisa kanthi gampang netepake Correspondence a: f ruit_table punika FruitEntiy f, ngendi FruitEntiy jinis variabel, f jeneng sawijining, sing, SQL dianggo karo tabel lan kothak, lan JPQL karo obyek lan kothak. Maneh fruit_table.fruit_name iku f.fruitName ; Awit kita bisa karo obyek, kita bisa output obyek: Ayo nulis cara FruitRepository liyane
@Query("select f from  FruitEntity f  join ProviderEntity p on f.providerCode = p.id")
List<FruitEntity> joinFruit();
Ayo ngleksanakake loro cara ing kelas FruitService
public List<String> joinString(){
   return fruitRepository.joinSting();
}

public List<FruitEntity> joinFruit(){
    return fruitRepository.joinFruit();
}
Iku ora muni ala, nanging isih nggunakake SQL lawas apik kanggo pitakonan Komplek
@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();
Lan kita nggunakake kabeh ing kelas 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);
        }
Kita miwiti proyek kasebut lan ndeleng log anyar ing konsol: Tabel woh-wohan lan pemasoké Fruit1, null Fruit2, Provider5 Fruit3, Provider2 Fruit4, Provider5 Fruit5, null Fruit6, null Fruit7, null Fruit8, null Fruit9, null Table of fruits and their supplier FruitEntity(id= 2, fruitName=Fruit2, providerCode=5) FruitEntity(id=3, fruitName=Fruit3, providerCode=2) FruitEntity(id=4, fruitName=Fruit4, providerCode=5) Tabel woh-wohan lan suppliere Fruit2 , Provider5 Fruit3, Provider2 Fruit4 , Provider5 Ya, yen sampeyan wis kesel "pseudo" lan mung SQL pitakon ing console, sampeyan bisa bali palsu ing panggonan ing file yaml. Apa ana null ing tabel pisanan, sampeyan bakal mangerteni yen maca babagan JOIN SQL . Dadi, kita wis rampung karo pitakon menyang database, aku yakin sampeyan isih duwe akeh pitakonan, nanging muga-muga sampeyan bakal nemokake jawaban kanggo wong-wong mau, aku nyoba nyorot jalur telusuran. Ayo nyoba ngringkes kabeh sing wis kita sinau sajrone wektu iki: 1. Sampeyan bisa mbukak server web ing Spring lan ora angel. 2. Kanggo ngerti cara kerjane, sampeyan kudu nyilem menyang teori. Babagan buku Artikel bab spring Artikel bab migunani 3. Supaya pangerten kanggo nguripake menyang kode fisik, sampeyan kudu kode, lan sadurunge nerusake, njaluk tangan ing proyek prasaja ing spring-boot. Lan luwih becik ora nyalin kode sing ditulis, nanging nulis maneh. Aku bakal ngirim proyek sing sampeyan lan aku kerja ing kene, nanging aku bakal ngandelake kesadaran sampeyan lan aku yakin sampeyan ora bakal nyalin-tempel. Link menyang repositori klon git https://FromJava@bitbucket.org/FromJava/jd.git Kanggo sing ora ngerti carane nggunakake link iki, aku nyaranake ngleksanakake rong proyek latihan: Proyek babagan lukisan mobil: Kelas pertama: CarEntity{ Integer id; String modelName; Warna string; } Kelas kapindho: ColorEntity{ Integer id; Warna string; rega integer; } Isi database (teka munggah karo jeneng nyata supaya bakal luwih gampang kanggo ngerti), ngleksanakake: , entitas, repositori, layanan, nggawe standar lan cross-tabel pitakon (Pinten biaya kanggo Paint abang BMW? Apa werna paling larang? Tulis model kanggo console ing urutan abjad lan etc.); Proyek perpustakaan: Kelas siji: BookEntity{ Integer id; String nameBook; Integer yearCreat; Integer autoId; } Kelas kapindho: AutorEntity{ Integer id; String firstNameAutor; String lastNameAutor; } Isi database (nemokake jeneng sing nyata supaya luwih gampang dimangerteni), ngleksanakake: entitas, repositori, layanan, nggawe pitakon standar lan antar-tabel (Sapa sing nulis buku endi? Buku endi sing ditulis dhisik? Buku sing ditulis saka 1800 nganti 1900? Sapa penulis sing nulis buku paling akeh?); Conto kanggo ngisi database proyek "Perpustakaan". Tabel buku 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) Author table AuthorEntity(id=1, firstNameAuthor=Alexander, lastNameAuthor=Griboyedov) AuthorEntity(id=2 , firstNameAuthor=Lev, lastNameAuthor=Tolstoy) AuthorEntity(id=3, firstNameAuthor=Mikhail, lastNameAuthor=Lermontov) AuthorEntity(id=4, firstNameAuthor=Alexander, lastNameAuthor=Pushkin) Good luck everyone, ketemu maneh!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION