当前位置: 首页 > web >正文

【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运行

  1. 在IntelliJ IDEA中打开项目
  2. 右键点击 UserManagementApplication.java
  3. 选择 “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控制台

  1. 打开浏览器访问: http://localhost:8080/h2-console
  2. 连接信息:
    • JDBC URL: jdbc:h2:mem:testdb
    • User Name: sa
    • Password: (留空)

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. 常见问题解决

  1. Lombok不工作:

    • 在IDEA中安装Lombok插件
    • 启用注解处理: Settings → Build → Compiler → Annotation Processors → 勾选Enable annotation processing
  2. 端口冲突:

    • 修改 application.properties:
      server.port=8081
      
  3. 数据库连接问题:

    • 检查H2控制台URL是否正确
    • 确保 spring.datasource.url 配置正确
  4. 依赖下载失败:

    • 尝试使用阿里云镜像,在pom.xml中添加:
      <repositories><repository><id>aliyun</id><url>https://maven.aliyun.com/repository/public</url></repository>
      </repositories>
      

这个指南提供了从零开始创建Spring Boot 3.0项目的完整流程,包含了所有必要的终端命令,你可以直接复制粘贴来创建项目结构和文件。项目使用了现代Spring Boot最佳实践,包括构造函数注入、Lombok简化代码、H2内存数据库等。

http://www.xdnf.cn/news/17808.html

相关文章:

  • ADB 无线调试连接(Windows + WSL 环境)
  • AI一周事件(2025年8月6日-8月12日)
  • 字符串匹配算法
  • 深度学习——03 神经网络(3)-网络优化方法
  • cisco无线WLC flexconnect配置
  • latex中“itemize”
  • 了解 Linux 中的 /usr 目录以及 bin、sbin 和 lib 的演变
  • 肖臻《区块链技术与应用》第十一讲:比特币核心概念重温:一文读懂私钥、交易、挖矿与网络现状
  • 深入解析 AUTOSAR:汽车软件开发的革命性架构
  • Qt中定时器介绍和使用
  • 什么是跨域访问问题,如何解决?
  • 企业高性能web服务器(3)
  • cartographer 后端优化流程
  • 终端安全检测与防御技术
  • MySQL 存储过程终止执行的方法
  • [TryHackMe]Internal(hydra爆破+WordPress主题修改getshell+Chisel内网穿透)
  • MyBatis 缓存与 Spring 事务相关笔记
  • 安路Anlogic FPGA下载器的驱动安装与测试教程
  • 扩展 Chat2File-deepseek V4.0 正式发布:不仅是更新,更是一次“重塑”
  • 实验-vlan实验
  • 8月12号打卡
  • 常用Linux指令:Java/MySQL/Tomcat/Redis/Nginx运维指南
  • MySql——B树和B+树区别(innoDB引擎为什么把B+树作为默认的数据结构)
  • 什么是 DispatcherServlet?
  • GIT使用攻略
  • HTTP 协议详解:深入理解 Header 与 Body!
  • Windows 命令行:打开命令提示符界面
  • 正式出版!华东数交组编《数据资产化实践:路径、技术与平台构建》
  • 小程序排名优化:功能迭代如何助力排名攀升
  • 【电子硬件】EMI中无源晶振的优势