JavaRush /Blog Java /Random-MS /Musim bunga tidak menakutkan, atau cara mengisi pangkalan...

Musim bunga tidak menakutkan, atau cara mengisi pangkalan data h2 (dan sedikit Hibernate)

Diterbitkan dalam kumpulan
KANDUNGAN KITARAN ARTIKEL Kami meneruskan projek kami. Cara membuat projek web. Kami menyambungkan pangkalan data ke projek web kami . Kali ini akan ada lebih banyak surat, kita tidak akan sampai dalam masa lima minit. Dalam artikel terakhir, saya menasihati anda untuk membaca beberapa halaman atau beberapa artikel tentang Spring , atau sekurang-kurangnya google tentang apa itu kacang, konteks, entiti, suntikan kebergantungan dalam Spring, cara untuk mengkonfigurasi kacang. Jika tidak, maka saya menasihati anda untuk melakukannya sekarang atau selepas artikel ini. Sebelum mengisi pangkalan h2 kami. Ia adalah perlu untuk mencipta kelas utiliti untuk menjalankan kaedah untuk mengisi pangkalan data di dalamnya. Dalam bungkusan
ru.java.rush
Mencipta pakej untuk utiliti
utils
Dan utiliti itu sendiri:
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"); //проверим что это работает
    }
}
Mari jalankan aplikasi dan "run" akan dipaparkan dalam konsol . Kami memerlukan utiliti ini sebagai alternatif kepada kelas Aplikasi, kerana ia hanya bertanggungjawab untuk melancarkan aplikasi. Mari buat entiti. Entiti ialah kacang yang tujuannya adalah untuk menyimpan beberapa data. Dalam bungkusan
ru.java.rush
Buat pakej untuk entiti
entities
Dan intipati itu sendiri, biarkan ia berbuah:
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 +
            '}';
}
}
Pembina, getter, setter dan toString() tidak perlu ditulis dengan tangan; ia boleh dijana dengan cepat . Okay, entiti kami berinteraksi dengan pangkalan data dan menyimpan data daripada pangkalan data. Intinya adalah di tempat kerja. Tetapi seseorang mesti mengendalikan entiti dalam aplikasi. Untuk tujuan ini mereka datang dengan "repositori". Dalam bungkusan
ru.java.rush
Mencipta pakej untuk repositori
repositories
Dan repositori itu sendiri
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
}
Persoalannya, mengapa badan antara muka kosong, tidak ada satu kaedah pun yang diisytiharkan? Untuk menjawab, tahan Ctrl dan klik pada JpaRepository dan lihat bahawa ia sendiri mewarisi daripada PagingAndSortingRepository<t, ""> dan QueryByExampleExecutor<>, mereka juga mengisytiharkan beberapa kaedah. Saya tidak akan menyalin kaedah di sini; cari sendiri. Oleh kerana repositori adalah antara muka, ia tidak melakukan apa-apa, ia hanya mengisytiharkan kaedah, orang lain diperlukan untuk melaksanakan kaedah ini. Inilah sebabnya mengapa "perkhidmatan" dicipta. Dalam bungkusan
ru.java.rush
Membuat pakej untuk perkhidmatan
services
Dan perkhidmatan itu sendiri
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
Sekarang kita telah mencapai titik penting: "Bagaimana dan mengapa menyuntik kacang" (menyuntik kebergantungan). Sekiranya anda tidak faham apa yang saya maksudkan, maka saya meminta anda membaca topik ini, sekarang atau kemudian, terutamanya perhatikan kaedah "suntikan", berapa banyak yang ada, yang lebih baik, yang lebih buruk, dan mengapa . Kami menggunakan salah satu kaedah. Kami memerlukan "perkhidmatan" untuk disambungkan ke "repositori". Kami menambah perkhidmatan kami dengan anotasi dan pembolehubah.
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;
}

}
Kini anda boleh melaksanakan kaedah dari "repositori" Kami menambah "perkhidmatan"
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(); //реализовали метод внедренного бина
    }
}
Yang tinggal hanyalah melaksanakan perkara ini dalam utiliti kami. Mari kita beralih ke kelas 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 konsol: FruitEntity(id=1, fruitName=fruit1, providerCode=1) FruitEntity(id=2, fruitName=fruit2, providerCode=2) FruitEntity(id=3, fruitName=fruit3, providerCode=3) Di sini anda boleh selesaikan . "Sekejap!" - pembaca yang paling prihatin akan berseru - "Di mana Hibernate pula?" Dan Hibernate bertindak di sini sebagai pejuang di hadapan yang tidak kelihatan; ia melakukan perkara yang sangat penting: ia mencipta struktur pangkalan data untuk kami. Apabila kami menulis medan dalam "entiti" dan menandakannya dengan anotasi yang diperlukan, Hibernate melakukan tugasnya. Malah, apabila membangunkan dengan cepat, anda tidak mungkin berurusan dengan struktur pangkalan data; segala-galanya akan dibuat dan digunakan untuk anda. Tetapi dalam projek kecil seperti itu, Hibernate dengan keupayaannya untuk mencipta struktur pangkalan data tidak boleh digantikan; sudah tentu, ini bukan satu-satunya kelebihannya, sebagai contoh, ia bagus untuk mencipta entiti berkaitan (kami tidak akan menggunakannya dalam projek ini). Mari bertanya khabar kepada pekerja yang rendah hati ini: pergi ke IDEA dalam struktur projek (di sebelah kiri terdapat pokok dengan folder dan fail), di sana kita akan menemui Perpustakaan Luar, buka dan lihat di antara perpustakaan lain
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
Khususnya, Hibernate telah dimuat turun untuk kami oleh Maven dan
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Malah, Encik Hiber telah menjalankan satu lagi operasi rahsia, tetapi kita akan membincangkannya dalam artikel seterusnya. Itu sahaja yang pasti sekarang. Sebagai latihan latihan, saya cadangkan anda melaksanakan kaedah saveAll() untuk FruitEntity sendiri , yang akan menyimpan semua entiti ke pangkalan data pada satu masa. Seterusnya, mari kita lihat cara memendekkan kod projek menggunakan perpustakaan Lombok
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION