JavaRush /Java Blog /Random-TL /Ang tagsibol ay hindi nakakatakot, o kung paano magtanong...

Ang tagsibol ay hindi nakakatakot, o kung paano magtanong ng isang tanong sa database

Nai-publish sa grupo
NILALAMAN NG CYCLE OF ARTICLES Ngayon ay tinatapos namin ang gawain kasama ang database bilang bahagi ng aming proyekto. Kung ginawa mo nang tama ang lahat, dapat kang magkaroon ng isang pom na may mga sumusunod na dependencies:
<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>
At narito ang istraktura ng proyekto: Ang tagsibol ay hindi nakakatakot, o kung paano magtanong ng isang tanong sa database - 1 Alam mo ba kung sino ang matagal na nating hindi naaalala? Ito ay application.yml, hindi namin masyadong napag-usapan ang tungkol dito sa isa sa mga nakaraang artikulo. Ngayon, sige at tanggalin natin ito! Oo, oo tanggalin at iyon na! Kung ilulunsad natin ang proyekto ngayon, gagana ang lahat tulad ng dati, subukan ito. Nangyari ito dahil ang Spring mismo ay na-configure na may mga default na setting. Ngayon kailangan naming ibalik ang aming yml file pabalik sa resources folder, kakailanganin pa rin namin ito: application.yml (dapat pareho ang pangalan)
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
Noong nakaraang pagkakataon, nagpatupad kami ng ilang query sa database gamit ang mga pamamaraan ng interface ng 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);
}
Kung nabasa mo ang tungkol sa SQL , tulad ng hiniling ko sa iyo na gawin noong nakaraan, dapat mong malaman na ang mga naturang aksyon sa database ay dapat gawin gamit ang mga query sa SQL. Ngunit walang pahiwatig nito sa proyekto; kahit na sa mga console log ay walang katulad. Hanapin natin sila, buksan ang application.yml, hanapin ang show-sql: linya doon (ipakita ang sql) at baguhin ang false sa true. Inilunsad namin ang proyekto at tumingin sa console, ang mga log ay puno ng mga bagong entry na halos kapareho sa SQL, sa katunayan, karamihan sa kanila ay hindi mahirap maunawaan, halimbawa:
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))
Ngunit ang entry na ito ay maaaring magtaas ng maraming katanungan dahil sa mga tandang pananong nito:
Hibernate: insert into fruit_table (fruit_name, provider_code, id_fruit) values (?, ?, ?)
Mag-isip tayo nang lohikal: Una, nakikita natin ang salitang Hibernate, na nangangahulugang inilagay ng malihim na taong ito ang kanyang mabalahibong paa dito. Matapos basahin ang tungkol sa kanya sa Internet, nalaman namin na si Mr. Hiber ay isang pagpapatupad ng modelong ORM. Ang object-relational model ay naglalarawan ng mga ugnayan sa pagitan ng mga software object at mga tala sa database. Kapag naayos na ang ideyang ito, patuloy kaming nag-iisip nang lohikal: Sa isang banda, mayroon kaming FruitEntity object , mayroon itong tatlong field: Integer id; String fruitName; Integer providerCode. Sa kabilang banda, mayroon kaming table sa database fruit_table na may mga field na id_fruit type integer, fruit_name type varchar(255) , provider_code type integer. Sa halos pagsasalita, ang Hibernate ay kumukuha ng isang FruitEntity object , kinukuha ang mga halaga ng mga field ng object at isusulat ang mga ito sa kaukulang mga field ng talahanayan. Mayroon akong tanong para sa iyo: Tingnan, sa klase ng InitiateUtils ipinatupad namin ang pagpuno sa talahanayan ng prutas, ngunit sa ilang kadahilanan ay itinakda namin ang halaga sa dalawang field lamang, nasaan ang pangatlo?
new FruitEntity()
        .setFruitName("Fruit1")//раз
        .setProviderCode(Math.abs(new Random().nextInt() % 10)),//два
                                            //три???
