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

Баҳор даҳшатнок нест, ё чӣ гуна пур кардани пойгоҳи додаҳои h2 (ва каме Hibernate)

Дар гурӯҳ нашр шудааст
МАЗМУРИЯТИ СИКЛИ МАҚОЛАҲО Мо лоиҳаи худро идома медиҳем. Чӣ тавр сохтани лоиҳаи веб. Мо пойгоҳи додаҳоро ба лоиҳаи веби худ пайваст мекунем . Ин дафъа мактубҳои бештар хоҳанд омад, мо дар панҷ дақиқа даст намеёбем. Дар мақолаи охирин, ман ба шумо маслиҳат додам, ки якчанд саҳифа ё якчанд мақоларо дар бораи Баҳор ё ҳадди аққал дар бораи он, ки лӯбиё чист, контекст, an objectҳо, тазриқи вобастагӣ дар баҳор, роҳҳои танзими лӯбиё. Агар не, пас ман ба шумо маслиҳат медиҳам, ки худи ҳозир ё пас аз ин мақола кор кунед. Пеш аз пур кардани пойгоҳи h2 мо. Барои иҷро кардани усулҳои пур кардани базаи маълумот дар он синфи утorта эҷод кардан лозим аст. Дар баста
ru.java.rush
Эҷоди бастаи хидматҳои коммуналӣ
utils
Ва худи хидматрасонӣ:
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"); //проверим что это работает
    }
}
Биёед барномаро иҷро кунем ва "давидан" дар консол нишон дода мешавад . Мо ба ин утorта ҳамчун алтернатива ба синфи Барномаҳо ниёз дорем, зеро он бояд танҳо барои оғози барнома масъул бошад. Биёед an objectҳоро эҷод кунем. Муассиса лӯбиёест, ки ҳадафаш нигоҳ доштани баъзе маълумот аст. Дар баста
ru.java.rush
Барои субъектҳо баста эҷод кунед
entities
Ва худи моҳият, бигзор он мева бошад:
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 +
            '}';
}
}
Конструктор, гирандагон, сеттерҳо ва toString() набояд дастӣ навишта шаванд; онҳоро зуд тавлид кардан мумкин аст . Хуб, муассисаи мо бо пойгоҳи додаҳо ҳамкорӣ мекунад ва маълумотро аз пойгоҳи додаҳо нигоҳ медорад. Моҳият дар кор аст. Аммо касе бояд an objectро дар барнома идора кунад. Бо ин максад онхо «анбор» ба миён гузоштанд. Дар баста
ru.java.rush
Эҷоди баста барои анборҳо
repositories
Ва худи анбор
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
}
Савол ба миён меояд, ки чаро бадани интерфейс холӣ аст, усули ягонае нест, ки он эълон кунад? Барои ҷавоб додан, Ctrl-ро пахш кунед ва JpaRepository -ро пахш кунед ва бубинед, ки худи он аз PagingAndSortingRepository<t, ""> ва QueryByExampleExecutor<> мерос мегирад, онҳо инчунин баъзе усулҳоро эълон мекунанд. Ман усулҳоро дар ин ҷо нусхабардорӣ намекунам; худатро ҷустуҷӯ кунед. Азбаски анбор интерфейс аст, он коре намекунад, он танҳо усулҳоро эълон мекунад, барои татбиқи ин усулҳо каси дигар лозим аст. Ин аст, ки «хизматрасонӣ» ихтироъ карда шуд. Дар баста
ru.java.rush
Эҷоди бастаи хидматҳо
services
Ва худи хидмат
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
Ҳоло мо ба як нуқтаи муҳим расидем: «Чӣ тавр ва чаро лубиёро сӯзандору кардан лозим аст» (тобастагӣ). Агар чи гуфтаниамро нафахмидед пас хохиш мекунам ки хозир ё дер ин мавзуъро хонед, махсусан ба усулхои "сузандору" диккат дихед, ки чанд аст, кадомаш бехтар аст, кадомаш бадтар аст ва чаро . Мо яке аз усулҳоро истифода мебарем. Мо ба "хизматрасонӣ" ниёз дорем, ки ба "анбор" пайваст шавад. Мо хидмати худро бо эзоҳ ва тағирёбанда пурра мекунем.
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;
}

}
Акнун шумо метавонед усулро аз "анбор" татбиқ кунед Мо "хизматрасониро" пурра мекунем
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(); //реализовали метод внедренного бина
    }
}
Танҳо иҷрои ин дар утorтаи мо боқӣ мемонад. Биёед ба синфи 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);
        }
    }
}
Натиҷаи консол: FruitEntity(id=1, fruitName=fruit1, providerCode=1) FruitEntity(id=2, fruitName=fruit2, providerCode=2) FruitEntity(id=3, fruitName=fruit3, providerCode=3) Дар ин ҷо шумо метавонед анҷом диҳед. "Танҳо як сония!" - хонандаи бодиққат хитоб мекунад - "Ба ҳар ҳол, Hibernate дар куҷост?" Ва Hibernate дар ин ҷо ҳамчун ҷанганда дар фронти ноаён амал мекунад; он як кори хеле муҳимро анҷом дод: он барои мо сохторҳои пойгоҳи додаҳоро эҷод кард. Вақте ки мо майдонҳоро дар "an object" навиштем ва онҳоро бо эзоҳҳои зарурӣ қайд кардем, Hibernate кори худро иҷро кард. Дар асл, ҳангоми таҳияи парвоз, шумо гумон аст, ки бо сохтори пойгоҳи додаҳо сарукор дошта бошед; ҳама чиз аллакай барои шумо сохта ва ҷойгир карда мешавад. Аммо дар чунин лоиҳаҳои хурд, Hibernate-ро бо қобorяти эҷоди сохторҳои пойгоҳи додаҳо танҳо иваз кардан мумкин нест; Албатта, ин ягона бартарии он нест, масалан, дар ташкor an objectҳои алоқаманд хуб аст (мо онҳоро дар ин лоиҳа истифода намебарем). Биёед ба ин коргари хоксор салом гӯем: дар сохтори лоиҳа ба IDEA равед (дар тарафи чап дарахт бо ҷузвдонҳо ва файлҳо мавҷуд аст), дар он ҷо мо Китобхонаҳои берунаро пайдо мекунем, онро кушоем ва дар байни дигар китобхонаҳо мебинем.
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
Аз ҷумла, Hibernate барои мо аз ҷониби Maven ва
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Дарвоқеъ, ҷаноби Ҳибер як амалиёти махфии дигаре анҷом додааст, аммо дар ин бора дар мақолаи навбатӣ сӯҳбат хоҳем кард. Ҳоло ҳамааш аниқ аст. Ҳамчун як машқи омӯзишӣ, ман тавсия медиҳам, ки шумо усули saveAll()-ро барои FruitEntity худатон амалӣ кунед , ки ҳамаи an objectҳоро дар як вақт дар базаи маълумот захира мекунад. Минбаъд биёед бубинем, ки чӣ тавр бо истифода аз китобхонаи Lombok рамзи лоиҳаро кӯтоҳ кардан мумкин аст
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION