JavaRush /Blog Java /Random-VI /Mùa xuân không đáng sợ hoặc cách điền cơ sở dữ liệu h2 (v...
Павел
Mức độ

Mùa xuân không đáng sợ hoặc cách điền cơ sở dữ liệu h2 (và một chút Hibernate)

Xuất bản trong nhóm
NỘI DUNG CỦA CHU KỲ BÀI VIẾT Chúng tôi tiếp tục dự án của mình. Cách tạo một dự án web. Chúng tôi kết nối cơ sở dữ liệu với dự án web của chúng tôi . Lần này sẽ có nhiều thư hơn, chúng ta sẽ không đến được trong năm phút nữa. Trong bài viết trước, tôi khuyên bạn nên đọc một số trang hoặc một số bài viết về Spring , hoặc ít nhất là google về Bean là gì, bối cảnh, thực thể, dependency dependency trong Spring, cách cấu hình Bean. Nếu chưa thì tôi khuyên bạn nên làm ngay bây giờ hoặc sau bài viết này. Trước khi điền vào cơ sở h2 của chúng tôi. Cần phải tạo một lớp tiện ích để chạy các phương thức điền cơ sở dữ liệu vào đó. Trong gói
ru.java.rush
Tạo gói tiện ích
utils
Và chính tiện ích:
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"); //проверим что это работает
    }
}
Hãy chạy ứng dụng và "chạy" sẽ được hiển thị trong bảng điều khiển . Chúng tôi cần tiện ích này để thay thế cho lớp Ứng dụng, vì nó chỉ chịu trách nhiệm khởi chạy ứng dụng. Hãy tạo các thực thể. Một thực thể là một hạt đậu có mục đích lưu trữ một số dữ liệu. Trong gói
ru.java.rush
Tạo một gói cho các thực thể
entities
Và bản chất của nó, hãy để nó là trái cây:
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 +
            '}';
}
}
Hàm tạo, getters, setters và toString() không cần phải được viết bằng tay; chúng có thể được tạo ra một cách nhanh chóng . Được rồi, thực thể của chúng tôi tương tác với cơ sở dữ liệu và lưu trữ dữ liệu từ cơ sở dữ liệu. Bản chất là ở nơi làm việc. Nhưng ai đó phải vận hành thực thể trong ứng dụng. Với mục đích này, họ đã nghĩ ra một “kho lưu trữ”. Trong gói
ru.java.rush
Tạo gói cho kho lưu trữ
repositories
Và chính kho lưu trữ
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
}
Câu hỏi đặt ra là tại sao phần thân của giao diện lại trống, không có một phương thức nào được khai báo? Để trả lời, hãy giữ Ctrl và click vào JpaRepository và thấy rằng chính nó kế thừa từ PagingAndSortingRepository<t, ""> và QueryByExampleExecutor<>, chúng cũng khai báo một số phương thức. Tôi sẽ không sao chép các phương pháp ở đây; hãy tự tìm kiếm. Vì kho lưu trữ là một giao diện nên nó không làm gì cả, nó chỉ khai báo các phương thức, cần có người khác để thực hiện các phương thức này. Đây là lý do tại sao một “dịch vụ” được phát minh. Trong gói
ru.java.rush
Tạo gói dịch vụ
services
Và bản thân dịch vụ
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
Bây giờ chúng ta đã đạt đến điểm quan trọng: “Làm thế nào và tại sao phải tiêm một hạt đậu” (tiêm một phần phụ thuộc). Nếu bạn không hiểu ý tôi thì tôi mời bạn đọc về chủ đề này, bây giờ hoặc sau này, đặc biệt chú ý đến các phương pháp “tiêm”, có bao nhiêu, cái nào tốt hơn, cái nào tệ hơn và tại sao . Chúng tôi sử dụng một trong những phương pháp. Chúng tôi cần “dịch vụ” được kết nối bằng cách nào đó với “kho lưu trữ”. Chúng tôi bổ sung dịch vụ của mình bằng một chú thích và một biến.
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;
}

}
Bây giờ bạn có thể triển khai phương thức từ “kho lưu trữ” Chúng tôi bổ sung “dịch vụ”
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(); //реализовали метод внедренного бина
    }
}
Tất cả những gì còn lại là triển khai điều này trong tiện ích của chúng ta. Hãy chuyển sang lớp 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);
        }
    }
}
Đầu ra của bảng điều khiển: FruitEntity(id=1, FruitName=fruit1, ProviderCode=1) FruitEntity(id=2, FruitName=fruit2, ProviderCode=2) FruitEntity(id=3, FruitName=fruit3, ProviderCode=3) Tại đây bạn có thể hoàn thành. "Chỉ một giây thôi!" - người đọc chú ý nhất sẽ thốt lên - “Dù sao thì Hibernate ở đâu?” Và Hibernate ở đây hoạt động như một chiến binh trên mặt trận vô hình; nó đã làm một việc rất quan trọng: nó tạo ra cấu trúc cơ sở dữ liệu cho chúng ta. Khi chúng tôi viết các trường trong “thực thể” và đánh dấu chúng bằng các chú thích cần thiết, Hibernate đã thực hiện công việc của mình. Trên thực tế, khi phát triển nhanh chóng, bạn khó có thể xử lý cấu trúc cơ sở dữ liệu; mọi thứ sẽ được tạo và triển khai sẵn cho bạn. Nhưng trong những dự án nhỏ như vậy, Hibernate với khả năng tạo cấu trúc cơ sở dữ liệu đơn giản là không thể thay thế được, tất nhiên đây không phải là ưu điểm duy nhất của nó, ví dụ như nó rất giỏi trong việc tạo các thực thể liên quan (chúng tôi sẽ không sử dụng chúng trong dự án này). Hãy chào người công nhân khiêm tốn này: hãy truy cập IDEA trong cấu trúc dự án (ở bên trái có một cây chứa các thư mục và tệp), ở đó chúng ta sẽ tìm thấy Thư viện bên ngoài, mở nó và xem nó trong số các thư viện khác
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
Đặc biệt, Hibernate đã được Maven tải xuống cho chúng tôi và
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Trên thực tế, ông Hiber đã thực hiện một hoạt động bí mật khác nhưng chúng ta sẽ nói về nó ở bài viết tiếp theo. Đó là tất cả chắc chắn bây giờ. Là một bài tập huấn luyện, tôi khuyên bạn nên tự mình triển khai phương thức saveAll() cho FruitEntity , phương thức này sẽ lưu tất cả các thực thể vào cơ sở dữ liệu cùng một lúc. Tiếp theo, hãy xem cách rút ngắn mã dự án bằng thư viện Lombok
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION