文档
Java Spring Boot — 用户管理 CRUD API
目标
使用 Spring Boot 3 + Spring Data JPA + H2 构建完整的用户管理 REST API。
完整代码
//─── User.java (Entity) ───
package com.example.demo.entity;
import jakarta.persistence.*;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false, unique = true)
private String email;
public User() {}
public User(String name, String email) {
this.name = name;
this.email = email;
}
// getters & setters ...
public Long getId() { return id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
//─── UserRepository.java ───
package com.example.demo.repository;
import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
//─── UserController.java ───
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserRepository repo;
public UserController(UserRepository repo) {
this.repo = repo;
}
@GetMapping
public List<User> getAll() {
return repo.findAll();
}
@GetMapping("/{id}")
public ResponseEntity<User> getById(@PathVariable Long id) {
return repo.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PostMapping
public ResponseEntity<User> create(@RequestBody User user) {
User saved = repo.save(user);
return ResponseEntity
.created(java.net.URI.create("/api/users/" + saved.getId()))
.body(saved);
}
@PutMapping("/{id}")
public ResponseEntity<User> update(@PathVariable Long id, @RequestBody User user) {
return repo.findById(id).map(existing -> {
existing.setName(user.getName());
existing.setEmail(user.getEmail());
return ResponseEntity.ok(repo.save(existing));
}).orElse(ResponseEntity.notFound().build());
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> delete(@PathVariable Long id) {
if (!repo.existsById(id)) return ResponseEntity.notFound().build();
repo.deleteById(id);
return ResponseEntity.noContent().build();
}
}
# application.properties
spring.datasource.url=jdbc:h2:mem:userdb
spring.h2.console.enabled=true
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
<!-- pom.xml 附加依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
测试
curl http://localhost:8080/api/users
curl -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" \
-d '{"name":"Alice","email":"alice@example.com"}'
curl -X PUT http://localhost:8080/api/users/1 \
-H "Content-Type: application/json" \
-d '{"name":"Alice Updated","email":"alice@example.com"}'
curl -X DELETE http://localhost:8080/api/users/1
要点说明
JpaRepository<User, Long>自动提供findAll()、findById()、save()、deleteById()等方法- 构造函数注入优于
@Autowired字段注入 - H2 内存数据库适合开发测试,生产需切换 MySQL/PostgreSQL
ResponseEntity提供完整的 HTTP 响应控制(状态码、头、体)