17 SpringBoot项目链接数据库失败解决方法
17.1 核心问题
- 核心问题:Spring Boot项目 连接本地数据库(MySQL80)失败
- 现象:
- 本地数据库密码正确,使用 mysql -u root -p 命令可以正常登录。
- 在 Spring Boot 项目中,使用 application.yml 配置文件连接数据库时,显示无法连接数据库,说密码错误。
- 在 Spring Boot 项目中,将配置文件改为 application.properties 并填入相同的密码,项目可以正常启动并连接数据库。
- 使用相同的 application.yml 配置文件连接他人的数据库(只需修改 url, username, password),可以正常连接。
- 编写程序,输出SpringBoot项目实际读取的密码,发现和自己在application.yml里面配置的不一样。
- 其他项目,除了SpringBoot项目都可以成功连接数据库
17.2 关键原因分析
- 根本原因:application.yml 文件的 YAML 语法特性 导致密码被错误解析。
- 详细解释:
- YAML 是一种对数据类型敏感的格式。它会尝试根据你写的内容自动推断值的类型。
- 当你在 application.yml 中写下 password: 123456(一个纯数字的密码)时,YAML 解析器会将其解析为一个 整数(Integer/Long) 类型,而不是一个 字符串(String) 类型。
- 数据库驱动在尝试使用这个 “整数密码” 去连接数据库时,会发生类型不匹配或转换失败的问题,导致数据库服务器拒绝连接(表现为密码错误)。
- 而 application.properties 文件则不同,它的语法是 key=value,其中 value 默认都被当作 字符串 处理,因此不会出现这个问题。
- 当连接他人的数据库时,如果对方的密码包含非数字字符(如字母、特殊符号),YAML 解析器会自动将其解析为字符串,所以无需任何修改即可正常工作。
17.3 解决方案
- 核心解决方案:在 application.yml 中,用单引号或双引号将密码包裹起来,强制 YAML 解析器将其视为字符串。
- 正确示例:
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC
username: root
password: '123456' # 关键:用单引号包裹密码
driver-class-name: com.mysql.cj.jdbc.Driver
或
spring:
datasource:
password: "123456" # 双引号也可以
17.4 最佳实践
1.永远为 YAML 中的敏感信息加引号:
- 密码、密钥、Token 等配置项,无论是否包含特殊字符或纯数字,都强烈建议用单引号 ' 包裹。这可以避免所有因 YAML 类型推断引起的解析错误,保证配置的确定性和稳定性。
2.了解 YAML 与 Properties 的区别:
- application.yml:结构清晰、可读性强,但对语法(如缩进、类型)敏感。
- application.properties:语法简单、不易出错,但结构相对冗长。
- 根据项目团队的熟悉程度和偏好选择合适的配置文件格式。
3.本地数据库环境检查清单:
- 密码验证:始终先用 mysql -u root -p 命令验证密码是否正确。
- 驱动匹配:确保 pom.xml 中的 MySQL 驱动版本与本地 MySQL 服务器版本匹配(例如,MySQL 8.x 推荐使用 mysql-connector-j 8.x 版本)。
- 认证插件:如果使用 MySQL 8.x,确保用户的认证插件是 mysql_native_password(可通过 SELECT user, host, plugin FROM mysql.user; 查询),这是兼容性最好的选择。图片是查看自己的认证插件的步骤。

17.5 快速排查步骤(当遇到数据库连接问题时)
1.命令行测试:先用 mysql -u <用户名> -p 登录,确认数据库服务和密码本身无问题。
2.配置文件切换:尝试将 application.yml 的配置内容复制到一个新建的 application.properties 文件中,注释掉 yml 文件,重启项目。
- 若成功:问题 100% 出在 YAML 语法上,重点检查是否有未加引号的纯数字或特殊字符值。
- 若失败:问题可能出在数据库服务、驱动、网络或权限上,需要进一步排查。
3.打印配置值:在代码中通过 @Value("${spring.datasource.password}") 将解析后的密码注入,并在项目启动时打印出来,直观地验证 Spring Boot 实际读到的值是否与预期一致。
1577

被折叠的 条评论
为什么被折叠?



