SpringBoot项目中使用纯数字密码连接数据库失败

17 SpringBoot项目链接数据库失败解决方法

17.1 核心问题

  1. 核心问题:Spring Boot项目 连接本地数据库(MySQL80)失败
  2. 现象:
  • 本地数据库密码正确,使用 mysql -u root -p 命令可以正常登录。
  • 在 Spring Boot 项目中,使用 application.yml 配置文件连接数据库时,显示无法连接数据库,说密码错误。
  • 在 Spring Boot 项目中,将配置文件改为 application.properties 并填入相同的密码,项目可以正常启动并连接数据库。
  • 使用相同的 application.yml 配置文件连接他人的数据库(只需修改 url, username, password),可以正常连接。
  • 编写程序,输出SpringBoot项目实际读取的密码,发现和自己在application.yml里面配置的不一样。
  • 其他项目,除了SpringBoot项目都可以成功连接数据库

17.2 关键原因分析

  1. 根本原因:application.yml 文件的 YAML 语法特性 导致密码被错误解析。
  2. 详细解释:
  • YAML 是一种对数据类型敏感的格式。它会尝试根据你写的内容自动推断值的类型。
  • 当你在 application.yml 中写下 password: 123456(一个纯数字的密码)时,YAML 解析器会将其解析为一个 整数(Integer/Long) 类型,而不是一个 字符串(String) 类型。
  • 数据库驱动在尝试使用这个 “整数密码” 去连接数据库时,会发生类型不匹配或转换失败的问题,导致数据库服务器拒绝连接(表现为密码错误)。
  • 而 application.properties 文件则不同,它的语法是 key=value,其中 value 默认都被当作 字符串 处理,因此不会出现这个问题。
  • 当连接他人的数据库时,如果对方的密码包含非数字字符(如字母、特殊符号),YAML 解析器会自动将其解析为字符串,所以无需任何修改即可正常工作。

17.3 解决方案

  1. 核心解决方案:在 application.yml 中,用单引号或双引号将密码包裹起来,强制 YAML 解析器将其视为字符串。
  2. 正确示例:
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 实际读到的值是否与预期一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值