紧接上文,我想提供一些我在搭建项目过程中反复遇到的一些问题:
第五阶段:项目调试与问题解决
5.1 常见错误与解决方案
问题1:登录失败 - MyBatis 绑定异常:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ljl.news.dao.LoginDao.login
出现场景 :
-
前端点击登录按钮,后端报错
-
反复尝试修改 @Param 注解和 XML 配置都不行
问题原因 :
1. @Param 注解与 XML 参数引用不匹配 :
- LoginDao.java 中 : Admin login(@Param("admin") Admin admin);
- LoginMapper.xml 中 : where account = #{account}
- 应该是 : where account = #{admin.account}
2. 配置问题 :
- mapper-locations 路径配置
- namespace 与接口全限定名不匹配
解决方案 :
// LoginDao.java
@Mapper
public interface LoginDao {
Admin login(Admin admin); // 去掉 @Param 注解,直接传递对象
}
<!-- LoginMapper.xml -->
<select id="login" resultType="com.ljl.news.model.Admin">
select id, account, password from admin
where account = #{account} and password = #{password}
</select>
问题2:数据库连接失败 - 驱动不接受 JDBC URL
错误信息 :
Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl
出现场景 :
**- 后端启动时立即失败
- 反复修改 JDBC URL、添加各种参数都不行
- 尝试过 MySQL 8.0 驱动、HikariCP、Druid 连接池都失败**
问题原因 :
-
MySQL 8.0 驱动与 URL 兼容性问题 :
-
MySQL 8.0 的 com.mysql.cj.jdbc.Driver 对 URL 格式要求严格
-
时区参数、SSL 参数等容易导致问题
-
Druid 连接池版本过旧 :
-
使用的 Druid 1.1.10 与 MySQL 8.0 驱动配合有问题
解决方案 :
<!-- pom.xml - 使用 MySQL 5.x 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
<scope>runtime</scope>
</dependency>
application.yml - 使用简单的 URL
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/newsdb?useUnicode=true&characterEncoding=utf8
username: root
password: root
经验教训 :
**- MySQL 5.x 驱动通常可以兼容 MySQL 8.0 数据库
- 简单的 JDBC URL 更稳定
- 不要过度复杂化配置,先让它跑起来再说**
问题3:数据库连接超时
错误信息 :
java.sql.SQLException: connect error, url jdbc:mysql://127.0.0.1:3306/newsdb
出现场景 :
- 后端启动后,数据库连接池不断尝试连接失败
-
检查了防火墙、MySQL 服务状态都正常
-
SQLyog 可以正常连接数据库,但 Spring Boot 不行
问题排查过程 : -
✅确认 MySQL 服务正在运行
-
✅ 确认用户名密码正确
-
✅ 确认数据库存在
-
✅ 确认防火墙没有阻止
-
❌ 问题依然存在..
最终解决方案 :
改用 MySQL 5.x 驱动 + 简单 URL(同问题2)
问题4:前端启动方式混淆
问题描述 :
- 用户有两种启动前端的方式:
-
命令行 npm run serve → http://localhost:8081
-
HBuilder 直接打开 HTML → http://127.0.0.1:8848
两种方式都试过,不知道该用哪个
核心区别 :

经验教训 :
-
Vue 项目 ≠ 传统 HTML 项目
-
Vue CLI 开发服务器是必须的
-
不要图省事用 HBuilder 直接打开
问题5:404 错误 - 后端接口缺失
错误信息 :
Request failed with status code 404
出现场景 :
- 登录成功后,进入管理员管理页面
-
点击"新增管理员"按钮,报错 404
-
查询列表也不行
问题原因 :
- 后端只有 /admin/admins 接口
-
前端调用的是:
-
/admin/list (查询列表)
-
/admin/add (新增)
-
/admin/update (更新)
-
/admin/delete/{id} (删除)
-
/menu/list (菜单列表)
-
接口路径不匹配!
解决方案 :
- 完善后端所有接口(见前面的完整代码)
经验教训 :
- 先确认前后端接口约定
-
接口路径、请求方法、参数都要一致
-
可以用 Postman 先测试后端接口
问题6:返回格式不匹配
问题描述 :
-
前端期望: { list: [], total: 0 }
-
后端直接返回: ArrayList<Admin>
-
前端无法正确解析
解决方案:
// 创建 PageResult 类
public class PageResult<T> {
private ArrayList<T> list;
private int total;
public PageResult(ArrayList<T> list, int total) {
this.list = list;
this.total = total;
}
// Getter 和 Setter
}
// Controller 中返回
PageResult<Admin> pageResult = adminService.getAdminList(...);
return new Result(200, "查询成功", pageResult);
经验教训 :
-
统一返回格式很重要
-
分页需要 list 和 total 两个字段
-
前后端先约定好数据结构
问题7:target 目录旧文件问题
问题描述 :
- 修改了代码,但重启后还是旧行为
- 怀疑是缓存问题
解决方案 :
-
停止后端服务
-
手动删除 target 目录
-
IDEA → Build → Rebuild Project
-
重启后端服务
经验教训 :
-
有时候需要"彻底重启"
-
删除 target 目录是终极解决方案
-
Rebuild Project 比 Build 更彻底
5.2 调试技巧总结
技巧1:从简单开始
先让最简单的功能跑通,再逐步添加复杂性
示例 :
-
先写一个最简单的查询接口
-
确认数据库连接正常
-
再添加条件查询
-
最后添加分页
技巧2:分层调试
调试顺序 :
-
数据库层:先在 SQLyog 中测试 SQL
-
Dao 层:确认 MyBatis 映射正确
-
Service 层:确认业务逻辑
-
Controller 层:确认接口返回
-
前端层:确认请求和展示
技巧3:工具使用
必备工具 :
-
SQLyog :测试 SQL、查看表结构
-
Postman :测试后端接口
-
浏览器 F12 :查看网络请求、Console 日志
-
IDEA 断点 :后端代码调试 技巧4:日志输出
关键位置加日志 :
public Admin login(Admin admin){
Admin loginAdmin = loginDao.login(admin);
System.out.println(loginAdmin); // 关键日志
return loginAdmin;
}
看到这个就成功了 :
Admin{id=1, account='admin', password='111'}
5.3 常见错误速查表

"可能原因"仅供参考,具体原因具体解决
5.4 心态与方法论
遇到问题时的心态:
-
不要慌 :99% 的问题都有解决方案
-
不要死磕 :一个方向不行就换个思路
-
记录问题 :把错误信息记下来,方便排查
-
分步验证 :不要一口气写太多代码,写一点测一点
开发方法论
增量开发 :
-
写一个小功能
-
测试通过
-
提交代码
-
写下一个小功能
而不是 :
-
一口气写完全部代码
-
发现一堆错误
-
不知道从哪开始改
总结
这次项目学到的核心经验:
-
简单胜过复杂 :MySQL 5.x 驱动 + 简单 URL 最稳定
-
先跑通再优化 :不要一开始就追求完美
-
前后端约定优先 :接口、数据格式先商量好
-
分层调试 :从数据库到前端,一步步来
-
日志是好朋友 :关键位置加输出,快速定位问题
-
删除 target 目录 :终极解决方案
-
心态很重要 :遇到问题别慌,换个思路