Serie de tutoriales SpringBoot2.x: uso integrado de JPA

1. Introducción a la APP

1. Concepto JPA

JPA es la especificación de persistencia de Java propuesta oficialmente por Sun. Es la abreviatura de API de persistencia de Java. El nombre chino es 'API de capa de persistencia de Java'. Es esencialmente una especificación ORM.

JPA describe la relación de mapeo de 'tabla relacional de objetos' a través de anotaciones JDK 5.0 o XML, y conserva los objetos de entidad de tiempo de ejecución en la base de datos.

2. El motivo del surgimiento de JPA

Sun introdujo la especificación JPA por dos razones:

    1. Simplificar el desarrollo de Java EE y Java SE existentes;
    1. Sun espera integrar la tecnología ORM para lograr la unidad del mundo.

En otras palabras, el propósito de la especificación JPA propuesta por Sun es unificar las especificaciones de varios marcos ORM a título oficial, incluidos los famosos Hibernate, TopLink, etc. De esta manera, los desarrolladores pueden evitar la necesidad de aprender un marco ORM para usar Hibernate; para usar el marco TopLink, necesitan aprender otro marco ORM, ¡eliminando la necesidad de repetir el proceso de aprendizaje!

3. Tecnologías cubiertas por JPA

La idea general de JPA es más o menos consistente con los marcos ORM existentes como Hibernate, TopLink, JDO y Mybatis.

En general, JPA incluye las siguientes tres tecnologías:

(1) Metadatos de mapeo ORM

JPA admite dos formas de anotaciones en XML y JDK 5.0. Los metadatos describen la relación de mapeo entre objetos y tablas, y el marco conserva los objetos de entidad en las tablas de la base de datos en consecuencia.

(2).API JPA

Se utiliza para operar objetos de entidad y realizar operaciones CRUD. El marco hace todo el trabajo por nosotros en segundo plano, y los desarrolladores se liberan de los engorrosos códigos JDBC y SQL.

(3). Idioma de consulta

Consulte datos a través de un lenguaje de consulta orientado a objetos en lugar de orientado a bases de datos, evitando el acoplamiento estrecho de las declaraciones SQL del programa.

4. La relación entre JPA y otros marcos ORM

La esencia de JPA es una especificación ORM (no un marco ORM, porque JPA no proporciona una implementación ORM, sino solo una especificación), no una implementación.

Solo proporciona algunas interfaces relacionadas, pero estas interfaces no se pueden usar directamente.La capa inferior de JPA necesita algún tipo de implementación de JPA, y los marcos como Hibernate son una implementación específica de JPA.

也就是说JPA仅仅是一套规范,不是一套产品, Hibernate, TopLink等都是实现了JPA规范的一套产品。

Hibernate ha sido compatible con JPA desde 3.2. Hibernate3.2 ha obtenido la certificación compatible con JPA (Java Persistence API) de Sun TCK.

Por lo tanto, la relación entre JPA e Hibernate puede entenderse simplemente como JPA es la interfaz estándar e Hibernate es la implementación. No existe una relación de evaluación comparativa entre ellos. La siguiente figura puede mostrar la relación entre ellos.

Hibernate es una implementación que sigue la especificación JPA, pero Hibernate tiene otras especificaciones para implementar. Entonces, su relación es más similar a: JPA es una especificación estándar para hacer fideos e Hibernate es una sopa de fideos específica que sigue la especificación para hacer fideos; no solo sigue la especificación para hacer fideos, sino que también sigue las especificaciones para hacer sopa y condimentos otras especificaciones.

5. Anotaciones en JPA

2. Spring Boot integra el proceso de implementación de JPA

1. Crea una aplicación web

De acuerdo con nuestra experiencia anterior, creamos un programa web y lo transformamos en un proyecto de Spring Boot, se omite el proceso específico.

2. Agregar dependencias

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.10</version>
</dependency>

3. Agregar archivo de configuración

Crear archivo de configuración application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db4?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    type: com.alibaba.druid.pool.DruidDataSource
    username: root
    password: syc
    driver-class-name: com.mysql.jdbc.Driver #驱动
  jpa:
    hibernate:
      ddl-auto: update #自动更新
    show-sql: true  #日志中显示sql语句

jpa.hibernate.ddl-auto es la propiedad de configuración de hibernate, su función principal es crear, actualizar y verificar automáticamente la estructura de la tabla de la base de datos.

Varias configuraciones de este parámetro son las siguientes:

  • Crear: cada vez que se carga hibernate, se eliminará la última tabla generada y luego se regenerará una nueva tabla de acuerdo con su clase de modelo, incluso si no hay cambios dos veces, este es el que conduce a la pérdida de la tabla de la base de datos. razón importante de los datos.
  • Create-drop: cada vez que se carga hibernate, se genera una tabla de acuerdo con la clase del modelo, pero cuando se cierra sessionFactory, la tabla se elimina automáticamente.
  • actualización: el atributo más utilizado, cuando hibernate se carga por primera vez, la estructura de la tabla se establecerá automáticamente de acuerdo con la clase del modelo (la premisa es establecer primero una base de datos), y cuando hibernate se carga más tarde, la estructura de la tabla se actualizará automáticamente de acuerdo con la clase del modelo, incluso si la estructura de la tabla cambia. Pero las filas de la tabla aún existen sin eliminar las filas anteriores. Cabe señalar que cuando se implementa en el servidor, la estructura de la tabla no se establecerá de inmediato, no se establecerá hasta que la aplicación se ejecute por primera vez.
  • Validar: Cada vez que se carga hibernate, la validación crea la estructura de tablas de la base de datos, las cuales solo se compararán con las tablas de la base de datos, no se crearán nuevas tablas, pero se insertarán nuevos valores.

4. Crear clase de entidad

package com.yyg.boot.domain;

import lombok.Data;
import lombok.ToString;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/3/30
 * @Description Description
 */
@Data
@ToString
@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String username;

    @Column
    private String birthday;

    @Column
    private String sex;

    @Column
    private String address;

}

5. Crear una clase de configuración de fuente de datos

package com.yyg.boot.config;

import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/3/30
 * @Description 第二种配置数据源的方式
 */
@Data
@ComponentScan
@Configuration
@ConfigurationProperties(prefix="spring.datasource")
public class DbConfig {

    private String url;
    private String username;
    private String password;

    @Bean
    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

}

6. Crear un repositorio de entidades JPA

package com.yyg.boot.repository;

import com.yyg.boot.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/3/31
 * @Description Description
 */
public interface UserRepository extends JpaRepository<User, Long> {
}

7. Cree una interfaz de prueba del controlador

package com.yyg.boot.web;

import com.yyg.boot.domain.User;
import com.yyg.boot.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/3/31
 * @Description Description
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("")
    public List<User> findUsers() {
        return userRepository.findAll();
    }

   /**
     * 注意:记得添加@RequestBody注解,否则前端传递来的json数据无法被封装到User中!
     */
    @PostMapping("")
    public User addUser(@RequestBody User user) {
        return  userRepository.save(user);
    }

    @DeleteMapping(path = "/{id}")
    public String deleteById(@PathVariable("id") Long id) {
        userRepository.deleteById(id);
        return "success";
    }

}

8. Crear clase de inicio de aplicación

package com.yyg.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/3/31
 * @Description Description
 */
@SpringBootApplication
public class JpaApplication {

    public static void main(String[] args) {
        SpringApplication.run(JpaApplication.class, args);
    }

}

Estructura completa del proyecto:

9. Interfaz de prueba

Realice una consulta de obtención en el navegador:

Realice la operación de agregar en cartero:

Realizar operaciones de borrado en cartero:

10. Principio de implementación del APP

JPA generará declaraciones de consulta SQL basadas en el nombre del método, que sigue el principio de la Convención sobre la configuración (convención sobre la configuración) y sigue la denominación del método definida por Spring y JPQL. Spring proporciona un mecanismo para la construcción de consultas a través de reglas de nomenclatura.Este mecanismo primero filtra el nombre del método por algunas palabras clave, como find...By, read...By, query...By, count...By y get. ..Por...

Luego, el sistema analizará el nombre en dos subdeclaraciones de acuerdo con las palabras clave, y la primera Por es la palabra clave para distinguir las dos subdeclaraciones. La subsentencia anterior a By es una subsentencia de consulta (indica que se devuelve el objeto que se va a consultar), y la siguiente parte es una subsentencia condicional.

Si es directamente findBy... lo que devuelve es la colección de objetos de dominio especificados al definir el Repositorio.A su vez, JPQL también define palabras clave ricas: and, or, Between, etc. JPQL:

Supongo que te gusta

Origin blog.csdn.net/dyuan134/article/details/130241720
Recomendado
Clasificación