Java直通车系列28【Spring Boot】(数据访问Spring Data JPA)

发布于:2025-03-12 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

Spring Data JPA 概述

核心概念

1. 仓库接口(Repository)

2. 实体类(Entity)

3. 方法命名查询

4. @Query 注解

场景示例

步骤 1:添加依赖

步骤 2:配置数据库连接

步骤 3:创建实体类

步骤 4:创建仓库接口

步骤 5:创建服务类

步骤 6:创建控制器类

测试示例


Spring Data JPA 概述

Spring Data JPA 是 Spring 提供的一个用于简化 JPA(Java Persistence API)数据访问的框架。JPA 是 Java 官方提供的用于对象关系映射(ORM)的标准规范,Spring Data JPA 在 JPA 的基础上进行了封装和扩展,使得开发者可以更加方便地进行数据库操作,减少了大量的样板代码。

核心概念

1. 仓库接口(Repository)

Spring Data JPA 定义了一系列的仓库接口,这些接口是进行数据访问的核心。最基础的是 Repository 接口,它是所有仓库接口的父接口。常见的扩展接口有:

  • CrudRepository:提供了基本的增删改查(CRUD)操作方法。
  • PagingAndSortingRepository:在 CrudRepository 的基础上,增加了分页和排序的功能。
  • JpaRepository:继承自 PagingAndSortingRepository,并提供了一些 JPA 特有的方法。
2. 实体类(Entity)

实体类是与数据库表对应的 Java 类,使用 @Entity 注解标记。实体类中的属性通过 @Column 等注解与数据库表的字段进行映射。

3. 方法命名查询

Spring Data JPA 支持根据方法名自动生成查询语句。只需要按照特定的命名规则定义方法名,Spring Data JPA 会根据方法名解析出对应的查询逻辑。

4. @Query 注解

当方法命名查询无法满足需求时,可以使用 @Query 注解在仓库接口的方法上直接定义 JPQL(Java Persistence Query Language)或 SQL 查询语句。

场景示例

步骤 1:添加依赖

在 pom.xml 中添加 Spring Data JPA 和 MySQL 驱动的依赖:

<dependencies>
    <!-- Spring Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>
步骤 2:配置数据库连接

在 application.properties 或 application.yml 中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
步骤 3:创建实体类

创建一个 User 实体类,对应数据库中的 users 表:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int age;

    // 构造方法、Getter 和 Setter 方法
    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
步骤 4:创建仓库接口

创建一个 UserRepository 接口,继承自 JpaRepository

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // 方法命名查询:根据姓名查找用户
    User findByName(String name);

    // 使用 @Query 注解定义查询
    @Query("SELECT u FROM User u WHERE u.age > :age")
    java.util.List<User> findUsersByAgeGreaterThan(int age);
}
步骤 5:创建服务类

创建一个 UserService 类,调用 UserRepository 的方法进行数据操作:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User saveUser(User user) {
        return userRepository.save(user);
    }

    public User findUserByName(String name) {
        return userRepository.findByName(name);
    }

    public List<User> findUsersByAgeGreaterThan(int age) {
        return userRepository.findUsersByAgeGreaterThan(age);
    }
}
步骤 6:创建控制器类

创建一个 UserController 类,处理 HTTP 请求并调用 UserService 的方法:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.saveUser(user);
    }

    @GetMapping("/{name}")
    public User getUserByName(@PathVariable String name) {
        return userService.findUserByName(name);
    }

    @GetMapping("/age/{age}")
    public List<User> getUsersByAgeGreaterThan(@PathVariable int age) {
        return userService.findUsersByAgeGreaterThan(age);
    }
}

测试示例

启动 Spring Boot 应用程序后,可以使用工具(如 Postman)进行测试:

  • 创建用户:发送 POST 请求到 http://localhost:8080/users,请求体为 JSON 格式的用户信息:
{
    "name": "John",
    "age": 25
}
  • 根据姓名查找用户:发送 GET 请求到 http://localhost:8080/users/John
  • 查找年龄大于指定值的用户:发送 GET 请求到 http://localhost:8080/users/age/20

通过以上步骤,我们可以看到 Spring Data JPA 大大简化了数据库操作,开发者只需要定义实体类和仓库接口,就可以轻松实现常见的数据访问功能。