JavaRush /Java blogi /Random-UZ /Bahor qo'rqinchli emas yoki h2 ma'lumotlar bazasini qanda...

Bahor qo'rqinchli emas yoki h2 ma'lumotlar bazasini qanday to'ldirish kerak (va biroz kutish)

Guruhda nashr etilgan
MAQOLALAR SIKLINING MAZMUNI Biz loyihamizni davom ettiramiz. Veb-loyihani qanday yaratish kerakBiz ma'lumotlar bazasini veb loyihamizga ulaymiz. Bu safar ko'proq xatlar bo'ladi, biz besh daqiqada yetib bormaymiz. Oxirgi maqolada men sizga Bahor haqida bir nechta sahifalarni yoki bir nechta maqolalarni o'qishni maslahat berdim yoki hech bo'lmagandaloviya nima ekanligi, kontekst, ob'ektlar, bahorda qaramlik in'ektsiyasi, loviyani sozlash usullari haqida Google'da . Agar yo'q bo'lsa, men sizga hozir yoki ushbu maqoladan keyin buni qilishni maslahat beraman. H2 bazamizni to'ldirishdan oldin. Unda ma'lumotlar bazasini to'ldirish usullarini ishga tushirish uchun yordamchi sinf yaratish kerak. Paketda
ru.java.rush
Kommunal xizmatlar uchun paket yaratish
utils
Va yordamchi dasturning o'zi:
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"); //проверим что это работает
    }
}
Keling, dasturni ishga tushiramiz va konsolda "ishlash" ko'rsatiladi . Bizga ushbu yordamchi dastur Ilovalar sinfiga muqobil sifatida kerak, chunki u faqat dasturni ishga tushirish uchun javobgar bo'lishi kerak. Keling, ob'ektlarni yarataylik. Ob'ekt - bu ba'zi ma'lumotlarni saqlash maqsadi bo'lgan loviya. Paketda
ru.java.rush
Ob'ektlar uchun paket yarating
entities
Va mohiyatning o'zi meva bo'lsin:
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 +
            '}';
}
}
Konstruktor, oluvchilar, sozlagichlar va toString() ni qo'lda yozish shart emas; ular tezda yaratilishi mumkin . Yaxshi, bizning tashkilot ma'lumotlar bazasi bilan o'zaro ishlaydi va ma'lumotlar bazasidan ma'lumotlarni saqlaydi. Mohiyat ishda. Lekin kimdir ilovadagi ob'ektni boshqarishi kerak. Shu maqsadda ular "ombor" bilan kelishdi. Paketda
ru.java.rush
Repozitariylar uchun paket yaratish
repositories
Va omborning o'zi
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
}
Savol shundaki, nima uchun interfeysning tanasi bo'sh, u e'lon qiladigan yagona usul yo'q? Javob berish uchun Ctrl tugmachasini bosib ushlab turing va JpaRepository-ni bosing va uning o'zi PagingAndSortingRepository<t, ""> va QueryByExampleExecutor<>-dan meros ekanligini ko'ring, ular ham ba'zi usullarni e'lon qiladilar. Men bu erda usullarni ko'chirmayman; o'zingizni qidiring. Repozitoriy interfeys bo'lgani uchun u hech narsa qilmaydi, u faqat usullarni e'lon qiladi, bu usullarni amalga oshirish uchun boshqa birov kerak. Shuning uchun "xizmat" ixtiro qilindi. Paketda
ru.java.rush
Xizmatlar paketini yaratish
services
Va xizmatning o'zi
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
Endi biz muhim nuqtaga etib keldik: "Qanday qilib va ​​nima uchun loviya in'ektsiya qilish kerak" (qaramlikni in'ektsiya qilish). Agar siz nimani nazarda tutayotganimni tushunmasangiz, men sizdan hozir yoki keyinroq ushbu mavzuni o'qishingizni so'rayman, ayniqsa "in'ektsiya" usullariga e'tibor bering, ularning soni qancha, qaysi biri yaxshiroq, qaysi biri yomon va nima uchun. . Biz usullardan birini qo'llaymiz. Bizga "xizmat" qandaydir tarzda "ombor" ga ulanishi kerak. Biz xizmatimizni izoh va o'zgaruvchi bilan to'ldiramiz.
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;
}

}
Endi siz usulni "ombor" dan amalga oshirishingiz mumkin. Biz "xizmat" ni to'ldiramiz
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(); //реализовали метод внедренного бина
    }
}
Buni bizning yordamchi dasturimizda amalga oshirish qoladi. Keling, InitiateUtils sinfiga o'tamiz.
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);
        }
    }
}
Konsol chiqishi: FruitEntity(id=1, fruitName=fruit1, providerCode=1) FruitEntity(id=2, fruitName=fruit2, providerCode=2) FruitEntity(id=3, fruitName=fruit3, providerCode=3) Bu yerda tugatishingiz mumkin . "Bir soniya!" - eng diqqatli o'quvchi hayqiradi - "Hibernate qayerda?" Va Hibernate bu erda ko'rinmas jabhada jangchi sifatida ishlaydi; u juda muhim ishni amalga oshirdi: u biz uchun ma'lumotlar bazasi tuzilmalarini yaratdi. Biz "ob'ekt" da maydonlarni yozganimizda va ularni kerakli izohlar bilan belgilaganimizda, Hibernate o'z vazifasini bajardi. Haqiqatan ham, tez rivojlanayotganda, siz ma'lumotlar bazasi tuzilishi bilan shug'ullanishingiz dargumon, hamma narsa allaqachon siz uchun yaratilgan va joylashtirilgan. Ammo bunday kichik loyihalarda ma'lumotlar bazasi tuzilmalarini yaratish qobiliyatiga ega Hibernate-ni shunchaki almashtirib bo'lmaydi; Albatta, bu uning yagona afzalligi emas, masalan, u tegishli ob'ektlarni yaratishda yaxshi (biz ularni ushbu loyihada ishlatmaymiz). Keling, bu kamtarin ishchiga salom aytaylik: loyiha tuzilmasida IDEA-ga o'ting (chap tomonda papkalar va fayllar joylashgan daraxt bor), u erda biz tashqi kutubxonalarni topamiz, uni ochamiz va boshqa kutubxonalar qatorida ko'ramiz.
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
Xususan, Hibernate biz uchun Maven tomonidan yuklab olingan va
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Darhaqiqat, janob Xiber yana bir yashirin operatsiyani amalga oshirdi, ammo bu haqda keyingi maqolada gaplashamiz. Hozir hammasi aniq. O'quv mashqi sifatida FruitEntity uchun saveAll() usulini o'zingiz qo'llashingizni tavsiya qilaman , bu esa barcha ob'ektlarni bir vaqtning o'zida ma'lumotlar bazasida saqlaydi. Keyinchalik, Lombok kutubxonasi yordamida loyiha kodini qanday qisqartirishni ko'rib chiqamiz
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION