ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SpringBoot快速入门:2小时搭建Java后端CRUD项目实战

SpringBoot快速入门:2小时搭建Java后端CRUD项目实战 这次我们来看一个面向 Java 开发新手的 SpringBoot 快速入门指南。对于很多刚接触后端开发的同学来说SpringBoot 是一个绕不开的框架但官方文档庞大网络教程质量参差不齐很容易让人在环境配置、依赖管理和项目结构上浪费大量时间。这篇文章的目标很直接在 2 小时内带你搭建一个可运行、可调试、具备基础 CRUD 功能的 SpringBoot 项目避开那些常见的“坑”。我们将重点关注几个核心问题如何用最少的配置快速启动一个项目如何连接数据库并实现数据操作如何组织代码结构才更规范以及如何将项目打包部署整个过程会基于当前主流的开发环境IDEA Maven MySQL和 SpringBoot 2.7.x 版本进行确保每一步都可执行、可验证。无论你是完全零基础的小白还是对 SpringBoot 一知半解想系统梳理的开发者这篇内容都能帮你建立清晰的认知和动手能力。1. 核心能力速览SpringBoot 入门究竟要掌握什么在深入代码之前我们先快速了解通过本次实践你将获得的核心能力。这能帮你明确学习路径知道重点在哪里。能力项说明与目标项目创建与启动掌握使用 Spring InitializrIDEA 内置快速生成项目骨架并能在本地成功启动内置 Tomcat 服务器。基础依赖管理理解pom.xml中核心依赖如 Web、JPA、MySQL Driver的作用并能根据需求添加。配置管理学会使用application.properties或application.yml文件配置服务器端口、数据库连接等。MVC 结构实现实践创建 Controller、Service、Repository 分层结构并实现一个完整的 RESTful API。数据库集成使用 Spring Data JPA 连接 MySQL定义实体Entity并实现基础的增删改查CRUD。项目打包与运行学会将项目打包成可独立运行的 JAR 文件并通过命令行启动验证。常见问题规避提前了解并避开端口冲突、依赖版本不兼容、配置错误等高频问题。2. 适用场景与使用边界这个快速入门指南主要适用于以下场景和人群Java 后端初学者已经掌握 Java 基础语法希望开始学习企业级框架。转行或培训学员需要快速构建一个可展示的 SpringBoot 项目原型。前端或全栈开发者需要了解后端 API 是如何构建和提供的。需要快速验证想法的开发者希望用最短时间搭建一个具备数据持久化能力的 Web 服务后端。使用边界与注意事项非生产级教程本文侧重于入门和原理理解代码示例未考虑完整的异常处理、事务管理、安全认证Spring Security、缓存优化等生产级特性。用于正式项目前需进一步学习。技术栈限定演示基于 SpringBoot 2.7.x Maven MySQL JPA/Hibernate。如果你使用 Gradle、PostgreSQL 或 MyBatis核心逻辑相通但具体配置和依赖需要调整。环境依赖你需要准备好 JDK 8、Maven 3.6、MySQL 5.7 和 IntelliJ IDEA社区版即可环境。文中会给出检查方法。合法合规所有代码均为教学示例。在实际开发中处理用户数据必须遵守《网络安全法》、《个人信息保护法》等相关法律法规做好数据脱敏、权限校验和防注入攻击。3. 环境准备与前置检查开始编码前请确保你的开发环境已就绪。这是后续所有步骤的基础很多启动失败问题都源于环境配置不当。3.1 基础软件清单与验证请依次打开终端Windows 的 CMD 或 PowerShellMac/Linux 的 Terminal执行以下命令进行验证# 1. 检查 Java 版本 (需 JDK 8 或 11, 推荐 11) java -version # 预期输出类似openjdk version 11.0.xx ... # 2. 检查 Maven 版本 (需 3.6) mvn -v # 预期输出包含Apache Maven 3.8.x ... # 3. 检查 MySQL 是否安装并可连接 # 首先尝试登录 MySQL请替换你的密码 mysql -u root -p # 输入密码后应进入 MySQL 命令行。执行以下 SQL 创建一个用于本教程的数据库 CREATE DATABASE IF NOT EXISTS springboot_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE springboot_demo; # 执行 exit; 退出 MySQL。3.2 IDE 准备IntelliJ IDEA使用 IntelliJ IDEA社区版免费它提供了对 Spring Boot 最好的集成支持。下载安装从 JetBrains 官网下载并安装。重要插件确保已安装 “Spring Boot Assistant” 插件通常社区版已内置。可以在File - Settings - Plugins中搜索确认。3.3 可能遇到的“坑”与解决方案JAVA_HOME 未设置如果java -version报错需要配置系统环境变量JAVA_HOME指向你的 JDK 安装目录并将%JAVA_HOME%\bin添加到Path中。Maven 仓库慢国内访问 Maven 中央仓库可能很慢。建议配置阿里云镜像。找到 Maven 安装目录下的conf/settings.xml文件在mirrors标签内添加mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirrorMySQL 连接失败确保 MySQL 服务已启动并记牢 root 用户的密码。如果使用非 root 用户请确保该用户有创建数据库和表的权限。4. 创建第一个 SpringBoot 项目我们将使用 IDEA 内置的 Spring Initializr这是最快捷、最标准的方式。打开 IDEA创建新项目选择File - New - Project。选择 Spring InitializrName:demo(项目名)Location: 选择你的项目存放路径Type: MavenLanguage: JavaGroup:com.example(公司域名倒写按需修改)Artifact:demo(和 Name 一致)Package name: 会自动生成如com.example.demoPackaging:Jar(推荐)Java Version: 选择你安装的版本如11选择依赖这是关键步骤我们为本次入门选择最必要的依赖。Spring Web: 用于构建 Web 应用包含 RESTful API 支持。Spring Data JPA: 用于简化数据库操作。MySQL Driver: MySQL 数据库连接驱动。可选Lombok: 用于简化 Java Bean 的 Getter/Setter 代码强烈推荐。可以在搜索框输入并添加。 点击Next然后Finish。IDEA 会自动下载初始依赖需要等待片刻。5. 项目结构解析与基础配置项目创建成功后你会看到如下标准结构demo ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ └── demo │ │ │ └── DemoApplication.java // 项目主启动类 │ │ └── resources │ │ ├── application.properties // 配置文件我们用它 │ │ └── static templates // 静态资源和模板文件目录 │ └── test // 测试目录 └── pom.xml // Maven 项目对象模型管理依赖5.1 配置数据库连接打开src/main/resources/application.properties文件清空内容添加以下配置# 服务器端口 server.port8080 # 数据库连接配置 spring.datasource.urljdbc:mysql://localhost:3306/springboot_demo?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.passwordyour_password_here # 替换为你的 MySQL 密码 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver # JPA 配置 spring.jpa.database-platformorg.hibernate.dialect.MySQL8Dialect spring.jpa.hibernate.ddl-autoupdate # 启动时根据实体更新表结构生产环境慎用 spring.jpa.show-sqltrue # 在控制台打印 SQL 语句方便调试 spring.jpa.properties.hibernate.format_sqltrue # 格式化打印的 SQL关键配置解释spring.datasource.url: 指定了连接的数据库我们之前创建的springboot_demo。spring.jpa.hibernate.ddl-autoupdate: 这是一个非常方便的配置Hibernate 会在应用启动时检查实体类并自动创建或更新数据库表结构。注意在生产环境中建议设置为none或validate并使用 Flyway/Liquibase 等工具进行数据库版本管理。5.2 启动项目验证基础环境找到src/main/java/com/example/demo/DemoApplication.java文件其内容如下package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }直接运行这个类的main方法。如果一切顺利你将在 IDEA 的Run窗口看到类似以下的日志... Tomcat initialized with port(s): 8080 (http) ... Starting DemoApplication using Java 11 on ... ... Started DemoApplication in 5.234 seconds (JVM running for 6.567)看到Started DemoApplication就说明 SpringBoot 应用启动成功了此时打开浏览器访问http://localhost:8080你会看到一个 Whitelabel Error Page默认错误页这是因为我们还没有编写任何接口。这恰恰说明服务器正在运行。第一个“坑”与排查启动失败端口 8080 被占用日志会明确提示。解决方案1) 关闭占用 8080 端口的程序2) 修改application.properties中的server.port8081或其他端口。数据库连接失败检查spring.datasource.password是否正确MySQL 服务是否启动数据库springboot_demo是否存在。6. 功能实现构建一个用户管理 API现在我们来实现一个完整的、包含 Controller-Service-Repository 三层架构的用户管理模块实现基础的 CRUD。6.1 创建实体类 (Entity)在com.example.demo包下新建entity包并创建User.java类。package com.example.demo.entity; import lombok.Data; import javax.persistence.*; import java.time.LocalDateTime; Entity Table(name user) // 指定对应数据库表名 Data // Lombok 注解自动生成 getter, setter, toString 等方法 public class User { Id GeneratedValue(strategy GenerationType.IDENTITY) // 主键自增 private Long id; Column(nullable false, unique true) // 非空且唯一 private String username; Column(nullable false) private String password; private String email; Column(name create_time) // 指定数据库字段名 private LocalDateTime createTime; PrePersist // 在持久化插入前自动执行 protected void onCreate() { createTime LocalDateTime.now(); } }说明使用了Data(Lombok) 注解请确保在pom.xml中已添加 Lombok 依赖并且 IDEA 安装了 Lombok 插件安装后重启 IDEA。6.2 创建数据访问层 (Repository)在com.example.demo包下新建repository包并创建UserRepository.java接口。package com.example.demo.repository; import com.example.demo.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; Repository public interface UserRepository extends JpaRepositoryUser, Long { // 根据用户名查询用户 User findByUsername(String username); // 根据邮箱查询用户 User findByEmail(String email); }说明JpaRepositoryUser, Long提供了大量开箱即用的方法如save(),findAll(),findById(),deleteById()等。我们自定义的findByUsername方法Spring Data JPA 会根据方法名自动实现其查询逻辑无需编写 SQL。6.3 创建业务逻辑层 (Service)在com.example.demo包下新建service包并创建UserService.java接口及其实现类。接口UserService.java:package com.example.demo.service; import com.example.demo.entity.User; import java.util.List; public interface UserService { User createUser(User user); User getUserById(Long id); ListUser getAllUsers(); User updateUser(Long id, User userDetails); void deleteUser(Long id); User getUserByUsername(String username); }实现类UserServiceImpl.java:package com.example.demo.service.impl; import com.example.demo.entity.User; import com.example.demo.repository.UserRepository; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; Service public class UserServiceImpl implements UserService { Autowired private UserRepository userRepository; Override public User createUser(User user) { // 简单校验用户名不能重复 if (userRepository.findByUsername(user.getUsername()) ! null) { throw new RuntimeException(用户名已存在); } return userRepository.save(user); } Override public User getUserById(Long id) { OptionalUser user userRepository.findById(id); return user.orElseThrow(() - new RuntimeException(用户未找到ID: id)); } Override public ListUser getAllUsers() { return userRepository.findAll(); } Override public User updateUser(Long id, User userDetails) { User user getUserById(id); // 复用查询确保用户存在 user.setUsername(userDetails.getUsername()); user.setEmail(userDetails.getEmail()); // 注意实际项目中密码更新需要单独处理加密 return userRepository.save(user); } Override public void deleteUser(Long id) { User user getUserById(id); userRepository.delete(user); } Override public User getUserByUsername(String username) { return userRepository.findByUsername(username); } }6.4 创建控制层 (Controller)在com.example.demo包下新建controller包并创建UserController.java类。package com.example.demo.controller; import com.example.demo.entity.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; RestController RequestMapping(/api/users) // 所有接口路径以 /api/users 开头 public class UserController { Autowired private UserService userService; // 创建用户 PostMapping public User createUser(RequestBody User user) { return userService.createUser(user); } // 获取所有用户 GetMapping public ListUser getAllUsers() { return userService.getAllUsers(); } // 根据ID获取用户 GetMapping(/{id}) public User getUserById(PathVariable Long id) { return userService.getUserById(id); } // 更新用户 PutMapping(/{id}) public User updateUser(PathVariable Long id, RequestBody User userDetails) { return userService.updateUser(id, userDetails); } // 删除用户 DeleteMapping(/{id}) public String deleteUser(PathVariable Long id) { userService.deleteUser(id); return 用户删除成功ID: id; } }7. 功能测试与效果验证现在重启你的 SpringBoot 应用因为新增了类。我们将使用 Postman 或任何 HTTP 客户端如 curl来测试 API。7.1 测试准备启动应用并观察日志启动后观察控制台日志。如果看到类似以下的 SQL 语句说明 JPA 已经自动创建了user表这是ddl-autoupdate在起作用。Hibernate: create table user (id bigint not null auto_increment, create_time datetime(6), email varchar(255), password varchar(255) not null, username varchar(255) not null, primary key (id)) engineInnoDB Hibernate: alter table user add constraint UK_sb8bbouer5wak8vyiiy4pf2bx unique (username)7.2 使用 Postman 测试 CRUD API1. 创建用户 (POSThttp://localhost:8080/api/users)方法: POSTBody (raw JSON):{ username: testUser, password: 123456, email: testexample.com }预期响应返回创建成功的用户对象包含自动生成的id和createTime。验证检查数据库user表应有一条新记录。2. 获取所有用户 (GEThttp://localhost:8080/api/users)方法: GET预期响应返回一个包含所有用户的 JSON 数组。3. 根据ID获取用户 (GEThttp://localhost:8080/api/users/1)方法: GET预期响应返回 ID 为 1 的用户信息。4. 更新用户 (PUThttp://localhost:8080/api/users/1)方法: PUTBody (raw JSON):{ username: updatedUser, email: updatedexample.com }预期响应返回更新后的用户信息。注意我们没有传password所以密码保持不变。5. 删除用户 (DELETEhttp://localhost:8080/api/users/1)方法: DELETE预期响应返回字符串用户删除成功ID: 1。再次执行 GET 查询该 ID应返回错误。7.3 验证数据库可以直接在 MySQL 命令行或客户端工具中查询验证数据是否与 API 操作一致。USE springboot_demo; SELECT * FROM user;8. 项目打包与独立运行SpringBoot 的一个巨大优势是可以打包成包含所有依赖的独立 JAR 文件无需额外安装 Tomcat。8.1 使用 Maven 打包在 IDEA 右侧的 Maven 工具栏中找到你的项目 (demo)展开Lifecycle双击package。或者直接在项目根目录pom.xml所在目录下执行命令mvn clean package -DskipTests-DskipTests参数表示跳过测试加快打包速度。打包成功后在target目录下会生成demo-0.0.1-SNAPSHOT.jar文件。8.2 运行 JAR 文件打开终端进入target目录执行java -jar demo-0.0.1-SNAPSHOT.jar你会看到和 IDEA 中启动时类似的日志。此时SpringBoot 应用已经作为一个独立的进程运行起来了。你可以再次使用 Postman 测试 API功能应该完全一致。关键点这种方式部署时应用的配置如数据库连接仍然来自打包在 JAR 内的application.properties。生产环境中通常通过外部配置文件如java -jar app.jar --spring.config.locationfile:/path/to/application-prod.properties或环境变量来覆盖配置。9. 常见问题与排查方法在入门过程中你很可能遇到以下问题。这里提供一个快速排查指南。问题现象可能原因排查方式解决方案启动失败APPLICATION FAILED TO START1. 数据库连接失败。2. 端口被占用。3. 依赖冲突或缺失。1. 检查控制台错误日志通常有详细描述。2. 检查application.properties中的数据库配置。3. 运行mvn clean compile检查依赖。1. 确认 MySQL 服务运行密码正确。2. 修改server.port或关闭占用端口的进程。3. 在 IDEA 中右键pom.xml-Maven - Reload project。Autowired注入失败字段为null1. 注入的类没有被 Spring 管理缺少Service,Repository等注解。2. 在非 Spring 管理的类如普通new出来的对象中使用Autowired。1. 检查被注入的类是否有Component或其派生注解。2. 检查当前类是否被 Spring 管理如RestController。1. 为需要注入的类添加正确的注解。2. 确保通过 Spring 容器获取 Bean。JPA 实体类字段更新但数据库表未更新ddl-auto设置为update但某些更改如字段重命名Hibernate 可能无法安全处理。查看启动日志是否有alter table语句。1. 对于重大变更考虑手动修改数据库表。2. 使用数据库版本管理工具如 Flyway。3. 设置ddl-autovalidate仅验证手动执行 DDL。打包后运行 JAR 报No main manifest attributepom.xml中未正确配置 Spring Boot Maven 插件。检查pom.xml的build部分。确保有plugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/pluginAPI 返回 4041. 请求路径错误。2. Controller 未被扫描到主启动类不在根包下。1. 核对RequestMapping和GetMapping等注解的路径。2. 确认DemoApplication所在的包是顶层包其他类在其子包下。1. 使用 Postman 等工具精确构造请求。2. 如果结构特殊在主启动类添加ComponentScan注解指定扫描路径。Lombok 注解不生效IDEA 未启用 Lombok 插件或注解处理。1. 检查 Plugins 中 Lombok 是否安装并启用。2. 检查设置Settings - Build - Compiler - Annotation Processors确保Enable annotation processing已勾选。1. 安装/启用插件并重启 IDEA。2. 勾选注解处理选项。10. 最佳实践与下一步学习建议恭喜你完成了一个完整的 SpringBoot 入门项目为了让你走得更远这里有一些建议代码分层清晰坚持 Controller - Service - Repository 的分层模式。Controller 只负责参数校验和响应封装业务逻辑放在 Service数据库操作放在 Repository。使用统一响应体目前 API 直接返回实体或字符串。生产项目中应封装一个统一的响应类如ResultT包含状态码、消息和数据便于前端处理。添加全局异常处理使用ControllerAdvice和ExceptionHandler来集中处理业务异常如“用户已存在”和系统异常避免将堆栈信息直接暴露给客户端。引入参数校验在接收参数的 DTO数据传输对象类字段上使用NotNull,Size等注解并在 Controller 方法参数前加Valid注解实现自动校验。分离配置使用application-dev.properties,application-prod.properties等多环境配置文件通过spring.profiles.active指定激活的环境。学习连接其他数据库尝试将 MySQL 换成 PostgreSQL 或 SQLite只需修改依赖和连接配置体会 SpringBoot 的“约定大于配置”。探索更多 starter尝试集成spring-boot-starter-security安全、spring-boot-starter-cache缓存、spring-boot-starter-data-redisRedis等快速为项目添加新能力。阅读官方文档当你有了实践经验后再去看 Spring Boot 官方文档 会理解得更深刻。重点关注 “Getting Started” 和 “How-to Guides” 部分。这个入门项目就像你搭建的一个“脚手架”它已经包含了 SpringBoot 最核心的要素自动配置、起步依赖、嵌入式容器和 Production-Ready 特性。接下来你可以基于这个脚手架不断添加新的功能模块在实践中深化理解。遇到问题多查看日志善用搜索引擎和 Spring 的官方社区你的开发效率会越来越高。
返回列表