Sigurado akong malalaman mo ito para sa iyong sarili, bukod sa, saglit naming hinawakan ang isyung ito sa artikulo bago ang huli. Una, alamin kung aling larangan ang wala dito, at pagkatapos ay mauunawaan mo ang lahat. Magaling, gumawa si Hiber ng maraming kahilingan para sa amin. Ngunit hindi kami bulag, ipatupad natin ang ilang higit pang mga pamamaraan mula sa interface ng JpaRepository<> sa klase ng 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);
}
Ipatupad ang parehong mga pamamaraan sa klase ng ProviderService. Pagkatapos ay gamitin ang mga ito sa klase ng InitiateUtils para sa FruitEntity at ProviderEntity at i-print ang resulta sa console. (Nga pala, kung hindi mo alam, mabilis mong maisusulat ang “System.out.println()” sa pamamagitan ng pag-type ng sout at pagpindot sa enter, ang parehong bagay ay gumagana sa “public static void main(String[] args){} ” i-type mo lang ang psvm at doon ka na etc ). Sa tingin ko ay napag-usapan mo na ito at handa na kaming magpatuloy. Pumunta tayo sa interface ng FruitRepository at simulan ang pag-type dito (ibig sabihin ang pag-type at hindi pagkopya) ang sumusunod na pamamaraan: List<FruitEntity> f Dapat mong makuha ang sumusunod na bagay. Ang tagsibol ay hindi nakakatakot, o kung paano magtanong ng isang tanong sa database - 2 Tawagan lamang ang pamamaraan na parang gumagawa ka ng isang query: findById(Integer id ) - nakahanap ng isang bagay sa pamamagitan ng id; countFruitEntityByFruitName(String name) - bibilangin ang bilang ng mga prutas na may partikular na pangalan; Ito ay mga query na nabuo sa pamamagitan ng pangalan ng pamamaraan; siguraduhing basahin ang tungkol sa mga ito at ipatupad ang pamamaraan sa pagitan ng(Integer mula sa, Integer hanggang) sa klase ng FruitService upang maghanap sa Listahan<FruitEntity> sa pamamagitan ng mga halaga ng field ng provider_code na kasama sa isang tiyak na agwat, at ipakita ang resulta ng trabaho sa console. Halimbawa: hanapin ang lahat ng prutas na ang numero ng tagapagtustos ay nasa pagitan ng 5 at 7. Huwag magmadaling magbasa pa hanggang sa ipatupad mo ang pamamaraan, hindi ito magtatagal. Tulad ng maaaring nabasa mo sa artikulo tungkol sa mga query ayon sa pangalan ng pamamaraan: "Hindi mo maaaring isulat ang lahat ng mga query na tulad nito, ngunit ang mga simple ay maaaring isulat." Para sa mas kumplikadong mga query, ginagamit ang @Query annotation at JPQL ang ginagamit sa halip na SQL (tandaan din ang artikulong ito). Para sa aming proyekto, maaari kang gumawa ng JOIN query, tulad nito:
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();

}
Ang isang karaniwang query sa SQL ay: "piliin ang fruit_table.fruit_name, provider_table.provider_name mula sa fruit_table kaliwa sumali sa provider_table sa fruit_table.provider_code = provider_table.id". Dito madali kang makakapagtatag ng isang sulat: f ruit_table ay FruitEntiy f, kung saan ang FruitEntiy ay ang uri ng variable, f ang pangalan nito, iyon ay, gumagana ang SQL sa mga talahanayan at field, at JPQL na may mga bagay at kanilang mga field. Muli fruit_table.fruit_name ay f.fruitName ; Dahil nagtatrabaho kami sa mga bagay, maaari naming i-output ang bagay: Sumulat tayo ng isa pang paraan ng FruitRepository
@Query("select f from  FruitEntity f  join ProviderEntity p on f.providerCode = p.id")
List<FruitEntity> joinFruit();
Ipatupad natin ang parehong mga pamamaraan sa klase ng FruitService
public List<String> joinString(){
   return fruitRepository.joinSting();
}

