我显然有一个名为userinfo的数据库,以及一个名为userName的表。我正在使用XAMPP
public class DatabaseHelper {
private static final String dbName = "userinfo";
Connection connection;
Statement stmt = null;
Timestamp date;
public Connection getConnection(){
String dbName = "userinfo";
String userName="root";
String password="12345678";
try {
Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
connection= DriverManager.getConnection("jdbc:mysql://localhost/"+dbName,userName,password);
} catch (Exception e) {
e.printStackTrace();
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}
createUsersTable();
return connection;
}
public void createUsersTable() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost/"+dbName);
stmt = connection.createStatement();
String sql = "CREATE TABLE IF NOT EXISTS Users"
+ "(Id INTEGER PRIMARY KEY AUTOINCREMENT,"
+ " Firstname TEXT NOT NULL,"
+ " Lastname TEXT NOT NULL,"
+ " Username TEXT NOT NULL,"
+ " Password TEXT NOT NULL,"
+ " TotalAmount DOUBLE NOT NULL,"
+ " StockAmount DOUBLE NOT NULL,"
+ " Email TEXT NOT NULL" + ");";
stmt.executeUpdate(sql);
stmt.close();
connection.close();
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}
System.out.println("User table creation successful");
}
我得到的错误:
警告:通过版本8.0.131的JavaFX运行时,使用版本8.0.171的JavaFX API加载FXML文档
java.sql.SQLSyntaxErrorException:未知数据库'userinfo'
undate:这是我现在得到的错误2020年3月7日,下午2:58:56 javafx.fxml.FXMLLoader $ ValueElement processValue
警告:通过版本8.0.131的JavaFX运行时,使用版本8.0.171的JavaFX API加载FXML文档
java.sql.SQLException:对用户“ @'localhost”的访问被拒绝(使用密码:NO)
最佳答案
这个问题是不完整的,因此我们不能给您确切的答案。我评论指出要提供完整的答案/解决方案时需要提供的其他信息。
这是您需要解决的一些初始问题。
这些语句是不必要的,应删除:
Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
Class.forName("com.mysql.cj.jdbc.Driver");
自从发布了与Java 6和JDBC 4.0兼容的MySQL驱动程序以来,就没有必要了。大约在2007年!您只需要使用
DriverManager.getConnection
。为什么这么重要?好吧,驱动程序类名称取决于数据库和驱动程序版本。如果将驱动程序类名硬连接到代码中,则可能会中断。 (此外,不必要的
Class.forName
调用效率很低。)您的代码未使用帐户名和密码。您将使用没有帐户名和密码的数据库连接。根据MySQL访问控制的配置方式,这可能导致它说特定的数据库不存在。 (可能……尽管我对此表示怀疑。)
您的代码错误地管理了连接:
您的
getConnection
调用DriverManager.getConnection
并将结果分配给connection
。然后,它调用
createUserTable
...,它再次调用DriverManager.getConnection
,并将其分配给相同的connection
变量。然后
createUserTable
执行一些SQL并关闭connection
。结果,您的
getConnection
最终将返回已关闭的Connection
。createUserTable
不应调用DriverManager.getConnection
,也不应关闭connection
。在代码中深入调用
System.exit
通常是一个坏主意。最好允许传播异常,以便进一步处理异常。1-这不是理论问题。驱动程序类名称确实在MySQL Connector / J 5.x和MySQL Connector / J 8.0之间更改。