org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) ### The error may exist in mapper/StudentMapper.xml ### The error may involve org.example.mapper.StudentMapper.selectStudentById ### The error occurred while executing a query ### Cause: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:153) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87) at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:145) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86) at jdk.proxy2/jdk.proxy2.$Proxy9.selectStudentById(Unknown Source) at org.example.AppTest.testSelectStudentById(AppTest.java:87) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org
时间: 2025-07-14 09:48:46 浏览: 11
<think>嗯,用户遇到了MyBatis连接MySQL时出现的访问被拒绝的问题。错误信息显示用户'root'@'localhost'在密码正确的情况下仍然被拒绝访问。我需要帮他分析可能的原因和解决方案。
首先,根据引用中的信息,用户确认了密码正确,甚至用JDBC直接连接成功,但MyBatis不行。这说明问题可能不在密码本身,而是配置上的差异。比如,MyBatis的配置文件中可能密码有误,或者有空格等隐藏字符。需要检查XML或properties文件中的username和password是否正确,特别是特殊字符是否需要转义。
然后,考虑MySQL的权限设置。即使本地访问,用户可能需要显式授权。比如,root用户可能没有从localhost访问的权限,或者权限被限制。需要指导用户检查MySQL的权限表,使用GRANT命令重新赋予权限,并刷新权限。
另外,MySQL 8.0之后,身份验证插件可能从native_password改为caching_sha2_password,这可能导致旧驱动无法连接。需要确认驱动版本是否兼容,或者在MySQL中修改用户的身份验证插件。
还有,用户的连接URL是否正确?比如,是否指定了正确的数据库名称,是否缺少参数如useSSL或serverTimezone。这些参数可能会影响连接是否成功。
另外,防火墙或MySQL服务器是否在运行?虽然用户用JDBC成功连接,但需要确保MyBatis使用的端口和主机没有变动。检查MySQL服务状态和网络配置也很重要。
用户提到的StudentMapper.xml中的selectStudentById语句,可能需要检查SQL语句是否有语法错误,但访问被拒绝的问题更可能是连接层面的。不过,确认SQL语句正确性也是排除问题的步骤之一。
总结可能的解决步骤:检查配置文件的密码和用户名是否正确,检查MySQL用户权限,更新驱动或调整身份验证插件,验证连接URL的正确性,确保MySQL服务运行正常,最后检查防火墙设置。用户需要一步步排查,从MyBatis配置到MySQL服务器设置,逐步缩小问题范围。</think>### 解决MyBatis连接MySQL访问被拒绝问题的方法
#### 1. 检查数据库连接配置
**核心配置验证**:确认MyBatis的配置文件(如`mybatis-config.xml`或`application.properties`)中数据库连接参数是否正确:
- 用户名和密码需与MySQL中`root`用户的配置一致
- 密码若包含特殊字符(如`@`或`!`),需使用XML实体编码或CDATA包裹
- 连接URL格式应为:`jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC`
示例配置片段:
```xml
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="正确密码"/>
</dataSource>
```
#### 2. 验证MySQL用户权限
**权限诊断步骤**:
1. 登录MySQL命令行:
```sql
mysql -u root -p
```
2. 执行权限查询:
```sql
SELECT Host, User, authentication_string FROM mysql.user;
```
3. 若缺少`root@localhost`条目,需创建用户并授权:
```sql
CREATE USER 'root'@'localhost' IDENTIFIED BY '你的密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
```
#### 3. 身份验证插件兼容性(MySQL 8+)
**版本适配方案**:
- 检查驱动版本是否≥8.0.16
- 或修改用户认证方式:
```sql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
```
#### 4. 检查防火墙和MySQL服务状态
**服务验证方法**:
```bash
# Windows
net start | findstr "MySQL"
# Linux
systemctl status mysqld
```
#### 5. 排查Mapper文件配置
针对`StudentMapper.xml`中的`selectStudentById`,需确保:
```xml
<select id="selectStudentById" resultType="Student">
SELECT * FROM students WHERE id = #{id}
</select>
```
验证SQL语句在MySQL客户端可直接执行[^1][^2][^4]
#### 6. 密码验证模式调试
在连接URL添加调试参数:
```properties
jdbc:mysql://localhost:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true
```
### 验证流程图
```
配置检查 → 权限验证 → 驱动测试 → 服务状态 → SQL调试
```
### 典型错误场景分析
- **密码加密方式不匹配**:MySQL 8默认使用caching_sha2_password,旧驱动不支持[^3]
- **空格字符污染**:配置文件中密码值意外包含空格
- **权限粒度问题**:用户仅有部分数据库的访问权限
阅读全文
相关推荐

















