AI大模型教程
一起来学习

springboot3 jpa 数据库操作入门与实战

Jpa 项目

https://gitee.com/supervol/loong-springboot-study

(记得给个start,感谢)

Jpa 概述

        Spring Boot 3 中的 JPA(Java Persistence API)是基于 Spring Data JPA 实现的持久层解决方案,它简化了 Java 应用与数据库的交互,通过 ORM(对象关系映射)将 Java 对象与数据库表关联,减少了传统 JDBC 开发中的样板代码。

Jpa 核心

1. Jpa 是什么

        JPA 是 Java 持久化规范(接口),定义了对象与关系数据库映射的标准,本身不提供实现。常见的实现框架有 Hibernate、EclipseLink 等。Spring Data JPA 是 Spring 对 JPA 的封装,提供了更简洁的 API(如 Repository 接口),自动生成 SQL 语句,简化数据访问层开发。

2. Jpa 关系

        Spring Boot 3 基于 Spring Framework 6,默认集成 Spring Data JPA,并通过「自动配置」简化 JPA 的使用(无需手动配置数据源、实体管理器等)。重要变化:Spring Boot 3 迁移到 Jakarta EE 9+,因此 JPA 相关注解的包名从 javax.persistence 变为 jakarta.persistence

Jpa 示例

        请参考项目地址中 springboot-orm/springboot-jpa 模块代码。

Jpa 配置

1. 依赖引入

        在 pom.xml(Maven)中添加 Spring Data JPA Starter 和数据库驱


org.springframework.bootspring-boot-starter-data-jpacom.mysqlmysql-connector-jruntime

2. 配置文件

        在 application.yaml 或 application.properties 中配置数据源和 JPA 属性:

spring:
  # 数据源配置
  datasource:
    url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver  # MySQL 8+ 驱动类

  # JPA 配置
  jpa:
    hibernate:
      ddl-auto: update  # 自动创建/更新表结构(生产环境建议用 validate)
    show-sql: true      # 打印 SQL 语句
    format-sql: true    # 格式化 SQL
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect  # 数据库方言(适配 MySQL 8)
    open-in-view: false  # 关闭 OpenInView 模式(避免事务外访问懒加载数据)
  • ddl-auto 取值说明:
    • create:每次启动创建表(删除旧表)
    • update:根据实体自动更新表结构(保留数据)
    • validate:校验表结构是否与实体一致(不修改表)
    • none:不自动操作表结构

Jpa 组件

1. 实体类

        用 @Entity 标记 Java 类与数据库表关联,通过注解定义字段映射关系。

import jakarta.persistence.*;
import lombok.Data;

@Data  // Lombok 注解,自动生成 getter/setter 等
@Entity
@Table(name = "t_user")  // 指定表名(默认类名小写)
public class User {
    @Id  // 主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 自增策略(依赖数据库)
    private Long id;

    @Column(name = "username", length = 50, nullable = false, unique = true)
    // 映射到表字段:名称为 username,长度 50,非空,唯一
    private String username;

    @Column(name = "age")
    private Integer age;

    @Transient  // 忽略该字段(不映射到数据库)
    private String tempData;
}
  • 常用注解:
    • @Entity:标记为 JPA 实体
    • @Table:指定关联的表名、索引等
    • @Id:声明主键
    • @GeneratedValue:指定主键生成策略(IDENTITYAUTOSEQUENCE 等)
    • @Column:配置字段属性(名称、长度、是否为空等)
    • @Transient:排除字段,不参与映射

2. 仓库接口

        通过继承 Spring Data JPA 提供的 Repository 接口,无需编写实现类即可实现数据访问。

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
import java.util.Optional;

// 继承 JpaRepository,自动获得 CRUD 能力
public interface UserRepository extends JpaRepository {

    // 1. 方法名派生查询(自动生成 SQL)
    // 根据用户名查询(where username = ?)
    Optional findByUsername(String username);

    // 根据年龄大于指定值查询(where age > ?)
    List findByAgeGreaterThan(Integer age);

    // 2. 自定义 JPQL 查询(基于实体类)
    @Query("SELECT u FROM User u WHERE u.username LIKE %:keyword%")
    List searchByUsername(@Param("keyword") String keyword);

    // 3. 自定义原生 SQL 查询(基于数据库表)
    @Query(value = "SELECT * FROM t_user WHERE age BETWEEN :min AND :max", nativeQuery = true)
    List findByAgeRange(@Param("min") Integer min, @Param("max") Integer max);
}
  • 核心接口:
    • Repository:基础接口(空接口,标记作用)
    • CrudRepository:提供 CRUD 操作
    • PagingAndSortingRepository:继承 CrudRepository,支持分页和排序
    • JpaRepository:继承 PagingAndSortingRepository,增加更多 JPA 特性(如批量操作)

3. 服务层

        通过调用 Repository 接口实现业务逻辑,并使用 @Transactional 管理事务。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

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

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

    // 新增/更新用户(事务管理)
    @Transactional  // 声明事务(默认 RuntimeException 回滚)
    public User save(User user) {
        return userRepository.save(user);
    }

    // 删除用户
    @Transactional
    public void deleteById(Long id) {
        userRepository.deleteById(id);
    }
}
  • @Transactional 注解:
    • 作用于类或方法,标记需要事务管理的操作
    • 常用属性:propagation(事务传播机制)、isolation(隔离级别)、readOnly(只读事务)等

4. 控制器

        处理 HTTP 请求,调用 Service 层完成业务响应。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;

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

    @Autowired
    private UserService userService;

    // 查询所有
    @GetMapping
    public List getAllUsers() {
        return userService.findAll();
    }

    // 根据 ID 查询
    @GetMapping("/{id}")
    public ResponseEntity getUserById(@PathVariable Long id) {
        return userService.findById(id)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    }

    // 新增用户
    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.save(user);
    }

    // 更新用户
    @PutMapping("/{id}")
    public ResponseEntity updateUser(@PathVariable Long id, @RequestBody User user) {
        return userService.findById(id)
                .map(existingUser -> {
                    user.setId(id);  // 确保 ID 一致
                    return ResponseEntity.ok(userService.save(user));
                })
                .orElse(ResponseEntity.notFound().build());
    }

    // 删除用户
    @DeleteMapping("/{id}")
    public ResponseEntity deleteUser(@PathVariable Long id) {
        return userService.findById(id)
                .map(user -> {
                    userService.deleteById(id);
                    return ResponseEntity.noContent().build();
                })
                .orElse(ResponseEntity.notFound().build());
    }
}

Jpa 高级

  1. 分页与排序通过 Pageable 和 Sort 实现分页查询:
// Service 层
public Page findUsersByPage(int pageNum, int pageSize) {
    // 页码从 0 开始,按 ID 降序排序
    Pageable pageable = PageRequest.of(pageNum, pageSize, Sort.by("id").descending());
    return userRepository.findAll(pageable);
}
  1. 关联关系映射通过注解处理实体间关联(如一对一、一对多等):

    • @OneToOne:一对一关联
    • @OneToMany + @ManyToOne:一对多 / 多对一关联
    • @ManyToMany:多对多关联
  2. 审计功能自动记录实体的创建时间、更新时间等:

    • 启动类添加 @EnableJpaAuditing
    • 实体类使用 @CreatedDate@LastModifiedDate 等注解:
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)  // 启用审计监听
public class User {
    // ... 其他字段
    
    @CreatedDate  // 自动填充创建时间
    private LocalDateTime createTime;
    
    @LastModifiedDate  // 自动填充更新时间
    private LocalDateTime updateTime;
}

Jpa 注意

  1. 包名变化:Spring Boot 3 中 JPA 注解从 javax.persistence 迁移到 jakarta.persistence,需更新导入语句。
  2. 数据库方言:需根据数据库类型配置正确的方言(如 MySQL 8 对应 MySQL8Dialect)。
  3. 懒加载问题:避免在事务外访问懒加载属性(可关闭 open-in-view 模式,显式初始化关联数据)。
  4. 生产环境配置ddl-auto 建议设为 validate,通过数据库迁移工具(如 Flyway、Liquibase)管理表结构。

Jpa 总结

        通过 Spring Boot 3 JPA,开发者可专注于业务逻辑,大幅提升持久层开发效率。

  • 简化开发:无需编写 SQL,通过方法名或注解自动生成查询。
  • 事务支持:与 Spring 事务管理无缝集成。
  • 灵活性:支持 JPQL、原生 SQL、分页、排序等复杂操作。
  • 自动配置:Spring Boot 自动配置数据源、实体管理器等,开箱即用。

文章来源于互联网:springboot3 jpa 数据库操作入门与实战

相关推荐: uniapp [全端兼容] – 实现人脸识别对比+人脸相似度,从相册选择或拍照上传两张图片进行人脸对比得到人脸相似度及判断是否是同一个人,人脸活体检测及对比(免费纯前端方案+调用第三方API接口方案)

前言 如果您需要原生微信小程序版本,请访问 这篇文章。 在 uni-app 全平台兼容(H5网页、微信小程序、安卓App、苹果App)开发中,详解实现人脸相似度对比功能,用户本地相册上传或调用相机拍照后上传2张图片比对图片中两张人脸的相似度并返回相似度分值或百…

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » springboot3 jpa 数据库操作入门与实战
分享到: 更多 (0)

AI大模型,我们的未来

小欢软考联系我们