我显然有一个名为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之间更改。

10-08 19:10