JavaRush /Java Blog /Random-ID /Musim semi tidak menakutkan, atau cara mengisi database h...
Павел
Level 11

Musim semi tidak menakutkan, atau cara mengisi database h2 (dan sedikit Hibernate)

Dipublikasikan di grup Random-ID
ISI SIKLUS ARTIKEL Kami melanjutkan proyek kami. Cara membuat proyek web. Kami menghubungkan database ke proyek web kami . Kali ini akan ada lebih banyak surat, kita tidak akan selesai dalam lima menit. Pada artikel terakhir, saya menyarankan Anda untuk membaca beberapa halaman atau beberapa artikel tentang Spring , atau setidaknya google tentang apa itu beans, konteks, entitas, injeksi ketergantungan di Spring, cara mengkonfigurasi beans. Jika tidak, maka saya menyarankan Anda melakukannya sekarang atau setelah artikel ini. Sebelum mengisi basis h2 kami. Perlu dibuat kelas utilitas untuk menjalankan metode pengisian database di dalamnya. Di dalam paket
ru.java.rush
Membuat paket untuk utilitas
utils
Dan utilitas 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 kita jalankan aplikasinya dan "run" akan ditampilkan di konsol . Kita memerlukan utilitas ini sebagai alternatif kelas Aplikasi, karena utilitas ini hanya bertanggung jawab untuk meluncurkan aplikasi. Mari buat entitas. Entitas adalah kacang yang tujuannya adalah untuk menyimpan beberapa data. Di dalam paket
ru.java.rush
Buat paket untuk entitas
entities
Dan intinya, biarlah menjadi buah:
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, pengambil, penyetel, dan toString() tidak harus ditulis dengan tangan; mereka dapat dibuat dengan cepat . Oke, entitas kita berinteraksi dengan database dan menyimpan data dari database. Intinya sedang bekerja. Tetapi seseorang harus mengoperasikan entitas dalam aplikasi tersebut. Untuk tujuan ini mereka datang dengan “repositori”. Di dalam paket
ru.java.rush
Membuat paket 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
}
Pertanyaannya, mengapa badan antarmukanya kosong, tidak ada satu pun metode yang dideklarasikannya? Untuk menjawabnya, tahan Ctrl dan klik JpaRepository dan lihat bahwa itu sendiri mewarisi dari PagingAndSortingRepository<t, ""> dan QueryByExampleExecutor<>, mereka juga mendeklarasikan beberapa metode. Saya tidak akan menyalin metode di sini; lihat sendiri. Karena repositori adalah sebuah antarmuka, ia tidak melakukan apa pun, ia hanya mendeklarasikan metode, diperlukan orang lain untuk mengimplementasikan metode ini. Inilah sebabnya mengapa “layanan” diciptakan. Di dalam paket
ru.java.rush
Membuat paket untuk layanan
services
Dan layanan itu sendiri
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
Sekarang kita telah mencapai poin penting: “Bagaimana dan mengapa menyuntikkan kacang” (menyuntikkan ketergantungan). Jika anda belum paham maksud saya, maka saya mohon anda membaca topik ini, sekarang atau nanti, terutama perhatikan cara-cara “injeksi”, ada berapa, mana yang lebih baik, mana yang lebih buruk, dan mengapa . Kami menggunakan salah satu metode. Kita memerlukan "layanan" untuk terhubung ke "repositori". Kami melengkapi layanan kami dengan anotasi dan variabel.
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;
}

}
Sekarang Anda dapat menerapkan metode dari "repositori". Kami melengkapi "layanan"
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 tersisa hanyalah mengimplementasikan ini di utilitas kita. Mari 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 dapat menyelesaikannya. "Tunggu sebentar!" - pembaca yang paling penuh perhatian akan berseru - “Di mana sebenarnya Hibernate?” Dan Hibernate bertindak di sini sebagai pejuang di garis depan yang tidak terlihat; ia melakukan hal yang sangat penting: ia menciptakan struktur database untuk kita. Saat kami menulis kolom di "entitas" dan menandainya dengan anotasi yang diperlukan, Hibernate melakukan tugasnya. Faktanya, ketika mengembangkan dengan cepat, Anda tidak mungkin berurusan dengan struktur database; semuanya sudah dibuat dan diterapkan untuk Anda. Namun dalam proyek kecil seperti itu, Hibernate dengan kemampuannya membuat struktur database tidak dapat digantikan; tentu saja, ini bukan satu-satunya keunggulannya, misalnya, ia pandai membuat entitas terkait (kami tidak akan menggunakannya dalam proyek ini). Mari kita sapa pekerja sederhana ini: buka IDEA dalam struktur proyek (di sebelah kiri ada pohon dengan folder dan file), di sana kita akan menemukan Perpustakaan Eksternal, membukanya dan melihatnya 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
Secara khusus, Hibernate diunduh untuk kami oleh Maven dan
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Faktanya, Pak Hiber melakukan operasi rahasia lainnya, tapi kita akan membicarakannya di artikel berikutnya. Itu saja yang pasti sekarang. Sebagai latihan, saya sarankan Anda menerapkan sendiri metode saveAll() untuk FruitEntity , yang akan menyimpan semua entitas ke database sekaligus. Selanjutnya mari kita lihat cara mempersingkat kode proyek menggunakan perpustakaan Lombok
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION