news 2026/9/6 3:45:25

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot快速入门:2小时搭建Java后端CRUD项目实战

这次我们来看一个面向 Java 开发新手的 SpringBoot 快速入门指南。对于很多刚接触后端开发的同学来说,SpringBoot 是一个绕不开的框架,但官方文档庞大,网络教程质量参差不齐,很容易让人在环境配置、依赖管理和项目结构上浪费大量时间。这篇文章的目标很直接:在 2 小时内,带你搭建一个可运行、可调试、具备基础 CRUD 功能的 SpringBoot 项目,避开那些常见的“坑”。

我们将重点关注几个核心问题:如何用最少的配置快速启动一个项目?如何连接数据库并实现数据操作?如何组织代码结构才更规范?以及,如何将项目打包部署?整个过程会基于当前主流的开发环境(IDEA + Maven + MySQL)和 SpringBoot 2.7.x 版本进行,确保每一步都可执行、可验证。无论你是完全零基础的小白,还是对 SpringBoot 一知半解想系统梳理的开发者,这篇内容都能帮你建立清晰的认知和动手能力。

1. 核心能力速览:SpringBoot 入门究竟要掌握什么?

在深入代码之前,我们先快速了解通过本次实践你将获得的核心能力。这能帮你明确学习路径,知道重点在哪里。

能力项说明与目标
项目创建与启动掌握使用 Spring Initializr(IDEA 内置)快速生成项目骨架,并能在本地成功启动内置 Tomcat 服务器。
基础依赖管理理解pom.xml中核心依赖(如 Web、JPA、MySQL Driver)的作用,并能根据需求添加。
配置管理学会使用application.propertiesapplication.yml文件配置服务器端口、数据库连接等。
MVC 结构实现实践创建 Controller、Service、Repository 分层结构,并实现一个完整的 RESTful API。
数据库集成使用 Spring Data JPA 连接 MySQL,定义实体(Entity)并实现基础的增删改查(CRUD)。
项目打包与运行学会将项目打包成可独立运行的 JAR 文件,并通过命令行启动验证。
常见问题规避提前了解并避开端口冲突、依赖版本不兼容、配置错误等高频问题。

2. 适用场景与使用边界

这个快速入门指南主要适用于以下场景和人群:

  • Java 后端初学者:已经掌握 Java 基础语法,希望开始学习企业级框架。
  • 转行或培训学员:需要快速构建一个可展示的 SpringBoot 项目原型。
  • 前端或全栈开发者:需要了解后端 API 是如何构建和提供的。
  • 需要快速验证想法的开发者:希望用最短时间搭建一个具备数据持久化能力的 Web 服务后端。

使用边界与注意事项:

  1. 非生产级教程:本文侧重于入门和原理理解,代码示例未考虑完整的异常处理、事务管理、安全认证(Spring Security)、缓存优化等生产级特性。用于正式项目前需进一步学习。
  2. 技术栈限定:演示基于 SpringBoot 2.7.x + Maven + MySQL + JPA/Hibernate。如果你使用 Gradle、PostgreSQL 或 MyBatis,核心逻辑相通,但具体配置和依赖需要调整。
  3. 环境依赖:你需要准备好 JDK 8+、Maven 3.6+、MySQL 5.7+ 和 IntelliJ IDEA(社区版即可)环境。文中会给出检查方法。
  4. 合法合规:所有代码均为教学示例。在实际开发中,处理用户数据必须遵守《网络安全法》、《个人信息保护法》等相关法律法规,做好数据脱敏、权限校验和防注入攻击。

3. 环境准备与前置检查

开始编码前,请确保你的开发环境已就绪。这是后续所有步骤的基础,很多启动失败问题都源于环境配置不当。

3.1 基础软件清单与验证

请依次打开终端(Windows 的 CMD 或 PowerShell,Mac/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 最好的集成支持。

  1. 下载安装:从 JetBrains 官网下载并安装。
  2. 重要插件:确保已安装 “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> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>
  • MySQL 连接失败:确保 MySQL 服务已启动,并记牢 root 用户的密码。如果使用非 root 用户,请确保该用户有创建数据库和表的权限。

4. 创建第一个 SpringBoot 项目

我们将使用 IDEA 内置的 Spring Initializr,这是最快捷、最标准的方式。

  1. 打开 IDEA,创建新项目:选择File -> New -> Project
  2. 选择 Spring Initializr
    • Name:demo(项目名)
    • Location: 选择你的项目存放路径
    • Type: Maven
    • Language: Java
    • Group:com.example(公司域名倒写,按需修改)
    • Artifact:demo(和 Name 一致)
    • Package name: 会自动生成,如com.example.demo
    • Packaging:Jar(推荐)
    • Java Version: 选择你安装的版本,如11
  3. 选择依赖:这是关键步骤,我们为本次入门选择最必要的依赖。
    • 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.port=8080 # 数据库连接配置 spring.datasource.url=jdbc:mysql://localhost:3306/springboot_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=your_password_here # 替换为你的 MySQL 密码 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # JPA 配置 spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect spring.jpa.hibernate.ddl-auto=update # 启动时根据实体更新表结构,生产环境慎用 spring.jpa.show-sql=true # 在控制台打印 SQL 语句,方便调试 spring.jpa.properties.hibernate.format_sql=true # 格式化打印的 SQL

关键配置解释

  • spring.datasource.url: 指定了连接的数据库(我们之前创建的springboot_demo)。
  • spring.jpa.hibernate.ddl-auto=update: 这是一个非常方便的配置,Hibernate 会在应用启动时检查实体类,并自动创建或更新数据库表结构。注意:在生产环境中,建议设置为nonevalidate,并使用 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.port=8081(或其他端口)。
  • 数据库连接失败:检查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 JpaRepository<User, Long> { // 根据用户名查询用户 User findByUsername(String username); // 根据邮箱查询用户 User findByEmail(String email); }

说明JpaRepository<User, 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); List<User> 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) { Optional<User> user = userRepository.findById(id); return user.orElseThrow(() -> new RuntimeException("用户未找到,ID: " + id)); } @Override public List<User> 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 List<User> 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-auto=update在起作用。

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)) engine=InnoDB Hibernate: alter table user add constraint UK_sb8bbouer5wak8vyiiy4pf2bx unique (username)

7.2 使用 Postman 测试 CRUD API

1. 创建用户 (POSThttp://localhost:8080/api/users)

  • 方法: POST
  • Body (raw JSON):
    { "username": "testUser", "password": "123456", "email": "test@example.com" }
  • 预期响应:返回创建成功的用户对象,包含自动生成的idcreateTime
  • 验证:检查数据库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)

  • 方法: PUT
  • Body (raw JSON):
    { "username": "updatedUser", "email": "updated@example.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.location=file:/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-auto=validate仅验证,手动执行 DDL。
打包后运行 JAR 报No main manifest attributepom.xml中未正确配置 Spring Boot Maven 插件。检查pom.xml<build>部分。确保有:<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin>
API 返回 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 入门项目!为了让你走得更远,这里有一些建议:

  1. 代码分层清晰:坚持 Controller -> Service -> Repository 的分层模式。Controller 只负责参数校验和响应封装,业务逻辑放在 Service,数据库操作放在 Repository。
  2. 使用统一响应体:目前 API 直接返回实体或字符串。生产项目中,应封装一个统一的响应类(如Result<T>),包含状态码、消息和数据,便于前端处理。
  3. 添加全局异常处理:使用@ControllerAdvice@ExceptionHandler来集中处理业务异常(如“用户已存在”)和系统异常,避免将堆栈信息直接暴露给客户端。
  4. 引入参数校验:在接收参数的 DTO(数据传输对象)类字段上使用@NotNull,@Size等注解,并在 Controller 方法参数前加@Valid注解,实现自动校验。
  5. 分离配置:使用application-dev.properties,application-prod.properties等多环境配置文件,通过spring.profiles.active指定激活的环境。
  6. 学习连接其他数据库:尝试将 MySQL 换成 PostgreSQL 或 SQLite,只需修改依赖和连接配置,体会 SpringBoot 的“约定大于配置”。
  7. 探索更多 starter:尝试集成spring-boot-starter-security(安全)、spring-boot-starter-cache(缓存)、spring-boot-starter-data-redis(Redis)等,快速为项目添加新能力。
  8. 阅读官方文档:当你有了实践经验后,再去看 Spring Boot 官方文档 ,会理解得更深刻。重点关注 “Getting Started” 和 “How-to Guides” 部分。

这个入门项目就像你搭建的一个“脚手架”,它已经包含了 SpringBoot 最核心的要素:自动配置、起步依赖、嵌入式容器和 Production-Ready 特性。接下来,你可以基于这个脚手架,不断添加新的功能模块,在实践中深化理解。遇到问题,多查看日志,善用搜索引擎和 Spring 的官方社区,你的开发效率会越来越高。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 8:37:22

大模型输出转Word格式全攻略:从Markdown到docx的自动化方案

我相信你一定遇到过这个场景&#xff1a;让大模型写一份周报、技术方案或者需求文档&#xff0c;生成内容在网页端看整整齐齐&#xff0c;标题是标题&#xff0c;代码块是代码块&#xff0c;表格也有模有样。结果复制到 Word 里&#xff0c;标题层级全没了&#xff0c;列表缩进…

作者头像 李华
网站建设 2026/9/6 3:45:00

基于TensorFlow和CNN的花朵识别系统:从训练到部署全流程实战

简介&#xff1a;花朵识别系统是一套基于Python与TensorFlow实现的深度学习图像分类项目&#xff0c;面向希望入门卷积神经网络&#xff08;CNN&#xff09;的开发者与机器学习爱好者。项目通过TensorFlow搭建CNN模型&#xff0c;可对多种花朵图片进行自动化识别与分类&#xf…

作者头像 李华
网站建设 2026/9/4 8:41:35

Unity古风场景搭建:Asian Dynasty Environment资源包导入与性能优化实战

最近在整理 Unity 场景资源时发现了这个挺适合中国风项目起步的素材包&#xff1a;Asian Dynasty Environment。它瞄准的是东方古风、王朝都城、江湖客栈这类场景需求&#xff0c;适合做独立游戏场景原型、数字孪生沙盘、古风动画短片甚至虚拟展厅。这次我们直接聊它的核心能力…

作者头像 李华
网站建设 2026/9/4 8:24:06

基于.NET的智能试卷生成系统:组卷算法与Word导出实践

简介&#xff1a;这是一份基于.NET平台、使用C#语言开发的试卷生成系统源码&#xff0c;适用于需要快速搭建在线题库与自动组卷功能的教育类项目或课程设计场景。系统支持人工选题与随机选题两种组卷模式&#xff1a;人工模式下可按题型勾选已有试题并设定分值&#xff0c;随机…

作者头像 李华
网站建设 2026/9/4 15:41:54

LaTeX技术写作指南:从入门到精通,高效排版数学公式与算法文档

这类标题看起来像社区里某个具体用户或内容的描述&#xff0c;而不是一个技术项目或工具。它更像是一个带有网络流行语标签的、指向某个特定创作者或现象的称呼。 对于这类非标准技术主题&#xff0c;直接写成技术博文会很奇怪。更合理的做法是把它当作一个引子&#xff0c;去…

作者头像 李华