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

目录

[Spring Data JPA 概述](#Spring Data JPA 概述)

核心概念

[1. 仓库接口(Repository)](#1. 仓库接口(Repository))

[2. 实体类(Entity)](#2. 实体类(Entity))

[3. 方法命名查询](#3. 方法命名查询)

[4. @Query 注解](#4. @Query 注解)

场景示例

[步骤 1:添加依赖](#步骤 1:添加依赖)

[步骤 2:配置数据库连接](#步骤 2:配置数据库连接)

[步骤 3:创建实体类](#步骤 3:创建实体类)

[步骤 4:创建仓库接口](#步骤 4:创建仓库接口)

[步骤 5:创建服务类](#步骤 5:创建服务类)

[步骤 6:创建控制器类](#步骤 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 驱动的依赖:

XML 复制代码
<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.propertiesapplication.yml 中配置数据库连接信息:

bash 复制代码
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 表:

java 复制代码
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

java 复制代码
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 的方法进行数据操作:

java 复制代码
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 的方法:

java 复制代码
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 格式的用户信息:
bash 复制代码
{
    "name": "John",
    "age": 25
}
  • 根据姓名查找用户 :发送 GET 请求到 http://localhost:8080/users/John
  • 查找年龄大于指定值的用户 :发送 GET 请求到 http://localhost:8080/users/age/20

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

相关推荐
雾岛听蓝1 小时前
Qt开发核心笔记:从HelloWorld到对象树内存管理与坐标体系详解
开发语言·经验分享·笔记·qt
無限進步D5 小时前
Java 运行原理
java·开发语言·入门
難釋懷5 小时前
安装Canal
java
是苏浙5 小时前
JDK17新增特性
java·开发语言
不光头强5 小时前
spring cloud知识总结
后端·spring·spring cloud
GetcharZp8 小时前
告别 Python 依赖!用 LangChainGo 打造高性能大模型应用,Go 程序员必看!
后端
阿里加多8 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
likerhood8 小时前
java中`==`和`.equals()`区别
java·开发语言·python
小小李程序员9 小时前
Langchain4j工具调用获取不到ThreadLocal
java·后端·ai