public List<FruitEntity> joinFruit(){
    return fruitRepository.joinFruit();
}
Hindi ito masama, ngunit gumagamit pa rin sila ng magandang lumang SQL para sa mga kumplikadong query
@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();
At ginagamit namin silang lahat sa klase ng 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);
        }
Inilunsad namin ang proyekto at nakakita ng mga bagong log sa console: Talaan ng mga prutas at mga supplier ng mga ito Fruit1,null Fruit2,Provider5 Fruit3,Provider2 Fruit4,Provider5 Fruit5,null Fruit6,null Fruit7,null Fruit8,null Fruit9,null Table ng mga prutas at ang kanilang mga supplier FruitEntity(id= 2, fruitName=Fruit2, providerCode=5) FruitEntity(id=3, fruitName=Fruit3, providerCode=2) FruitEntity(id=4, fruitName=Fruit4, providerCode=5) Talaan ng mga prutas at kanilang mga supplier Fruit2 ,Provider5 Fruit3,Provider2 Fruit4,Provider5 Oo, kung pagod ka na sa "pseudo" at mga SQL query lang sa console, maaari kang magbalik ng false sa lugar nito sa yaml file. Bakit may null sa unang talahanayan, malalaman mo kung nabasa mo ang tungkol sa JOIN SQL . At kaya, tapos na kami sa mga query sa database, sigurado ako na marami ka pa ring katanungan, ngunit umaasa ako na hahanapin mo ang mga sagot sa kanila, sinubukan kong i-highlight ang mga landas sa paghahanap. Subukan nating ibuod ang lahat ng ating natutunan sa panahong ito: 1. Maaari kang magpatakbo ng isang web server sa Spring at hindi ito mahirap. 2. Upang maunawaan kung paano gumagana ang lahat, kailangan mong sumabak sa teorya. Tungkol sa aklat na Artikulo tungkol sa tagsibol Artikulo tungkol sa mga kapaki-pakinabang na bagay 3. Upang ang pag-unawa ay maging pisikal na code, kailangan mong mag-code, at bago magpatuloy, kumuha ng iyong mga kamay sa mga simpleng proyekto sa spring-boot. At mas mainam na huwag kopyahin ang nakasulat na code, ngunit muling isulat ito. Ipo-post ko dito ang proyektong pinaghirapan mo at ako, ngunit aasa ako sa iyong kamalayan at sigurado akong hindi ka magkokopya-paste nang walang kabuluhan. Link sa git clone repository https://FromJava@bitbucket.org/FromJava/jd.git Para sa mga hindi alam kung paano gamitin ang link na ito, inirerekomenda ko ang pagpapatupad ng dalawang proyekto sa pagsasanay: Proyekto tungkol sa pagpipinta ng mga kotse: Unang klase: CarEntity{ Integer id; String modelName; Kulay ng string; } Pangalawang klase: ColorEntity{ Integer id; Kulay ng string; Integer na presyo; } Punan ang database (makabuo ng mga makatotohanang pangalan para mas madaling maunawaan), ipatupad ang: , entity, repositoryo, serbisyo, lumikha ng mga standard at cross-table na query (Magkano ang pagpinta ng pula ng BMW? Anong kulay ang ang pinakamahal? Sumulat ng mga modelo sa console sa alpabetikong pagkakasunud-sunod at iba pa); Proyekto sa aklatan: Unang klase: BookEntity{ Integer id; String nameBook; Integer yearCreat; Integer autoId; } Pangalawang klase: AutorEntity{ Integer id; String firstNameAutor; String lastNameAutor; } Punan ang database (bumuo ng mga makatotohanang pangalan para mas madaling maunawaan), ipatupad ang: entity, repositoryo, serbisyo, lumikha ng mga standard at inter-table na query (Sino ang sumulat ng aklat? Aling aklat ang unang isinulat? Aling mga aklat ang isinulat mula 1800 hanggang 1900? Sino sa mga may-akda ang sumulat ng pinakamaraming aklat?); Mga halimbawa para sa pagpuno sa database ng proyekto na "Library". Book table 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) Authors 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 sa lahat, see you again!
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION