JavaRush /Blog Java /Random-ES /La primavera no da miedo, ni cómo llenar una base de dato...
Павел
Nivel 11

La primavera no da miedo, ni cómo llenar una base de datos h2 (y un poco de Hibernación)

Publicado en el grupo Random-ES
CONTENIDOS DEL CICLO DE ARTÍCULOS Continuamos con nuestro proyecto. Cómo crear un proyecto web. Conectamos la base de datos a nuestro proyecto web . Esta vez habrá más cartas, no saldremos adelante en cinco minutos. En el último artículo, te aconsejé que leyeras varias páginas o varios artículos sobre Spring , o al menos buscaras en Google sobre qué son los beans, contexto, entidades, inyección de dependencias en Spring, formas de configurar beans. Si no, te aconsejo que lo hagas ahora o después de este artículo. Antes de llenar nuestra base de h2. Es necesario crear una clase de utilidad para ejecutar métodos para llenar la base de datos en ella. En el paquete
ru.java.rush
Creando un paquete para utilidades
utils
Y la utilidad en sí:
package ru.java.rush.utils;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;

@Service //anotación помечает бин Cómo сервис
public class InitiateUtils implements CommandLineRunner { //имплементируем интерфейс CommandLineRunner (командная строка запуска)

    @Override
//переопределяем метод который позволит
//нам выполнять методы нашего aplicaciones при запуске
    public void run(String... args) throws Exception {
        System.out.println("run"); //проверим что это работает
    }
}
Ejecutemos la aplicación y en la consola se mostrará "ejecutar" . Necesitamos esta utilidad como alternativa a la clase Aplicaciones, ya que solo debería ser responsable de iniciar la aplicación. Creemos entidades. Una entidad es un bean cuyo propósito es almacenar algunos datos. En el paquete
ru.java.rush
Crear un paquete para entidades
entities
Y la esencia misma, que sea fruto:
package ru.java.rush.entities;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Entity//помечаем бин Cómo сущность
@Table(name = "fruit_table")//в этой аннотации можно указать Nombre создаваемой таблицы
public class FruitEntity {

    @Id//anotación из пакета avax.persistence.*, помечает поле Cómo id
    @Column(name = "id_fruit")//в этой аннотации можно указать Nombre поля
    @GenericGenerator(name = "generator", strategy = "increment")//незаметно добрались до hibernate,
// здесь указывается что id будет автоматически увеличиваться при новых записях
    @GeneratedValue(generator = "generator")//anotación генерации 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 +
            '}';
}
}
El constructor, los captadores, los definidores y toString() no tienen que escribirse a mano; se pueden generar rápidamente . Bien, nuestra entidad interactúa con la base de datos y almacena datos de la base de datos. La esencia está en el trabajo. Pero alguien debe operar la entidad en la aplicación. Para ello idearon un “repositorio”. En el paquete
ru.java.rush
Creando un paquete para repositorios
repositories
Y el repositorio en sí
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<>
//для него необходимо указать с Cómoой сущность он должен работать, у нас это FruitEntity
//и тип данных у поля id данной сущности, у нас это Integer
}
La pregunta es, ¿por qué el cuerpo de la interfaz está vacío y no hay un solo método que declare? Para responder, mantenga presionada la tecla Ctrl y haga clic en JpaRepository y vea que él mismo hereda de PagingAndSortingRepository<t, ""> y QueryByExampleExecutor<>, también declaran algunos métodos. No copiaré los métodos aquí; búscalo tú mismo. Como el repositorio es una interfaz, no hace nada, solo declara métodos, se necesita alguien más para implementar estos métodos. Por eso se inventó un “servicio”. En el paquete
ru.java.rush
Creando un paquete de servicios
services
Y el servicio en sí.
package ru.java.rush.services;

import org.springframework.stereotype.Service;

@Service//помечаем что этот бин - сервис
public class FruitService {
}
Ahora hemos llegado a un punto importante: “Cómo y por qué inyectar un bean” (inyectar una dependencia). Si no entiende lo que quiero decir, le pido que lea sobre este tema, ahora o más adelante, preste especial atención a los métodos de “inyección”, cuántos hay, cuál es mejor, cuál es peor y por qué. . Usamos uno de los métodos. Necesitamos que el "servicio" esté conectado de alguna manera con el "repositorio". Complementamos nuestro servicio con una anotación y una variable.
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) {//внедрo зависимость через конструктор
    this.fruitRepository = fruitRepository;
}

}
Ahora puedes implementar el método desde el “repositorio” Complementamos el “servicio”
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) {//внедo зависимость
    this.fruitRepository = fruitRepository;
}

//создали публичный метод (название любое может быть)
//на вход принимает сущность и сохраняет ее в базу
    public void save(FruitEntity fruitEntity){
        fruitRepository.save(fruitEntity); //реализовали метод внедренного бина
    }

//возвращает лист всех сущностей из базы
    public List<FruitEntity> getAll(){
       return fruitRepository.findAll(); //реализовали метод внедренного бина
    }
}
Ya sólo queda implementar esto en nuestra utilidad, pasemos a la clase 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);

//с помощью переменной сервиса вызываем методы сохранения в базу, по разу для одного un objetoа
        fruitService.save(fruitEntity1);
        fruitService.save(fruitEntity2);
        fruitService.save(fruitEntity3);

//здесь вытаскиваем базу обратно
        List<FruitEntity> all = fruitService.getAll();

//и выводим что получилось
        for (FruitEntity entity : all) {
            System.out.println(entity);
        }
    }
}
Salida de la consola: FruitEntity(id=1, fruitName=fruit1, ProviderCode=1) FruitEntity(id=2, FruitName=fruit2, ProviderCode=2) FruitEntity(id=3, FruitName=fruit3, ProviderCode=3) Aquí puede terminar . "¡Sólo un segundo!" - exclamará el lector más atento - "¿Dónde está Hibernate?" Y Hibernate actúa aquí como un luchador en el frente invisible; hizo algo muy importante: creó estructuras de bases de datos para nosotros. Cuando escribimos los campos en la "entidad" y los marcamos con las anotaciones necesarias, Hibernate hizo su trabajo. De hecho, cuando desarrolla sobre la marcha, es poco probable que tenga que lidiar con la estructura de la base de datos; todo ya estará creado e implementado para usted. Pero en proyectos tan pequeños, Hibernate con su capacidad para crear estructuras de bases de datos simplemente no se puede reemplazar; por supuesto, esta no es su única ventaja, por ejemplo, es bueno para crear entidades relacionadas (no las usaremos en este proyecto). Saludemos a este humilde trabajador: vaya a IDEA en la estructura del proyecto (a la izquierda hay un árbol con carpetas y archivos), allí encontraremos Bibliotecas Externas, ábrala y la verá entre otras bibliotecas.
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
En particular, Maven descargó Hibernate para nosotros y
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
De hecho, el señor Hiber llevó a cabo otra operación encubierta, pero hablaremos de ella en el próximo artículo. Eso es todo seguro ahora. Como ejercicio de capacitación, le sugiero que implemente usted mismo el método saveAll() para FruitEntity , que guardará todas las entidades en la base de datos al mismo tiempo. A continuación, veamos cómo acortar el código del proyecto usando la biblioteca Lombok.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION