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

Ang tagsibol ay hindi nakakatakot, o kung paano i-populate ang isang h2 database (at isang maliit na Hibernate)

Nai-publish sa grupo
NILALAMAN NG CYCLE OF ARTICLES Ipinagpapatuloy namin ang aming proyekto. Paano lumikha ng isang proyekto sa web. Ikinonekta namin ang database sa aming proyekto sa web . Sa pagkakataong ito ay magkakaroon ng higit pang mga liham, hindi kami makakarating sa loob ng limang minuto. Sa huling artikulo, pinayuhan kita na magbasa ng ilang pahina o ilang artikulo tungkol sa Spring , o hindi bababa sa google tungkol sa kung ano ang beans, konteksto, entity, dependency injection sa Spring, mga paraan upang i-configure ang beans. Kung hindi, ipinapayo ko sa iyo na gawin ito ngayon o pagkatapos ng artikulong ito. Bago punan ang aming h2 base. Ito ay kinakailangan upang lumikha ng isang utility class upang magpatakbo ng mga pamamaraan para sa pagpuno ng database sa loob nito. Sa pakete
ru.java.rush
Paglikha ng isang pakete para sa mga kagamitan
utils
At ang utility mismo:
package ru.java.rush.utils;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;

@Service //annotation помечает бин How сервис
public class InitiateUtils implements CommandLineRunner { //имплементируем интерфейс CommandLineRunner (командная строка запуска)

    @Override
//переопределяем метод который позволит
//нам выполнять методы нашего applications при запуске
    public void run(String... args) throws Exception {
        System.out.println("run"); //проверим что это работает
    }
}
Patakbuhin natin ang application at ang "run" ay ipapakita sa console . Kailangan namin ang utility na ito bilang isang kahalili sa klase ng Applications, dahil dapat lang itong maging responsable sa paglulunsad ng application. Gumawa tayo ng mga entity. Ang entity ay isang bean na ang layunin ay mag-imbak ng ilang data. Sa pakete
ru.java.rush
Gumawa ng package para sa mga entity
entities
At ang kakanyahan mismo, hayaan itong maging bunga:
package ru.java.rush.entities;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Entity//помечаем бин How сущность
@Table(name = "fruit_table")//в этой аннотации можно указать Name создаваемой таблицы
public class FruitEntity {

    @Id//annotation из пакета avax.persistence.*, помечает поле How id
    @Column(name = "id_fruit")//в этой аннотации можно указать Name поля
    @GenericGenerator(name = "generator", strategy = "increment")//незаметно добрались до hibernate,
// здесь указывается что id будет автоматически увеличиваться при новых записях
    @GeneratedValue(generator = "generator")//annotation генерации id
    private Integer id;

    @Column(name = "fruit_name")
    private String fruitName;

    @Column(name = "provider_code")
    private Integer providerCode;

   //что бы в с классом можно было совершать манипуляции создается
  //пустой конструктор, геттеры, сеттеры и переопределяется метод toString()

  public FruitEntity(){ //пустой конструктор

 }

public Integer getId() {
    return id;
}

 //геттеры, сеттеры
public String getFruitName() {
    return fruitName;
}

public FruitEntity setFruitName(String fruitName) {
    this.fruitName = fruitName;
    return this;
}

public Integer getProviderCode() {
    return providerCode;
}

public FruitEntity setProviderCode(Integer providerCode) {
    this.providerCode = providerCode;
    return this;
}

//переопределяем toString()
@Override
public String toString() {
    return "FruitEntity{" +
            "id=" + id +
            ", fruitName='" + fruitName + '\'' +
            ", providerCode=" + providerCode +
            '}';
}
}
Ang constructor, getter, setter at toString() ay hindi kailangang isulat sa pamamagitan ng kamay; mabilis silang mabuo . Okay, nakikipag-ugnayan ang aming entity sa database at nag-iimbak ng data mula sa database. Ang kakanyahan ay nasa trabaho. Ngunit ang isang tao ay dapat magpatakbo ng entity sa application. Para sa layuning ito nakabuo sila ng isang "imbakan". Sa pakete
ru.java.rush
Paglikha ng isang pakete para sa mga repositoryo
repositories
At ang imbakan mismo
package ru.java.rush.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import ru.java.rush.entities.FruitEntity;

@Repository//помечаем что этот бин - репозиторий
public interface FruitRepository extends JpaRepository<FruitEntity,Integer> {
//репозиторий является интерфейсом, который наследуется от другого интерфейса JpaRepository<>
//для него необходимо указать с Howой сущность он должен работать, у нас это FruitEntity
//и тип данных у поля id данной сущности, у нас это Integer
}
Ang tanong ay, bakit walang laman ang katawan ng interface, walang iisang paraan na ipinapahayag nito? Upang sagutin, pindutin nang matagal ang Ctrl at mag-click sa JpaRepository at tingnan na ito mismo ay nagmamana mula sa PagingAndSortingRepository<t, ""> at QueryByExampleExecutor<>, nagdedeklara rin sila ng ilang pamamaraan. Hindi ko kokopyahin ang mga pamamaraan dito; hanapin ang iyong sarili. Dahil ang repositoryo ay isang interface, wala itong ginagawa, ipinapahayag lamang nito ang mga pamamaraan, kailangan ng ibang tao upang ipatupad ang mga pamamaraang ito. Ito ang dahilan kung bakit naimbento ang isang "serbisyo". Sa pakete
ru.java.rush
Paglikha ng isang pakete para sa mga serbisyo
services
At ang serbisyo mismo
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
Ngayon ay nakarating na tayo sa isang mahalagang punto: "Paano at bakit mag-iniksyon ng bean" (mag-inject ng dependency). Kung hindi mo naiintindihan ang ibig kong sabihin, hinihiling ko sa iyo na basahin ang paksang ito, ngayon o huli, lalo na bigyang pansin ang mga pamamaraan ng "iniksyon", ilan ang mayroon, alin ang mas mabuti, alin ang mas masahol, at bakit . Ginagamit namin ang isa sa mga pamamaraan. Kailangan namin ang "serbisyo" upang kahit papaano ay konektado sa "imbakan". Dinadagdagan namin ang aming serbisyo ng isang anotasyon at isang variable.
package ru.java.rush.services;

import org.springframework.stereotype.Service;
import ru.java.rush.repositories.FruitRepository;

@Service
public class FruitService {

    private final FruitRepository fruitRepository;  //final переменная репозитория

public FruitService(FruitRepository fruitRepository) {//внедрor зависимость через конструктор
    this.fruitRepository = fruitRepository;
}

}
Ngayon ay maaari mong ipatupad ang pamamaraan mula sa "imbakan" Dinadagdagan namin ang "serbisyo"
package ru.java.rush.services;

import org.springframework.stereotype.Service;
import ru.java.rush.entities.FruitEntity;
import ru.java.rush.repositories.FruitRepository;

@Service
public class FruitService {

    private final FruitRepository fruitRepository;

public FruitService(FruitRepository fruitRepository) {//внедor зависимость
    this.fruitRepository = fruitRepository;
}

//создали публичный метод (название любое может быть)
//на вход принимает сущность и сохраняет ее в базу
    public void save(FruitEntity fruitEntity){
        fruitRepository.save(fruitEntity); //реализовали метод внедренного бина
    }

//возвращает лист всех сущностей из базы
    public List<FruitEntity> getAll(){
       return fruitRepository.findAll(); //реализовали метод внедренного бина
    }
}
Ang natitira na lang ay ipatupad ito sa aming utility. Lumipat tayo sa klase ng InitiateUtils
package ru.java.rush.utils;


import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;
import ru.java.rush.entities.FruitEntity;
import ru.java.rush.services.FruitService;

import java.util.List;

@Service
public class InitiateUtils implements CommandLineRunner {

    private final FruitService fruitService;

public InitiateUtils (FruitService fruitService) {//незабываем конструктор для внедрения
    this. fruitService = fruitService;
}

    @Override
    public void run(String... args) throws Exception {

//создаем несколько сущностей фруктов, через сеттеры заполняем поля
        FruitEntity fruitEntity1 = new FruitEntity();
        fruitEntity1.setFruitName("fruit1");
        fruitEntity1.setProviderCode(1);

        FruitEntity fruitEntity2 = new FruitEntity();
        fruitEntity2.setFruitName("fruit2");
        fruitEntity2.setProviderCode(2);

        FruitEntity fruitEntity3 = new FruitEntity();
        fruitEntity3.setFruitName("fruit3");
        fruitEntity3.setProviderCode(3);

//с помощью переменной сервиса вызываем методы сохранения в базу, по разу для одного an object
        fruitService.save(fruitEntity1);
        fruitService.save(fruitEntity2);
        fruitService.save(fruitEntity3);

//здесь вытаскиваем базу обратно
        List<FruitEntity> all = fruitService.getAll();

//и выводим что получилось
        for (FruitEntity entity : all) {
            System.out.println(entity);
        }
    }
}
Output ng console: FruitEntity(id=1, fruitName=fruit1, providerCode=1) FruitEntity(id=2, fruitName=fruit2, providerCode=2) FruitEntity(id=3, fruitName=fruit3, providerCode=3) Dito ka makakatapos . "Isang segundo!" - ang pinaka matulungin na mambabasa ay bubulalas - "Nasaan pa rin ang Hibernate?" At ang Hibernate ay kumikilos dito bilang isang manlalaban sa hindi nakikitang harapan; gumawa ito ng napakahalagang bagay: lumikha ito ng mga istruktura ng database para sa amin. Nang isulat namin ang mga field sa "entity" at minarkahan ang mga ito ng mga kinakailangang anotasyon, ginawa ng Hibernate ang trabaho nito. Sa katunayan, kapag mabilis kang nag-develop, malamang na hindi mo haharapin ang istraktura ng database; lahat ay malilikha at mai-deploy para sa iyo. Ngunit sa gayong maliliit na proyekto, ang Hibernate na may kakayahang lumikha ng mga istruktura ng database ay hindi maaaring palitan; siyempre, hindi lamang ito ang kalamangan nito, halimbawa, ito ay mahusay sa paglikha ng mga kaugnay na entity (hindi namin sila gagamitin sa proyektong ito). Kamustahin natin ang hamak na manggagawang ito: pumunta sa IDEA sa istraktura ng proyekto (sa kaliwa ay may isang puno na may mga folder at mga file), doon ay makikita natin ang Mga Panlabas na Aklatan, buksan ito at makikita ito sa iba pang mga aklatan
Maven: org.hibernate.common:hibernate-commons-annotations:5.1.0.Final
Maven: org.hibernate.validator:hibernate-validator:6.0.17.Final
Maven: org.hibernate:hibernate-core:5.4.6.Final
Sa partikular, ang Hibernate ay na-download para sa amin ni Maven at
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Sa katunayan, si G. Hiber ay nagsagawa ng isa pang patagong operasyon, ngunit pag-uusapan natin ito sa susunod na artikulo. Iyon lang ang sigurado ngayon. Bilang pagsasanay sa pagsasanay, iminumungkahi kong ipatupad mo ang paraan ng saveAll() para sa FruitEntity mismo , na magse-save ng lahat ng entity sa database nang sabay-sabay. Susunod, tingnan natin kung paano paikliin ang code ng proyekto gamit ang Lombok library
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION