Spring Data JPA

通俗易懂!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 / getBySELECT … WHERE
findFirst10ByLIMIT 10
findTop3By…OrderByAgeDescORDER BY age DESC LIMIT 3
countBySELECT COUNT(*) WHERE …
existsBySELECT EXISTS(SELECT 1 WHERE …)
deleteBy / removeByDELETE WHERE …
…ContainingLIKE ‘%keyword%’
…Betweenage BETWEEN 18 AND 30
…GreaterThanage > 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,天下我有!

文章已创建 3017

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部