JavaRush /Java блогу /Random-KY /Жаз коркунучтуу эмес, же h2 маалымат базасын кантип толту...
Павел
Деңгээл

Жаз коркунучтуу эмес, же h2 маалымат базасын кантип толтуруу керек (жана бир аз күтүү)

Группада жарыяланган
МАКАЛАЛАР ЦИКЛИНИН МАЗМУНУ Биз долбоорубузду улантабыз. Веб долбоорду кантип түзүү керекБиз маалымат базасын веб-долбоорубузга туташтырабыз. Бул жолу дагы каттар болот, беш мүнөттө жетпей калабыз. Акыркы макалада мен сизге Жаз жөнүндө бир нече барактарды же бир нече макалаларды окуп чыгууну кеңеш кылдым , же жок дегенде google-ден буурчак деген эмне, контекст, an objectтер, Жаздагы көз карандылык инъекциясы, буурчакты конфигурациялоо жолдору. Эгерде жок болсо, анда мен сизге муну азыр же ушул макаладан кийин жасоону кеңеш кылам. Биздин h2 базасын толтуруу алдында. Андагы маалымат базасын толтуруу ыкмаларын иштетүү үчүн пайдалуу классты түзүү керек. Пакетте
ru.java.rush
Коммуналдык кызматтар үчүн пакет түзүү
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() кол менен жазылуунун кажети жок; аларды тез эле түзсө болот . Макул, биздин уюм маалымат базасы менен иштешет жана маалымат базасынан маалыматтарды сактайт. Маңызы жумушта. Бирок кимдир бирөө колдонмодогу 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<>дан мураска калганын көрүңүз, алар дагы кээ бир ыкмаларды жарыялашат. Мен бул жердеги ыкмаларды көчүрбөйм; өзүңдү изде. Репозиторий интерфейс болгондуктан, ал эч нерсе кылbyte, ал методдорду гана жарыялайт, бул ыкмаларды ишке ашыруу үчүн башка бирөө керек. Мына ушундан улам “кызмат” ойлоп табылган. Пакетте
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 бул жерде көзгө көрүнбөгөн фронтто согушкер катары иш алып барат; ал абдан маанилүү нерсени жасады: ал биз үчүн маалымат базасын түзүмдөрүн түздү. Биз "an objectке" талааларды жазып, аларды керектүү annotationлар менен белгилегенибизде, Hibernate өз ишин аткарды. Чынында, учуп иштеп жатканда, сиз маалымат базасынын түзүмү менен күрөшө албайсыз, бардыгы сиз үчүн түзүлгөн жана жайгаштырылат. Бирок, мындай чакан долбоорлордо, маалымат базасы түзүмдөрүн түзүү жөндөмү менен Hibernate жөн эле алмаштыруу мүмкүн эмес; албетте, бул анын жалгыз артыкчылыгы эмес, мисалы, тиешелүү 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>
Чындыгында Хибер мырза дагы бир тымызын операция жасаган, бирок бул тууралуу кийинки макалада сөз кылабыз. Мунун баары азыр анык. Машыгуу көнүгүү катары, мен сизге FruitEntity үчүн saveAll() ыкмасын өзүңүз ишке ашырууну сунуштайм , ал бардык an objectтерди бир убакта маалымат базасына сактап калат. Андан кийин, Ломбок китепканасын колдонуу менен долбоордун codeун кантип кыскартууну карап көрөлү
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION