通俗易懂!2025 年 Spring Data JPA 完全实操版
(国内互联网用得少,但面试、国外公司、个人项目必须会,10分钟吃透)
一句话记住 Spring Data JPA 是谁:
Spring Data JPA = “写 Java 方法名,自动生成 SQL 的黑魔法”
让你基本不用写 SQL,就能完成 95% 的增删改查。
2025 年真实使用场景(直接背)
| 场景 | 使用率 | 真实评价 |
|---|---|---|
| 国内互联网大厂 | <5% | 基本不用(SQL 不可控、分库分表拉胯) |
| 国外公司 / 欧美项目 | 70%+ | 主流(开发效率高,SQL 不重要) |
| 创业公司快速原型 | 50% | 上手快,适合 MVP |
| 个人项目 / 毕业设计 | 90% | 首选(一行代码实现 CRUD) |
| 银行 / 复杂报表系统 | 0% | 完全不用 |
一、Spring Boot 3 整合 Spring Data JPA(3 分钟跑通)
# 1. pom.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>
</dependency>
# 2. application.yml(最简版)
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
username: root
password: 123456
jpa:
show-sql: true # 控制台打印 SQL(开发必开)
hibernate:
ddl-auto: update # 自动建表(开发用),生产用 validate
properties:
hibernate:
format_sql: true
// 3. 实体类(就这几行)
@Entity
@Table(name = "t_user")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
@CreationTimestamp
private LocalDateTime createTime;
@UpdateTimestamp
private LocalDateTime updateTime;
}
// 4. Repository 接口(黑魔法开始!)
public interface UserRepository extends JpaRepository<User, Long> {
// 方法名自动生成 SQL!背会下面这些就无敌了
List<User> findByAgeGreaterThan(Integer age);
List<User> findByNameContaining(String keyword);
List<User> findByAgeBetween(Integer min, Integer max);
@Query("SELECT u FROM User u WHERE u.name LIKE %:name% AND u.age > :age")
List<User> search(@Param("name") String name, @Param("age") Integer age);
@Modifying
@Query("UPDATE User u SET u.age = :age WHERE u.id = :id")
int updateAge(@Param("id") Long id, @Param("age") Integer age);
}
// 5. Service 层(爽到飞起)
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepo;
@Transactional
public void test() {
// 增删改查分页全自动
userRepo.save(new User().setName("张三").setAge(18));
Page<User> page = userRepo.findAll(PageRequest.of(0, 10, Sort.by("age").descending()));
List<User> list = userRepo.findByAgeGreaterThan(20);
}
}
二、2025 年最常用的 10 个方法名关键词(背会直接开挂)
| 关键词 | 生成的 SQL 示例 |
|---|---|
| findBy / getBy | SELECT … WHERE |
| findFirst10By | LIMIT 10 |
| findTop3By…OrderByAgeDesc | ORDER BY age DESC LIMIT 3 |
| countBy | SELECT COUNT(*) WHERE … |
| existsBy | SELECT EXISTS(SELECT 1 WHERE …) |
| deleteBy / removeBy | DELETE WHERE … |
| …Containing | LIKE ‘%keyword%’ |
| …Between | age BETWEEN 18 AND 30 |
| …GreaterThan | age > 20 |
| …IsNull / …IsNotNull | = NULL / IS NOT NULL |
三、面试最爱问的 6 个坑 + 标准答案
| 问题 | 标准答案(直接背) |
|---|---|
| 1. JPA 和 Hibernate 什么关系? | JPA 是规范,Hibernate 是实现,Spring Data JPA 底层就是 Hibernate |
| 2. 为什么大厂不用 JPA? | N+1 查询问题、SQL 不可控、动态 SQL 难写、分库分表不支持、性能比 MyBatis 差 |
| 3. JPA 的 N+1 问题怎么解决? | 用 @EntityGraph、LEFT JOIN FETCH、@Query + fetch join、Blaze-Persistence |
| 4. @Transactional 放哪? | 必须放在 Service 上!Repository 接口方法是 public,但 Spring AOP 不代理接口方法 |
| 5. ddl-auto 生产用什么? | validate(校验表结构)或 none(关闭) |
| 6. JPA 支持分库分表吗? | 不支持!大厂全用 MyBatis + ShardingSphere |
四、终极记忆口诀(10秒记住 JPA 核心)
“JPA 就是写方法名,
findBy 查,save 存,delete 删,count 数
分页 Pageable,排序 Sort
国外爱用,国内大厂看不上
N+1 是爹,性能拉胯,
想进大厂?赶紧学 MyBatis-Plus!”
背完这篇 + 口诀,
下次面试官问“Spring Data JPA 了解吗?”,
你直接说:“会!但国内大厂基本不用,原因是因为……”,
再甩出 5 个方法名查询示例,
他当场就说:“小伙子很实在,懂选型,收了!”
国外公司/个人项目/快速原型,直接用 JPA 起飞!
冲!双修 JPA + MyBatis-Plus,天下我有!