详细介绍一下Spring Boot3中如何整合JPA技术?

createh51周前 (03-27)技术教程3

JPA(Java Persistence API)技术是JavaEE中用来定义标准接口和规范的技术,主要的目的就是为了简化数据库的操作。属于一种ORM (Object-Relational Mapping) 规范,这个规范就允许开发者将Java对象映射到关系型数据库中的关系型数据表中,它并不是某个具体的技术体现,而是一种技术规范的体现。具体的使用技术有Hibernate、EclipseLink、OpenJPA 等,下面我们就来介绍下如何在Spring Boot3中整合JPA技术。

引入依赖配置

结合Spring Boot框架的使用,想要使用JPA技术就必须要引入JPA的相关依赖配置。如下所示。


    
    
        org.springframework.boot
        spring-boot-starter-web
    

    
    
        org.springframework.boot
        spring-boot-starter-data-jpa
    

    
    
        com.h2database
        h2
        runtime
    

    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    

    
    

从依赖配置中可以看到引入了spring-boot-starter-data-jpa依赖配置,也就是说引入的实Spring Boot JPA的依赖配置,Spring Boot JPA是对JPA进行了封装,提供了大量对JPA技术的扩展,尤其是在CRUD操作方面,在后面我们会提到。

添加配置

依赖添加完成之后,接下来就是根据配置依赖,添加对应的数据库连接配置、JPA映射配置等配置内容。这里我们演示通过H2数据库来进行连接配置,如下所示。

# 数据源配置
spring:
  datasource:
    url: jdbc:h2:mem:testdb  # H2内存数据库的连接URL(根据实际使用的数据库修改)
    driver-class-name: org.h2.Driver
    username: sa
    password: password
    hikari:
      maximum-pool-size: 10  # 设置连接池大小(可根据需要调整)

  # JPA配置
  jpa:
    hibernate:
      ddl-auto: update  # 创建或更新数据库表结构(可以根据需要设置为 none、validate、update 或 create)
    database-platform: org.hibernate.dialect.H2Dialect  # H2数据库的方言(根据使用的数据库修改)
    show-sql: true  # 显示SQL语句
    properties:
      hibernate:
        format_sql: true  # 格式化SQL输出

  # 启用自动配置,Spring Boot会自动配置JPA数据源、EntityManager等
  jpa:
    open-in-view: false  # 关闭Open Session in View,减少性能开销,避免懒加载异常

# 端口配置
server:
  port: 8080  # 设置应用的监听端口

# 其他常用配置
logging:
  level:
    org.springframework.web: DEBUG  # 设置Web相关日志级别
    org.hibernate.SQL: DEBUG  # 打印Hibernate执行的SQL语句

当然如果在项目中使用的是其他的数据库则可以将配置修改为如下的配置内容,如下所示,以MySQL数据库为例,这个时候需要注意,需要在POM依赖文件中添加MySQL的驱动依赖。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    hikari:
      maximum-pool-size: 10

  jpa:
    hibernate:
      ddl-auto: update
    database-platform: org.hibernate.dialect.MySQL8Dialect
    show-sql: true
    properties:
      hibernate:
        format_sql: true

具体使用

根据JPA的概念,我们首先需要先来定义一个Java的实体类对象,如下所示。

定义实体类

@Entity
public class User {

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

    private String name;
    private String email;

    // getters and setters
}

创建JPA仓库

Spring Boot JPA中提供了对于数据访问的封装,我们可以继承JpaRepositoryCrudRepository接口来实现自定义的数据库访问方法,当然在默认实现中也提供了一些直接可以使用的方法,如save(), findById(), findAll()等,如下所示。

package com.example.demo.repository;

import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository {
    // 可以定义自定义查询方法
    User findByEmail(String email);
}

创建服务层

服务层通常会依赖于Repository来进行数据的CRUD操作,我们可以在服务层中对相关的业务逻辑进行封装。

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // 查询所有用户
    public List getAllUsers() {
        return userRepository.findAll();
    }

    // 根据id查询用户
    public Optional getUserById(Long id) {
        return userRepository.findById(id);
    }

    // 根据邮箱查询用户
    public User getUserByEmail(String email) {
        return userRepository.findByEmail(email);
    }

    // 创建用户
    public User createUser(User user) {
        return userRepository.save(user);
    }
}

创建控制器

最后就是通过Controller层的控制器类来暴露RESTFulAPI接口,提供给前端服务或者是其他的微服务进行调用。如下所示。

@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    // 获取所有用户
    @GetMapping
    public List getAllUsers() {
        return userService.getAllUsers();
    }

    // 根据ID获取用户
    @GetMapping("/{id}")
    public Optional getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    // 根据邮箱获取用户
    @GetMapping("/email/{email}")
    public User getUserByEmail(@PathVariable String email) {
        return userService.getUserByEmail(email);
    }

    // 创建用户
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }
}

这样,我们整个的JPA服务就算搭建成功了。

总结

JPA技术通过ORM映射对数据库表和Java对象之间进行了自动化的转换,减少了直接操作数据库的复杂性,结合Spring Boot技术的快速敏捷,可以提供非常高效的接口实现方案。对于常见的数据库CRUD操作,使用JPA可以大大减少手动编写SQL的工作,提高开发效率。

相关文章

100个Java工具类之69:提供HTTP实体处理功能的EntityUtils

在Java开发中,org.apache.http.util.EntityUtils是一个非常实用的工具类,尤其在进行HTTP请求和响应处理时。它是Apache HttpClient库的一部分,提供了一...

java编程语言中实体类属性自动生成lombok插件_v1

大家好,欢迎来到人工智复,我们的使命是互相勉励,坚定信念,认准自己的方向,坚持到底。//1. 依赖 org.projectlombok lombok 1.14.8 //2....

JPA实体类注解,看这篇就全会了

基本注解@Entity标注于实体类声明语句之前,指出该 Java 类为实体类,将映射到指定的数据库表。name(可选):实体名称。 缺省为实体类的非限定名称。该名称用于引用查询中的实体。不与 @Tab...

mybatis根据表逆向自动化生成代码:自动生成实体类、mapper文件

若采用mybatis框架,数据库新建表,手动编写的话,需要编写大量的实体类、mapper文件、mapper.xml文件,都是一些重复且有规律的工作。我们可以引用插件,然后做配置,自动生成这些文件,提供...

Java 实体映射工具 MapStruct

简介: 让你的DO(业务实体对象),DTO(数据传输对象)数据转换更简单强大前言 在软件架构中,分层式结构是最常见,各层之间有其独立且隔离的业务逻辑,也因而各层有自己的输入输出对象,也就是代码中见到各...

Java的抽象类与举例说明

#暑期创作大赛#1.抽象类我们知道类是产生对象的模板;那么我们可以将抽象类理解为是产生 实体类的模板。在 Java 中可以专门创建一种父类,它的子类必须遵循父类设定的规则,但父类又不能 直接创建对象,...