【发布时间】:2020-05-10 22:57:09
【问题描述】:
我正在使用 SceneBuilder 和 Eclipse 制作一个 java 项目;我需要连接到使用 MySQL 创建的本地数据库,但是在 eclipse 中运行我的 Java 代码后,我收到以下错误:
Exception in thread "main" java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at com.mysql.cj.jdbc.admin.TimezoneDump.main(TimezoneDump.java:70)
而不是'root'@'localhost' (using password: NO) 是登录凭据错误,现在我有''@'localhost' (using password: NO)。
使用 MySQL 工作台和命令提示符,我可以使用“root”/“root”正确访问,并在我的数据库上启动查询。在另一台笔记本电脑或我的家用电脑上运行相同的 Eclipse 项目,我可以毫无错误地运行它。所以问题不在于代码,而在于我当前笔记本电脑的某些设置。
我已经尝试过:
- 卸载并重新安装 Eclipse。
- 卸载并重新安装 mySQL 产品:Workbench、Server、J 连接器。
- 切换 Eclipse 工作区。
- 从 windows 防火墙打开 3306 端口。
这是我尝试连接到我的数据库的代码部分。
package model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class UserDAO {
private static String USER = "root";
private static String PASS = "root";
private static String DB_URL = "jdbc:mysql://127.0.0.1:3306/beecological?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
private static String DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver";
public static boolean checkUsername(String username) {
Statement stmt = null;
Connection conn = null;
int res = 1;
try {
Class.forName(DRIVER_CLASS_NAME);
conn = DriverManager.getConnection(DB_URL, USER, PASS);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
res = Queries.verifyUsernameAvailable(stmt, username);
stmt.close();
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
if(res == 1) {
return false;
}
return true;
}
public static void saveUser(User instance) {
Statement stmt = null;
Connection conn = null;
try {
Class.forName(DRIVER_CLASS_NAME);
conn = DriverManager.getConnection(DB_URL, USER, PASS);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
Queries.insertUser(stmt, instance);
stmt.close();
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
public static boolean verifyLogin(User instance) {
Statement stmt = null;
Connection conn = null;
int res = 0;
try {
//caricamento driver mysql
Class.forName(DRIVER_CLASS_NAME);
conn = DriverManager.getConnection(DB_URL, USER, PASS);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
res = Queries.verifyUserRegistered(stmt, instance);
stmt.close();
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
if (res == 0) {
return false; //utente immesso non esiste
}
return true;
}
}
【问题讨论】:
-
也许,你的空用户是问题,看到错误消息
...: Access denied for user ''@'localhost' (using password: NO),它有一个空的String作为用户名,不是吗? -
是的,这就是问题所在,但我不知道这怎么可能,因为使用工作台我使用 user: 'root' 和 psw: 'root' 正确访问数据库
-
如果启用了
using password: NO,则不必提供密码,但不建议使用没有密码的root。无论如何,用户名以某种方式被清空很奇怪......您可以尝试不使用密码,但我怀疑它会改变这种行为。 -
using password: NO这是一个错误,我使用 cmd 正确访问数据库,使用 root/root 访问工作台。如果我从代码中完全删除DriverManager.getConnection(),我也会收到错误消息。