Spring Boot JPA

Spring Boot JPA 是什么?

Spring Boot JPA 是 Spring Boot 框架对 JPA(Java Persistence API,Java持久化API)的封装与简化 ,核心是通过整合 Spring Data JPA 实现对数据库的对象化操作,让开发者无需编写繁琐的 SQL 语句,仅通过面向对象的方式(实体类、注解、Repository 接口)即可完成数据库的增删改查、分页、排序等操作。

简单来说:

  • JPA 是 Java 官方定义的持久化规范(接口),本身不提供实现;
  • Hibernate 是 JPA 最主流的实现(Spring Boot 默认集成 Hibernate);
  • Spring Data JPA 是 Spring 对 JPA 的进一步封装,简化了 Repository 层的代码编写;
  • Spring Boot JPA 则是 Spring Boot 把上述组件(Spring Data JPA + Hibernate)做了自动配置,开箱即用。

核心优势

  1. 简化开发:无需编写 SQL,通过注解/方法命名即可实现数据库操作;
  2. 对象化映射:将数据库表与 Java 实体类一一映射,符合面向对象思想;
  3. 自动配置:Spring Boot 自动配置数据源、JPA 核心组件(EntityManager、事务等);
  4. 灵活扩展:支持自定义 SQL、分页、排序、复杂查询(JPQL/Criteria API);
  5. 事务支持:无缝集成 Spring 事务管理。

核心组件与使用步骤

1. 核心依赖(Maven)

Spring Boot 提供了 spring-boot-starter-data-jpa 启动器,自动引入所有核心依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 数据库驱动(以MySQL为例) -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
2. 核心配置(application.yml)

Spring Boot 自动配置 JPA,但可通过配置项自定义:

yaml 复制代码
spring:
  # 数据源配置
  datasource:
    url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  # JPA配置
  jpa:
    hibernate:
      ddl-auto: update  # 表结构自动更新(create/create-drop/update/validate/none)
    show-sql: true      # 打印执行的SQL
    properties:
      hibernate:
        format_sql: true  # 格式化SQL
    database-platform: org.hibernate.dialect.MySQL8Dialect  # 数据库方言
3. 核心组件
组件 作用
实体类(@Entity) 映射数据库表,通过注解定义字段、主键、关联关系等
Repository 接口 继承 JpaRepository<T, ID>,自动获得增删改查、分页等方法
EntityManager JPA 核心对象,负责实体的持久化操作(Spring Boot 自动管理)
事务注解(@Transactional) 声明事务边界,Spring 自动管理事务
4. 快速使用示例
步骤1:定义实体类(映射数据库表)
java 复制代码
import jakarta.persistence.*; // Spring Boot 3.x 用jakarta.persistence,2.x 用javax.persistence

@Entity // 标记为JPA实体
@Table(name = "t_user") // 映射的数据库表名
public class User {
    @Id // 主键
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键
    private Long id;
    
    @Column(name = "user_name", length = 50, nullable = false) // 映射字段
    private String userName;
    
    private Integer age;
    
    // 无参构造器(JPA必须)、getter/setter
    public User() {}
    
    // 省略getter/setter
}
步骤2:定义Repository接口
java 复制代码
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // 无需实现,Spring Data JPA 根据方法名自动生成SQL
    // 示例:根据年龄查询用户
    List<User> findByAge(Integer age);
    
    // 示例:根据用户名模糊查询 + 年龄排序
    List<User> findByUserNameLikeOrderByAgeDesc(String userName);
}
步骤3:业务层/控制器使用
java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    // 新增/修改用户
    @Transactional // 事务注解
    public User saveUser(User user) {
        return userRepository.save(user);
    }
    
    // 根据ID查询用户
    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
    
    // 根据年龄查询用户
    public List<User> getUsersByAge(Integer age) {
        return userRepository.findByAge(age);
    }
    
    // 删除用户
    @Transactional
    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}

关键知识点补充

  1. ddl-auto 配置说明

    • create:每次启动删除旧表,创建新表(开发测试用);
    • create-drop:启动创建表,关闭删除表;
    • update:根据实体类更新表结构(保留数据,推荐开发用);
    • validate:校验实体与表结构是否一致,不一致则报错;
    • none:不做任何操作(生产环境推荐)。
  2. 方法命名规则

    Spring Data JPA 支持通过方法名自动生成SQL,核心关键字:

    • 查询:findBygetByqueryBy
    • 条件:AndOrLikeBetweenGreaterThanLessThan
    • 排序:OrderBy...Asc/Desc
    • 统计:countByexistsBy
    • 删除:deleteBy
  3. 复杂查询

    • JPQL:面向对象的查询语言(类似SQL,但操作实体类);
    • Criteria API:动态构建查询(类型安全);
    • 原生SQL:通过 @Query(nativeQuery = true) 执行原生SQL。
  4. 分页与排序

    java 复制代码
    // 分页查询
    Page<User> page = userRepository.findAll(PageRequest.of(0, 10)); // 第1页,每页10条
    // 排序查询
    List<User> list = userRepository.findAll(Sort.by(Sort.Direction.DESC, "age"));

适用场景

  • 中后台管理系统、快速开发的业务场景;
  • 对 SQL 灵活性要求不高,追求开发效率的场景;
  • 适合面向对象的开发模式,减少重复的 CRUD 代码。

如果需要极致的 SQL 性能优化(如复杂报表、高并发查询),建议结合 MyBatis 一起使用(Spring Boot 也支持整合 MyBatis + JPA)。

相关推荐
南极企鹅6 小时前
springBoot项目有几个端口
java·spring boot·后端
忧郁的Mr.Li7 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端
暮色妖娆丶7 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
Coder_Boy_7 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring
爱学英语的程序员8 小时前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
Java新手村8 小时前
基于 Vue 3 + Spring Boot 3 的 AI 面试辅助系统:实时语音识别 + 大模型智能回答
vue.js·人工智能·spring boot
消失的旧时光-19439 小时前
第十四课 · 实战篇:Redis 缓存系统落地指南(Spring Boot 从 0 到可用)
spring boot·redis·缓存
wxin_VXbishe9 小时前
C#(asp.net)学员竞赛信息管理系统-计算机毕业设计源码28790
java·vue.js·spring boot·spring·django·c#·php
森焱森9 小时前
详解 Spring Boot、Flask、Nginx、Redis、MySQL 的关系与协作
spring boot·redis·python·nginx·flask