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:指定主键生成策略(IDENTITY、AUTO、SEQUENCE等) -
@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 高级
-
分页与排序通过
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);
}
-
关联关系映射通过注解处理实体间关联(如一对一、一对多等):
-
@OneToOne:一对一关联 -
@OneToMany+@ManyToOne:一对多 / 多对一关联 -
@ManyToMany:多对多关联
-
-
审计功能自动记录实体的创建时间、更新时间等:
- 启动类添加
@EnableJpaAuditing - 实体类使用
@CreatedDate、@LastModifiedDate等注解:
- 启动类添加
@Entity
@Data
@EntityListeners(AuditingEntityListener.class) // 启用审计监听
public class User {
// ... 其他字段
@CreatedDate // 自动填充创建时间
private LocalDateTime createTime;
@LastModifiedDate // 自动填充更新时间
private LocalDateTime updateTime;
}
Jpa 注意
-
包名变化:Spring Boot 3 中 JPA 注解从
javax.persistence迁移到jakarta.persistence,需更新导入语句。 -
数据库方言:需根据数据库类型配置正确的方言(如 MySQL 8 对应
MySQL8Dialect)。 -
懒加载问题:避免在事务外访问懒加载属性(可关闭
open-in-view模式,显式初始化关联数据)。 -
生产环境配置:
ddl-auto建议设为validate,通过数据库迁移工具(如 Flyway、Liquibase)管理表结构。
Jpa 总结
通过 Spring Boot 3 JPA,开发者可专注于业务逻辑,大幅提升持久层开发效率。
- 简化开发:无需编写 SQL,通过方法名或注解自动生成查询。
- 事务支持:与 Spring 事务管理无缝集成。
- 灵活性:支持 JPQL、原生 SQL、分页、排序等复杂操作。
- 自动配置:Spring Boot 自动配置数据源、实体管理器等,开箱即用。
文章来源于互联网:springboot3 jpa 数据库操作入门与实战
前言 如果您需要原生微信小程序版本,请访问 这篇文章。 在 uni-app 全平台兼容(H5网页、微信小程序、安卓App、苹果App)开发中,详解实现人脸相似度对比功能,用户本地相册上传或调用相机拍照后上传2张图片比对图片中两张人脸的相似度并返回相似度分值或百…
5bei.cn大模型教程网










