原文: http://zetcode.com/springboot/crudrepository/

SpringBoot CrudRepository教程展示了如何使用CrudRepository在 Spring Boot 应用中管理数据。

Spring 是流行的 Java 应用框架。 Spring Boot 致力于以最小的努力创建独立的,基于生产级别的基于 Spring 的应用。

Spring Data

Spring Data 是用于数据访问的基于 Spring 的编程模型。 它减少了使用数据库和数据存储所需的代码量。 它由几个模块组成。 Spring Data JPA 简化了使用 JPA 技术的 Spring 应用的开发。

使用 Spring Data,我们为应用中的每个域实体定义了一个存储库接口。 存储库包含用于执行 CRUD 操作,对数据进行排序和分页的方法。 @Repository是标记注解,指示基础接口是存储库。 通过扩展特定的存储库接口(例如CrudRepositoryPagingAndSortingRepositoryJpaRepository)来创建存储库。

Spring Data 已与 Spring MVC 控制器进行了高级集成,并提供了从存储库方法名称派生的动态查询。

CrudRepository

CrudRepository实现基本的 CRUD 操作,包括countdeltedeleteByIdsavesaveAllfindByIdfindAll

Spring Boot CrudRepository 示例

以下 Spring Boot 应用使用CrudRepository管理User实体。 数据保存在 H2 数据库中。 我们使用一个 RESTful 控制器。

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. Application.java
  8. MyRunner.java
  9. ├───controller
  10. MyController.java
  11. ├───model
  12. User.java
  13. ├───repository
  14. UserRepository.java
  15. └───service
  16. UserService.java
  17. └───resources
  18. └───test
  19. └───java

这是项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>crudrepositoryex</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>jar</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>11</maven.compiler.source>
  14. <maven.compiler.target>11</maven.compiler.target>
  15. </properties>
  16. <parent>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-parent</artifactId>
  19. <version>2.1.1.RELEASE</version>
  20. </parent>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-data-jpa</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>com.h2database</groupId>
  32. <artifactId>h2</artifactId>
  33. <scope>runtime</scope>
  34. </dependency>
  35. </dependencies>
  36. <build>
  37. <plugins>
  38. <plugin>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-maven-plugin</artifactId>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>

这是 Maven 构建文件。 spring-boot-starter-web是使用 Spring MVC 构建 Web(包括 RESTful)应用的入门程序。 spring-boot-starter-data-jpa是将 Spring Data JPA 与 Hibernate 结合使用的入门工具。

com/zetcode/model/User.java

  1. package com.zetcode.model;
  2. import javax.persistence.Entity;
  3. import javax.persistence.GeneratedValue;
  4. import javax.persistence.GenerationType;
  5. import javax.persistence.Id;
  6. import java.util.Objects;
  7. @Entity
  8. public class User {
  9. @Id
  10. @GeneratedValue(strategy = GenerationType.IDENTITY)
  11. private Long id;
  12. private String firstName;
  13. private String lastName;
  14. private String email;
  15. public User() {}
  16. public User(String firstName, String lastName, String email) {
  17. this.firstName = firstName;
  18. this.lastName = lastName;
  19. this.email = email;
  20. }
  21. public Long getId() {
  22. return id;
  23. }
  24. public void setId(Long id) {
  25. this.id = id;
  26. }
  27. public String getFirstName() {
  28. return firstName;
  29. }
  30. public void setFirstName(String firstName) {
  31. this.firstName = firstName;
  32. }
  33. public String getLastName() {
  34. return lastName;
  35. }
  36. public void setLastName(String lastName) {
  37. this.lastName = lastName;
  38. }
  39. public String getEmail() {
  40. return email;
  41. }
  42. public void setEmail(String email) {
  43. this.email = email;
  44. }
  45. @Override
  46. public boolean equals(Object o) {
  47. if (this == o) return true;
  48. if (o == null || getClass() != o.getClass()) return false;
  49. User user = (User) o;
  50. return Objects.equals(id, user.id) &&
  51. Objects.equals(firstName, user.firstName) &&
  52. Objects.equals(lastName, user.lastName) &&
  53. Objects.equals(email, user.email);
  54. }
  55. @Override
  56. public int hashCode() {
  57. return Objects.hash(id, firstName, lastName, email);
  58. }
  59. @Override
  60. public String toString() {
  61. final StringBuilder sb = new StringBuilder("User{");
  62. sb.append("id=").append(id);
  63. sb.append(", firstName='").append(firstName).append('\'');
  64. sb.append(", lastName='").append(lastName).append('\'');
  65. sb.append(", email='").append(email).append('\'');
  66. sb.append('}');
  67. return sb.toString();
  68. }
  69. }

这是User实体。

com/zetcode/service/UserService.java

  1. package com.zetcode.service;
  2. import com.zetcode.model.User;
  3. import com.zetcode.repository.UserRepository;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. @Service
  9. public class UserService {
  10. @Autowired
  11. private UserRepository userRepository;
  12. public List<User> findAll() {
  13. var it = userRepository.findAll();
  14. var users = new ArrayList<User>();
  15. it.forEach(e -> users.add(e));
  16. return users;
  17. }
  18. public Long count() {
  19. return userRepository.count();
  20. }
  21. public void deleteById(Long userId) {
  22. userRepository.deleteById(userId);
  23. }
  24. }

这是服务类。 该类提供了三种方法来查找所有用户,对用户进行计数以及按 ID 删除用户。

  1. @Service
  2. public class UserService {

在 Spring 中,服务类用@Service注解修饰。

  1. @Autowired
  2. private UserRepository userRepository;

我们注入UserRepository

  1. public List<User> findAll() {
  2. var it = userRepository.findAll();
  3. var users = new ArrayList<User>();
  4. it.forEach(e -> users.add(e));
  5. return users;
  6. }

findAll()方法调用userRepositoryfindAll()方法并检索所有用户。

com/zetcode/repository/UserRepository.java

  1. package com.zetcode.repository;
  2. import com.zetcode.model.User;
  3. import org.springframework.data.repository.CrudRepository;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public interface UserRepository extends CrudRepository<User, Long> {
  7. }

UserRepositoryCrudRepository延伸。 它提供了实体的类型及其主键。

com/zetcode/controller/MyController.java

  1. package com.zetcode.controller;
  2. import com.zetcode.model.User;
  3. import com.zetcode.service.UserService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.DeleteMapping;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import java.util.List;
  10. @RestController
  11. public class MyController {
  12. @Autowired
  13. private UserService userService;
  14. @GetMapping("/users")
  15. public List<User> allUsers() {
  16. return userService.findAll();
  17. }
  18. @GetMapping("/users/count")
  19. public Long count() {
  20. return userService.count();
  21. }
  22. @DeleteMapping("/users/{id}")
  23. public void delete(@PathVariable String id) {
  24. Long userId = Long.parseLong(id);
  25. userService.deleteById(userId);
  26. }
  27. }

控制器类提供了三个请求的映射。 我们可以获取所有用户,计算用户数,并通过其 ID 删除用户。 数据以 JSON 格式返回。

  1. @GetMapping("/users")
  2. public List<User> allUsers() {
  3. return userService.findAll();
  4. }

为了获得所有用户,我们使用@GetMapping注解。

  1. @DeleteMapping("/users/{id}")
  2. public void delete(@PathVariable String id) {
  3. Long userId = Long.parseLong(id);
  4. userService.deleteById(userId);
  5. }

我们使用@DeleteMapping删除特定用户。

com/zetcode/Application.java

  1. package com.zetcode;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
  5. @SpringBootApplication
  6. public class Application extends SpringBootServletInitializer {
  7. public static void main(String[] args) {
  8. SpringApplication.run(Application.class, args);
  9. }
  10. }

Application设置 Spring Boot 应用。

com/zetcode/MyRunner.java

  1. package com.zetcode;
  2. import com.zetcode.model.User;
  3. import com.zetcode.repository.UserRepository;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.CommandLineRunner;
  8. import org.springframework.stereotype.Component;
  9. import javax.transaction.Transactional;
  10. @Component
  11. public class MyRunner implements CommandLineRunner {
  12. private static final Logger logger = LoggerFactory.getLogger(MyRunner.class);
  13. @Autowired
  14. private UserRepository userRepository;
  15. @Override
  16. @Transactional
  17. public void run(String... args) throws Exception {
  18. logger.info("initializing users");
  19. var u1 = new User("Paul", "Smith", "paul.smith@gmail.com");
  20. userRepository.save(u1);
  21. var u2 = new User("Robert", "Black", "rb34@gmail.com");
  22. userRepository.save(u2);
  23. var u3 = new User("John", "Doe", "jdoe@gmail.com");
  24. userRepository.save(u3);
  25. }
  26. }

MyRunner中,我们为应用设置了数据。

  1. var u1 = new User("Paul", "Smith", "paul.smith@gmail.com");
  2. userRepository.save(u1);

我们创建一个新用户,并使用存储库的save()方法将其保存。

  1. $ curl localhost:8080/users
  2. [{"id":1,"firstName":"Paul","lastName":"Smith","email":"paul.smith@gmail.com"},
  3. {"id":2,"firstName":"Robert","lastName":"Black","email":"rb34@gmail.com"},
  4. {"id":3,"firstName":"John","lastName":"Doe","email":"jdoe@gmail.com"}]

我们使用curl工具测试该应用。

在本教程中,我们使用CrudRepository管理了应用数据。 您可能也对相关教程感兴趣: Spring Boot 首次 Web 应用Spring Boot 数据 JPA @Query教程Spring Boot 数据 JPA @NamedQuery教程独立的 Spring 应用Java 教程

列出所有 Spring Boot 教程