【Spring Boot 3.0 + JDK 17 新手指南:完整用户管理系统】
Spring Boot 3.0 + JDK 17 新手指南:完整用户管理系统
1. 环境准备
1.1 安装必要工具
# 安装JDK 17 (推荐使用Amazon Corretto)
brew install --cask corretto17 # MacOS
# 或使用其他适合你系统的安装方式# 验证安装
java -version
# 应该显示类似: openjdk version "17.0.x"# 安装Maven (如果不用IDEA内置的)
brew install maven # MacOS
# 或
sudo apt install maven # Ubuntu
1.2 创建项目目录结构
# 创建项目目录
mkdir -p user-management/src/main/java/com/example/usermanagement/{controller,model,repository,service}
mkdir -p user-management/src/main/resources
mkdir -p user-management/src/test/java/com/example/usermanagement# 创建Maven项目结构
cd user-management
touch pom.xml
touch src/main/java/com/example/usermanagement/UserManagementApplication.java
touch src/main/resources/application.properties
2. 项目文件创建
2.1 使用终端创建所有文件
# 实体类
cat > src/main/java/com/example/usermanagement/model/User.java << 'EOF'
package com.example.usermanagement.model;import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
@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;@Column(nullable = false)private Integer age;
}
EOF# 仓库接口
cat > src/main/java/com/example/usermanagement/repository/UserRepository.java << 'EOF'
package com.example.usermanagement.repository;import com.example.usermanagement.model.User;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {
}
EOF# 服务层
cat > src/main/java/com/example/usermanagement/service/UserService.java << 'EOF'
package com.example.usermanagement.service;import com.example.usermanagement.model.User;
import com.example.usermanagement.repository.UserRepository;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public List<User> getAllUsers() {return userRepository.findAll();}public User getUserById(Long id) {return userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found with id: " + id));}public User createUser(User user) {return userRepository.save(user);}public User updateUser(Long id, User userDetails) {User user = getUserById(id);user.setName(userDetails.getName());user.setEmail(userDetails.getEmail());user.setAge(userDetails.getAge());return userRepository.save(user);}public void deleteUser(Long id) {User user = getUserById(id);userRepository.delete(user);}
}
EOF# 控制器
cat > src/main/java/com/example/usermanagement/controller/UserController.java << 'EOF'
package com.example.usermanagement.controller;import com.example.usermanagement.model.User;
import com.example.usermanagement.service.UserService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/api/users")
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@GetMappingpublic ResponseEntity<List<User>> getAllUsers() {return ResponseEntity.ok(userService.getAllUsers());}@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Long id) {return ResponseEntity.ok(userService.getUserById(id));}@PostMappingpublic ResponseEntity<User> createUser(@RequestBody User user) {return new ResponseEntity<>(userService.createUser(user), HttpStatus.CREATED);}@PutMapping("/{id}")public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {return ResponseEntity.ok(userService.updateUser(id, user));}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteUser(@PathVariable Long id) {userService.deleteUser(id);return ResponseEntity.noContent().build();}
}
EOF# 主应用类
cat > src/main/java/com/example/usermanagement/UserManagementApplication.java << 'EOF'
package com.example.usermanagement;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class UserManagementApplication {public static void main(String[] args) {SpringApplication.run(UserManagementApplication.class, args);}
}
EOF# 配置文件
cat > src/main/resources/application.properties << 'EOF'
# 使用H2内存数据库
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=# H2控制台
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console# JPA配置
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true# 可选:初始化数据
spring.sql.init.mode=always
EOF# 初始化数据
cat > src/main/resources/data.sql << 'EOF'
INSERT INTO users (name, email, age) VALUES
('张三', 'zhangsan@example.com', 25),
('李四', 'lisi@example.com', 30),
('王五', 'wangwu@example.com', 28);
EOF# pom.xml
cat > pom.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.6</version><relativePath/></parent><groupId>com.example</groupId><artifactId>user-management</artifactId><version>0.0.1-SNAPSHOT</version><name>user-management</name><description>Demo project for Spring Boot</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
EOF
3. 构建和运行项目
3.1 使用Maven构建
# 进入项目目录
cd user-management# 清理并打包项目
mvn clean package# 运行项目
mvn spring-boot:run
3.2 使用IDEA运行
- 在IntelliJ IDEA中打开项目
- 右键点击
UserManagementApplication.java
- 选择 “Run ‘UserManagementApplication’”
4. 项目测试
4.1 使用curl测试API
# 获取所有用户
curl http://localhost:8080/api/users# 获取单个用户
curl http://localhost:8080/api/users/1# 创建用户
curl -X POST -H "Content-Type: application/json" -d '{"name": "赵六","email": "zhaoliu@example.com","age": 35
}' http://localhost:8080/api/users# 更新用户
curl -X PUT -H "Content-Type: application/json" -d '{"name": "张三修改","email": "zhangsan_new@example.com","age": 26
}' http://localhost:8080/api/users/1# 删除用户
curl -X DELETE http://localhost:8080/api/users/1
4.2 访问H2控制台
- 打开浏览器访问:
http://localhost:8080/h2-console
- 连接信息:
- JDBC URL:
jdbc:h2:mem:testdb
- User Name:
sa
- Password: (留空)
- JDBC URL:
5. 项目扩展建议
5.1 添加验证
// 在User实体类中添加验证注解
import jakarta.validation.constraints.*;@Data
@Entity
public class User {// ...@NotBlank(message = "Name is mandatory")private String name;@Email(message = "Email should be valid")@NotBlank(message = "Email is mandatory")private String email;@Min(value = 18, message = "Age should be greater than 18")private Integer age;
}
5.2 添加全局异常处理
// 创建新的exception包和类
package com.example.usermanagement.exception;import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}// 在控制器中替换RuntimeException
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {return ResponseEntity.ok(userService.getUserById(id));
}// 在服务层抛出特定异常
public User getUserById(Long id) {return userRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("User not found with id: " + id));
}
5.3 添加Swagger文档
在pom.xml中添加:
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.0.2</version>
</dependency>
然后访问: http://localhost:8080/swagger-ui.html
6. 常见问题解决
-
Lombok不工作:
- 在IDEA中安装Lombok插件
- 启用注解处理: Settings → Build → Compiler → Annotation Processors → 勾选Enable annotation processing
-
端口冲突:
- 修改
application.properties
:server.port=8081
- 修改
-
数据库连接问题:
- 检查H2控制台URL是否正确
- 确保
spring.datasource.url
配置正确
-
依赖下载失败:
- 尝试使用阿里云镜像,在pom.xml中添加:
<repositories><repository><id>aliyun</id><url>https://maven.aliyun.com/repository/public</url></repository> </repositories>
- 尝试使用阿里云镜像,在pom.xml中添加:
这个指南提供了从零开始创建Spring Boot 3.0项目的完整流程,包含了所有必要的终端命令,你可以直接复制粘贴来创建项目结构和文件。项目使用了现代Spring Boot最佳实践,包括构造函数注入、Lombok简化代码、H2内存数据库等。