SpringBoot快速入门实战:一天构建CRUD应用与核心配置详解
1. 项目概述:为什么“一天入门SpringBoot”是可行的?
如果你是一名Java开发者,或者正打算从其他语言转向后端开发,听到“SpringBoot”这个名字大概率不会陌生。它几乎是现代Java企业级开发的代名词,但与之相伴的,往往是“庞大”、“复杂”、“配置繁琐”的刻板印象。很多新手面对Spring官方文档那浩瀚如海的内容,往往在第一步“环境搭建”上就耗尽了热情。所以,当看到“一天快速入门”这样的标题时,你的第一反应可能是怀疑:这真的可能吗?是不是又一篇标题党水文?
我可以很负责任地告诉你,不仅可能,而且这是最高效的学习路径。这里的“一天入门”,指的并非精通SpringBoot的所有细节——那需要经年累月的项目锤炼。而是指在一天(约6-8小时的集中学习)内,建立起对SpringBoot核心思想的正确认知,并亲手完成一个具备基础增删改查(CRUD)功能的可运行项目。这个目标非常具体,也极具价值。它能帮你快速跨越“从0到1”的心理和技术门槛,让你看到成果,建立信心,而不是迷失在抽象的概念海洋里。
SpringBoot的设计哲学就是“约定大于配置”和“快速启动”。它通过一系列“Starter”依赖和自动配置(Auto-Configuration),将传统Spring项目中那些令人头疼的XML配置、繁琐的依赖管理打包成了“开箱即用”的体验。我们学习的核心,就是理解并利用好这套机制。本系列文章将采用“肝货”模式,即高密度、直奔主题、以动手实现驱动理解。我不会过多纠缠于历史渊源和过于底层的原理,而是聚焦在“如何用最短的时间做出一个能跑起来的东西”。当你看到浏览器返回第一个“Hello World”,当你的数据成功写入数据库又被查询出来时,你对SpringBoot的理解将远比读十篇概念文章要深刻得多。
注意:本教程假设你已有基本的Java语法基础,熟悉Maven或Gradle构建工具的基本使用(知道
pom.xml是干什么的即可)。如果你的环境还未就绪,请先准备好JDK 8或11、一个IDE(推荐IntelliJ IDEA社区版)和Maven。
2. 环境准备与项目初始化:你的第一个SpringBoot应用
万事开头难,但SpringBoot让开头变得异常简单。我们抛弃一切复杂的配置,从最简单的开始。
2.1 使用Spring Initializr:三分钟生成项目骨架
过去创建一个Spring项目,需要手动组合各种jar包,编写web.xml、spring-context.xml等一堆配置文件。现在,我们只需访问 start.spring.io 这个官方提供的项目生成器。
访问网站并配置:打开浏览器,进入start.spring.io。你会看到一个简洁的表单。
- Project: 选择
Maven Project(如果你更熟悉Gradle,也可以选它,本系列以Maven为例)。 - Language: 选择
Java。 - Spring Boot: 选择当前推荐的稳定版本(如
3.2.x)。版本无需追求最新,稳定是关键。 - Project Metadata:
Group: 通常填写公司或组织域名的倒序,例如com.example。Artifact: 你的项目名称,例如demo。Name: 可以与Artifact一致,demo。Description: 可填写Demo project for Spring Boot。Package name: 会自动根据Group和Artifact生成,com.example.demo。
- Packaging: 选择
Jar。这是SpringBoot推荐的方式,它允许你将应用打包成一个包含所有依赖的可执行JAR文件,用java -jar命令就能运行,无需额外部署到Tomcat等外部容器。 - Java: 选择你本地安装的JDK版本,如
17或11。
- Project: 选择
添加依赖:这是最关键的一步,决定了你的项目拥有哪些能力。在
Dependencies输入框点击“ADD DEPENDENCIES”,我们首批添加两个:Spring Web: 这是构建Web应用(包括RESTful API)的核心starter。它包含了内嵌的Tomcat服务器、Spring MVC等。Lombok: 这是一个Java库,通过注解自动生成getter、setter、构造函数等样板代码,能极大简化我们的实体类代码。强烈建议添加,它能让你更专注于业务逻辑。
生成并下载:点击页面底部的
GENERATE按钮,浏览器会自动下载一个以Artifact命名的ZIP文件(如demo.zip)。导入IDE:解压ZIP文件,用IntelliJ IDEA打开该文件夹。IDEA会自动识别为Maven项目并开始下载依赖。首次导入可能会花费几分钟时间下载所有jar包,请保持网络通畅。
至此,一个标准的SpringBoot项目骨架就创建完毕了。你可以查看项目根目录下的pom.xml文件,你会发现SpringBoot父工程、我们添加的spring-boot-starter-web和lombok依赖都已经配置好了。src/main/java目录下已经有一个以你包名命名的目录和主应用类DemoApplication.java。
实操心得:很多教程会教你用IDE插件来创建Spring Initializr项目,这当然可以。但我更推荐直接访问官网页面,因为它能让你最直观地看到所有可选项和生成的原始项目结构,对理解项目构成更有帮助。依赖不要一次性加太多,按需添加,避免引入不必要的复杂度。
2.2 解析项目核心结构:理解SpringBoot的约定
生成的项目结构非常清晰,我们快速过一下关键部分:
demo/ ├── pom.xml # Maven项目对象模型,管理依赖和构建 ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── demo/ │ │ │ ├── DemoApplication.java # 应用主入口 │ │ └── resources/ │ │ ├── application.properties # 应用配置文件(空) │ │ ├── static/ # 存放静态资源(CSS, JS, 图片) │ │ └── templates/ # 存放模板文件(如Thymeleaf, Freemarker) │ └── test/ # 单元测试目录 └── target/ # Maven编译输出目录(首次生成时不存在)DemoApplication.java: 这是程序的入口。关键在于@SpringBootApplication注解。它是一个复合注解,包含了@SpringBootConfiguration(标记为配置类)、@EnableAutoConfiguration(启用自动配置)和@ComponentScan(自动扫描当前包及其子包下的组件)。简单理解:有这个注解的类所在包,就是SpringBoot自动扫描的起点。所有你写的Controller、Service等,只要放在这个包或其子包下,就会被自动发现并注册。application.properties: SpringBoot的核心配置文件。几乎所有配置都可以在这里通过key=value的形式进行自定义,例如服务器端口server.port=8081、数据库连接spring.datasource.url=jdbc:mysql://...等。它提供了默认值,我们只需修改我们需要改变的部分。static/和templates/: 分别用于前后端不分离和前后端分离的场景。如果是纯后端API开发,前期可以暂时不关注。
2.3 运行并验证:见证第一个“Hello World”
现在,让我们让项目跑起来,并创建一个最简单的API。
运行主类:在IDEA中,找到
DemoApplication.java,右键点击,选择Run ‘DemoApplication.main()‘。你会在下方的“Run”工具窗口看到日志输出。如果看到类似Tomcat started on port(s): 8080 (http) with context path ‘’的日志,恭喜你,SpringBoot应用已经启动成功!内嵌的Tomcat服务器正在8080端口监听。创建第一个Controller:在
com.example.demo包下(确保和主类在同一包或子包下),新建一个Java类,命名为HelloController。package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController // 1. 标记这是一个REST风格的控制器,其方法返回值默认序列化为JSON public class HelloController { @GetMapping("/hello") // 2. 将HTTP GET请求映射到/hello路径 public String sayHello() { return "Hello, SpringBoot!"; } }代码解释:
@RestController: 这个注解告诉Spring,这个类是一个控制器,并且它处理后的返回值直接写入HTTP响应体,而不是跳转到一个视图页面。这是构建RESTful API的基础。@GetMapping(“/hello”): 这是一个路由映射注解。它将HTTP的GET请求,且路径为/hello的请求,映射到sayHello这个方法上。
热部署(可选但推荐):为了在修改代码后无需手动重启应用,我们可以添加热部署依赖。在
pom.xml的<dependencies>部分添加:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency>添加后,IDEA需要做一次
Build -> Build Project,之后修改代码,按Ctrl+F9(Windows/Linux)或Cmd+F9(Mac)进行编译,SpringBoot会自动重新加载修改的类,极大提升开发效率。测试API:确保应用正在运行。打开浏览器或使用Postman等API测试工具,访问
http://localhost:8080/hello。你应该能看到页面上清晰地显示着“Hello, SpringBoot!”。
至此,你已经在不到半小时内,完成了一个SpringBoot Web应用的从创建到运行,并输出了第一个API接口。这个过程看似简单,但你已经实践了SpringBoot最核心的“自动配置”和“约定大于配置”的理念:你没有配置Tomcat,但它启动了;你没有配置DispatcherServlet(Spring MVC的核心控制器),但你的请求被正确路由和处理了。这就是SpringBoot的魅力。
3. 核心配置与自定义:驾驭application.properties
SpringBoot的“开箱即用”建立在大量智能默认配置上。但真实项目总是需要自定义的。application.properties(或其YAML格式版本application.yml)就是我们的控制台。
3.1 基础配置:修改端口与上下文路径
默认的8080端口可能被占用,或者你想为应用设置一个访问前缀。只需在src/main/resources/application.properties文件中添加:
# 修改内嵌服务器端口 server.port=9090 # 设置应用上下文路径,访问地址变为 http://localhost:9090/myapp/hello server.servlet.context-path=/myapp保存文件,重启应用(如果使用了devtools,编译后会自动重启)。现在你的应用将在9090端口监听,并且所有接口的路径前都需要加上/myapp。
3.2 配置日志级别:让调试信息更清晰
SpringBoot使用Logback作为默认日志框架。在开发阶段,我们经常需要查看更详细的日志,比如SQL语句。
# 设置根日志级别为INFO,但将我们关心的包级别调为DEBUG logging.level.root=INFO # 查看Spring框架核心日志(可选) logging.level.org.springframework=INFO # 查看我们自己的业务包日志(假设你的包是com.example.demo) logging.level.com.example.demo=DEBUG # 查看Hibernate(ORM框架)执行的SQL语句,这对于数据库调试至关重要 logging.level.org.hibernate.SQL=DEBUG # 查看SQL语句中的参数值 logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE配置后重启,当你后续操作数据库时,就能在控制台看到完整的SQL及其参数,这对排查数据问题极其有用。
3.3 多环境配置:区分开发、测试、生产
这是实际项目必备的配置策略。SpringBoot支持通过不同的配置文件来适应不同环境。
创建配置文件:在
resources目录下,创建多个配置文件:application-dev.properties(开发环境)application-test.properties(测试环境)application-prod.properties(生产环境)
环境隔离配置:在每个文件中配置特定环境的参数。例如,数据库连接在开发、测试和生产环境肯定是不同的。
application-dev.properties:spring.datasource.url=jdbc:mysql://localhost:3306/dev_db?useSSL=false&serverTimezone=UTC spring.datasource.username=dev_user spring.datasource.password=dev_passapplication-prod.properties:spring.datasource.url=jdbc:mysql://prod-server:3306/prod_db?useSSL=true&serverTimezone=UTC spring.datasource.username=prod_user spring.datasource.password=${DB_PASSWORD:strong_prod_pass} # 可以使用环境变量
激活环境:在主配置文件
application.properties中,指定当前激活的环境。# 激活开发环境配置 spring.profiles.active=dev应用启动时,会加载
application.properties,然后叠加application-dev.properties中的配置(后者会覆盖前者相同的key)。你也可以在启动JAR包时通过命令行参数指定:java -jar demo.jar --spring.profiles.active=prod。
注意事项:千万不要将生产环境的密码等敏感信息硬编码在配置文件中提交到代码仓库。对于生产环境,推荐使用环境变量(如
${DB_PASSWORD})或专门的配置中心(如Spring Cloud Config、Apollo、Nacos)来管理。application.properties中只放一些不敏感或本地开发用的配置。
4. 数据访问实战:整合MyBatis与数据库
一个没有数据交互的后端应用是不完整的。接下来,我们整合MyBatis-Plus(一款强大的MyBatis增强工具),快速实现对数据库的CRUD操作。
4.1 添加依赖与数据库准备
首先,在pom.xml中添加必要的依赖:
<!-- MySQL驱动 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <!-- MyBatis-Plus Starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.5</version> <!-- 请使用最新稳定版 --> </dependency>然后,准备一个MySQL数据库。假设你本地安装了MySQL,创建一个数据库和表:
CREATE DATABASE IF NOT EXISTS `springboot_demo` DEFAULT CHARACTER SET utf8mb4; USE `springboot_demo`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` varchar(30) DEFAULT NULL COMMENT '姓名', `age` int(11) DEFAULT NULL COMMENT '年龄', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `user` (`id`, `name`, `age`, `email`) VALUES (1, '张三', 18, 'test1@example.com');4.2 配置数据源与MyBatis-Plus
在application.properties(或你激活的环境配置文件,如application-dev.properties)中配置数据库连接和MyBatis-Plus的基本属性:
# 数据源配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/springboot_demo?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8 spring.datasource.username=root # 替换为你的用户名 spring.datasource.password=your_password # 替换为你的密码 # MyBatis-Plus 配置 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 控制台打印SQL mybatis-plus.global-config.db-config.id-type=auto # 主键策略,数据库自增 mybatis-plus.configuration.map-underscore-to-camel-case=true # 自动将下划线命名转为驼峰4.3 创建实体类、Mapper与Service
实体类 (Entity):在
com.example.demo.entity包下创建User.java。这里我们用Lombok简化代码。package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data // Lombok注解,自动生成getter, setter, toString, equals, hashCode等方法 @TableName("user") // MyBatis-Plus注解,指定对应数据库表名 public class User { @TableId(type = IdType.AUTO) // 指定主键,且为数据库自增 private Long id; private String name; private Integer age; private String email; }Mapper接口:在
com.example.demo.mapper包下创建UserMapper.java。这里无需写任何SQL!package com.example.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.entity.User; public interface UserMapper extends BaseMapper<User> { // 继承BaseMapper后,就拥有了基本的CRUD方法:insert, deleteById, updateById, selectById, selectList等。 }让Spring知道Mapper在哪:在主应用类
DemoApplication.java上添加@MapperScan注解,告诉MyBatis去扫描哪个包下的Mapper接口。package com.example.demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.demo.mapper") // 添加这行 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
4.4 编写Controller提供API
现在,我们创建一个Controller来暴露操作User的REST API。在com.example.demo.controller包下创建UserController.java。
package com.example.demo.controller; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/user") // 给这个控制器一个统一的路径前缀 public class UserController { @Autowired // 自动注入UserMapper实例 private UserMapper userMapper; // 查询所有用户 @GetMapping public List<User> getAllUsers() { return userMapper.selectList(null); // selectList(null) 查询所有记录 } // 根据ID查询用户 @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return userMapper.selectById(id); } // 新增用户 @PostMapping public String addUser(@RequestBody User user) { // @RequestBody 接收JSON格式的请求体 int result = userMapper.insert(user); return result > 0 ? "新增成功" : "新增失败"; } // 修改用户 @PutMapping public String updateUser(@RequestBody User user) { int result = userMapper.updateById(user); // 根据主键ID更新 return result > 0 ? "更新成功" : "更新失败"; } // 删除用户 @DeleteMapping("/{id}") public String deleteUser(@PathVariable Long id) { int result = userMapper.deleteById(id); return result > 0 ? "删除成功" : "删除失败"; } }4.5 测试CRUD接口
重启应用,确保数据库服务已启动。现在你可以使用Postman或浏览器(仅限GET请求)来测试你的API了:
- GET
http://localhost:8080/user:获取所有用户列表(JSON格式)。 - GET
http://localhost:8080/user/1:获取ID为1的用户信息。 - POST
http://localhost:8080/user:新增用户。在Body中选择raw->JSON,输入:
发送后,查看数据库或再次调用GET all接口,应该能看到新用户。{ "name": "李四", "age": 25, "email": "lisi@example.com" } - PUT
http://localhost:8080/user:更新用户。Body中需要包含id和其他要修改的字段。{ "id": 2, "name": "李四-updated", "age": 26 } - DELETE
http://localhost:8080/user/2:删除ID为2的用户。
恭喜!至此,你已经完成了一个具备完整数据库CRUD功能的SpringBoot后端服务。整个过程,你没有编写一行SQL语句(对于简单操作),也没有进行复杂的Service层封装(为了快速演示),但一个可用的API服务已经搭建完毕。这充分展示了SpringBoot + MyBatis-Plus在快速开发上的强大威力。
5. 项目结构优化与分层设计
上面的例子为了快速演示,将Mapper直接注入到了Controller中。这在小型demo中没问题,但在正式项目中,我们通常采用更清晰的分层架构:Controller -> Service -> Mapper。这有助于职责分离、代码复用和单元测试。
5.1 创建Service层
在com.example.demo.service包下创建UserService接口及其实现类。
UserService.java(接口):package com.example.demo.service; import com.example.demo.entity.User; import java.util.List; public interface UserService { List<User> listAll(); User getById(Long id); boolean save(User user); boolean update(User user); boolean removeById(Long id); }UserServiceImpl.java(实现类):package com.example.demo.service.impl; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service // 标记这是一个Spring管理的Service组件 public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> listAll() { return userMapper.selectList(null); } @Override public User getById(Long id) { return userMapper.selectById(id); } @Override public boolean save(User user) { return userMapper.insert(user) > 0; } @Override public boolean update(User user) { return userMapper.updateById(user) > 0; } @Override public boolean removeById(Long id) { return userMapper.deleteById(id) > 0; } }
5.2 改造Controller,注入Service
修改之前的UserController,不再直接注入Mapper,而是注入Service。
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("/user") public class UserController { @Autowired private UserService userService; // 改为注入Service @GetMapping public List<User> getAllUsers() { return userService.listAll(); // 调用Service方法 } @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return userService.getById(id); } @PostMapping public String addUser(@RequestBody User user) { boolean result = userService.save(user); return result ? "新增成功" : "新增失败"; } @PutMapping public String updateUser(@RequestBody User user) { boolean result = userService.update(user); return result ? "更新成功" : "更新失败"; } @DeleteMapping("/{id}") public String deleteUser(@PathVariable Long id) { boolean result = userService.removeById(id); return result ? "删除成功" : "删除失败"; } }经过这样的改造,Controller只负责接收和响应HTTP请求,Service负责具体的业务逻辑(虽然现在逻辑很简单,但未来可以在这里添加数据校验、事务管理、调用多个Mapper等复杂操作),Mapper只负责与数据库交互。结构清晰,各司其职。
6. 常见问题与排查技巧实录
在第一天的高强度学习中,你肯定会遇到各种问题。这里我总结了一些最常见的“坑”和解决方法。
6.1 应用启动失败类问题
问题:
APPLICATION FAILED TO START,提示Failed to configure a DataSource- 原因:你在配置文件中配置了数据库连接(如
spring.datasource.url),但没有引入对应的数据库驱动依赖(如mysql-connector-j),或者依赖引入了但作用域(scope)是test。 - 解决:检查
pom.xml,确保有正确的数据库驱动依赖,且scope是runtime或默认(不写scope)。 - 临时绕过:如果暂时不想连接数据库,可以在主类或配置类上添加
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})来排除数据源自动配置。但这只是权宜之计。
- 原因:你在配置文件中配置了数据库连接(如
问题:
Port 8080 already in use- 原因:8080端口被其他进程(可能是另一个SpringBoot应用、Tomcat、或某个软件)占用。
- 解决:
- 在
application.properties中修改server.port为其他端口,如9090。 - 找到并关闭占用8080端口的进程。在命令行执行:
- Windows:
netstat -ano | findstr :8080找到PID,然后taskkill /PID [PID] /F - Linux/Mac:
lsof -i:8080找到PID,然后kill -9 [PID]
- Windows:
- 在
问题:
Field xxxMapper in xxxService required a bean of type ‘xxxMapper‘ that could not be found.- 原因:Spring找不到你的Mapper接口对应的Bean。最常见的原因是忘记在主类上添加
@MapperScan注解,或者扫描的包路径不正确。 - 解决:检查主类上的
@MapperScan(“com.example.demo.mapper”),确保路径是你的Mapper接口所在的包。如果使用MyBatis-Plus,也可以在每个Mapper接口上直接加@Mapper注解,但更推荐用@MapperScan批量扫描。
- 原因:Spring找不到你的Mapper接口对应的Bean。最常见的原因是忘记在主类上添加
6.2 运行时API访问类问题
问题:访问接口返回
404 Not Found- 原因:
- 路径错误:检查URL是否拼写正确,包括大小写、
context-path。 - Controller未加载:确保你的Controller类在
@SpringBootApplication主类所在的包或其子包下。如果放在同级或上级包,需要额外配置@ComponentScan。 - 请求方法不匹配:你用了
@GetMapping注解,但用Postman发了POST请求。
- 路径错误:检查URL是否拼写正确,包括大小写、
- 排查:查看启动日志,SpringBoot会打印出所有映射的端点(Endpoint)。在日志里搜索
Mapping,看看你的接口路径是否在其中。
- 原因:
问题:返回
Whitelabel Error Page或空页面,而不是预期的JSON- 原因:Controller方法返回了一个对象,但没有被正确序列化为JSON。
- 解决:
- 确保Controller类上标注的是
@RestController,而不是@Controller。@Controller通常用于返回视图名称。 - 如果用了
@Controller,需要在方法上额外添加@ResponseBody注解。 - 检查是否引入了Jackson依赖(
spring-boot-starter-web已经包含了),它是SpringBoot默认的JSON处理器。
- 确保Controller类上标注的是
问题:插入或更新数据库时,字段值为
null- 原因:
- 实体类字段与数据库列名不匹配:默认映射规则是驼峰转下划线。如果数据库列名是
user_name,实体字段应该是userName。如果不符合此规则,需要使用@TableField(“column_name”)注解指定。 - 前端传参字段名与实体字段名不匹配:检查Postman中发送的JSON的key是否与实体类字段名一致。
- 实体类字段与数据库列名不匹配:默认映射规则是驼峰转下划线。如果数据库列名是
- 排查:开启SQL日志(如前面配置的
mybatis-plus.configuration.log-impl),查看实际执行的SQL语句和参数,这是最直接的调试方式。
- 原因:
6.3 依赖与配置类问题
问题:Lombok注解(如
@Data)不生效,IDE报错“找不到getter/setter”- 原因:IDEA没有启用Lombok插件或注解处理。
- 解决:
- 在IDEA中安装“Lombok”插件(File -> Settings -> Plugins,搜索安装并重启)。
- 启用注解处理:File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors,勾选
Enable annotation processing。
问题:修改了
application.properties,但配置没生效- 原因:
- 配置文件放错了位置。SpringBoot有特定的配置文件加载顺序,标准位置是
src/main/resources下。 - 配置项的key写错了。SpringBoot的配置项有严格的命名规范,通常是
spring.xxx或server.xxx等。 - 没有重启应用。非
spring-boot-devtools管理的配置,需要重启才能生效。
- 配置文件放错了位置。SpringBoot有特定的配置文件加载顺序,标准位置是
- 排查:在应用启动日志的开头部分,SpringBoot会打印出它加载的配置文件(
.properties或.yml)路径和激活的Profile,确认你的配置文件被正确加载。
- 原因:
实操心得:遇到问题,第一反应是看控制台日志。SpringBoot的启动失败日志非常详细,通常会直接告诉你哪里出错了,以及可能的原因。其次,善用搜索引擎,将错误信息的关键部分(去掉你自己的项目名、包名)进行搜索,你遇到的问题99%别人都遇到过。最后,养成“最小化复现”的习惯,创建一个干净的新项目,只添加引发问题的必要依赖和代码,这能帮你快速定位是项目配置问题还是代码逻辑问题。