JavaRush /Java блогы /Random-KK /Көктем қорқынышты емес немесе h2 дерекқорын қалай толтыру...
Павел
Деңгей

Көктем қорқынышты емес немесе h2 дерекқорын қалай толтыру керек (және аздап күту режимі)

Топта жарияланған
МАҚАЛАЛАР ЦИКЛІНІҢ МАЗМҰНЫ Біз жобамызды жалғастырамыз. Веб-жобаны қалай жасауға боладыДеректер базасын веб-жобамызға қосамыз. Бұл жолы хаттар көп болады, біз бес minutesта жетпейміз. Соңғы мақалада мен сізге көктем туралы бірнеше беттерді немесе бірнеше мақалаларды оқуға кеңес бердім , немесе кем дегенде,бұршақтар дегеніміз не, контекст, нысандар, көктемдегі тәуелділік инъекциясы, бұршақты конфигурациялау жолдары туралы google . Егер жоқ болса, мен сізге дәл қазір немесе осы мақаладан кейін мұны істеуге кеңес беремін. Біздің h2 негізін толтырмас бұрын. Мәліметтер қорын толтыру әдістерін іске қосу үшін утorта класын құру қажет. Пакетте
ru.java.rush
Утorталар пакетін құру
utils
Ал утorтаның өзі:
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та Қолданбалар класына балама ретінде қажет, себебі ол тек қолданбаны іске қосуға жауапты болуы керек. Нысандарды жасайық. Нысан — мақсаты кейбір деректерді сақтау болып табылатын бұршақ. Пакетте
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() қолмен жазудың қажеті жоқ; оларды тез жасауға болады . Жарайды, біздің ұйым дерекқормен өзара әрекеттеседі және дерекқордағы деректерді сақтайды. Мәні жұмыста. Бірақ біреу қолданбадағы нысанды басқаруы керек. Осы мақсатта олар «репозиторийді» ойлап тапты. Пакетте
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 {
}
Енді біз маңызды сәтке жеттік: «Бұршақты қалай және не үшін енгізу керек» (тәуелділік енгізу). Егер сіз менің не айтқым келгенін түсінбесеңіз, осы тақырыпты қазір немесе кейінірек оқып шығуыңызды сұраймын, әсіресе «инъекция» әдістеріне назар аударыңыз, олардың саны қанша, қайсысы жақсы, қайсысы нашар және неге. . Біз әдістердің бірін қолданамыз. Бізге «қызмет» қандай да бір түрде «репозиторийге» қосылуы керек. Біз қызметімізді annotationмен және айнымалымен толықтырамыз.
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 мұнда көрінбейтін майданда жауынгер ретінде әрекет етеді; ол өте маңызды нәрсе жасады: ол біз үшін дерекқор құрылымдарын жасады. Біз «нысандағы» өрістерді жазып, оларды қажетті annotationлармен белгілегенде, күту режимі өз жұмысын жасады. Шын мәнінде, жылдам дамып жатқанда, сіз дерекқор құрылымымен айналысуыңыз екіталай, бәрі сіз үшін жасалып, орналастырылады. Бірақ мұндай шағын жобаларда дерекқор құрылымдарын жасау мүмкіндігімен күту режимін жай ғана ауыстыру мүмкін емес; әрине, бұл оның жалғыз артықшылығы емес, мысалы, ол байланысты нысандарды құруда жақсы (біз оларды бұл жобада қолданбаймыз). Осы қарапайым жұмысшыға сәлем айтайық: жоба құрылымындағы 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>
Шындығында, Хибер мырза тағы бір жасырын операция жасады, бірақ ол туралы келесі мақалада айтатын боламыз. Мұның бәрі қазір анық. Жаттығу жаттығуы ретінде FruitEntity үшін saveAll() әдісін өзіңіз енгізуді ұсынамын , ол барлық нысандарды бір уақытта дерекқорға сақтайды. Әрі қарай, Lombok кітапханасының көмегімен жоба codeын қалай қысқартуға болатынын қарастырайық
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION