Spring Data JPA 访问数据


你需要的

  • 大约 20 分钟

  • 一个喜欢的文本编辑器或 IDE

  • Java 17 或更高版本

  • Gradle 7.5+ 或 Maven 3.5+

使用 Spring Initializr 创建项目

你可以使用这个 预初始化的项目 ,并点击生成,下载一个 ZIP 文件。

如果你想要手动初始化项目:

点击 Spring Initializr

  1. 选择 Gradle 或 Maven 以及你想使用的语言。本指南假设你选择了 Java 。

  2. 点击 Dependencies,选择 Spring Web、Spring Data JPA 和 PostgreSQL Driver。

  3. 点击 “GENERATE”。

  4. 下载生成的 ZIP 文件,这是一个用你的选择配置的 Web 应用的压缩包。

Spring Boot 配置

在 /src/main/resources/application.properties 中,添加:

spring.datasource.url=jdbc:postgresql://localhost:5432/demo
spring.datasource.username=postgres
spring.datasource.password=123456
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.open-in-view=false
spring.jpa.hibernate.ddl-auto=update

Entity 层

创建一个新的 Entity 对象,如下所示(在 src/main/java/com/stdu/jpa/entity/User.java 中):

package com.stdu.jpa.entity;

import jakarta.persistence.*;

import java.io.Serializable;

@Entity
@Table(name = "users")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(nullable = false)
    private String firstName;
    @Column(nullable = false)
    private String lastName;
    private String description;

    public Long getId() {
        return id;
    }

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

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

Repository 层

创建一个新的 Repository 接口,如下所示(在 src/main/java/com/stdu/jpa/repository/UserRepository.java 中):

package com.stdu.jpa.repository;

import com.stdu.jpa.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserRepository extends PagingAndSortingRepository<User, Long>, JpaRepository<User, Long> {
    List<User> findByFirstName(String name);
}

Controller 层

创建一个新的 Controller 对象 ,如下所示(在 src/main/java/com/stdu/jpa/controller/UserController.java 中):

package com.stdu.jpa.controller;

import com.stdu.jpa.entity.User;
import com.stdu.jpa.repository.UserRepository;
import jakarta.annotation.Resource;
import org.springframework.data.repository.query.Param;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
@CrossOrigin
@RequestMapping("/api/users")
public class UserController {
    @Resource
    UserRepository userRepository;

    @GetMapping
    public List<User> getUsers() {
        return userRepository.findAll();
    }

    @PostMapping
    public User addUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    @GetMapping("/{id}")
    public Optional<User> getUserById(@PathVariable Long id) {
        return userRepository.findById(id);
    }

    @PutMapping("/{id}")
    public User updateUser(@RequestBody User newUser, @PathVariable Long id) {
        return userRepository.findById(id).map(user -> {
            user.setFirstName(newUser.getFirstName());
            user.setLastName(newUser.getLastName());
            user.setDescription(newUser.getDescription());
            return userRepository.save(user);
        }).orElseGet(() -> {
            newUser.setId(id);
            return userRepository.save(newUser);
        });
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userRepository.deleteById(id);
    }

    @GetMapping("/search/findByFirstName")
    public List<User> findUsersByFirstName(@Param("name") String name) {
        return userRepository.findByFirstName(name);
    }
}

测试应用程序

打开浏览器,访问 localhost:8080/api/users

GET /users

[]

可以看到并没有数据,接下来使用 Axios 创建一个新的 User

let config = {
    baseURL: 'http://localhost:8080/api'
};
let data = {
    "firstName": "Xiaobang",
    "lastName": "Shi",
    "description": "Otaku"
};

下面的例子使用了一个 POST 调用:

POST /users

axios.post('/users', data, config).then(function (response) {
    console.log(response);
}).catch(function (error) {
    console.log(error);
});

访问 localhost:8080/api/users/1

GET /users/:id

{
    "firstName": "Xiaobang",
    "lastName": "Shi",
    "description": "Otaku"
}

下面的例子使用了一个 PUT 调用:

let data = {
    "firstName": "Jiaqi",
    "lastName": "Liu",
    "description": "HeroPoi"
}

PUT /users/:id

axios.put('users/1', data, config).then(function (response) {
    console.log(response);
}).catch(function (error) {
    console.log(error);
});

下面的例子使用了一个 DELETE 调用:

DELETE /users/:id

axios.delete('users/1', config).then(function (response) {
    console.log(response);
}).catch(function (error) {
    console.log(error);
});

总结

项目源码:Spring Boot Examples