Java 在mySQL中创建数据库';似乎工作不正常

Java 在mySQL中创建数据库';似乎工作不正常,java,mysql,jdbc,ddl,Java,Mysql,Jdbc,Ddl,我想让Java为我创建一个数据库和一个用户。我正在使用Netbeans,以便查看存在哪些数据库。创建数据库时,我可以在Netbeans->Services->Databases中看到该数据库存在 程序首先检查数据库是否已经存在,以便我可以多次运行它。令我惊讶的是,当我第二次运行它时,它不知道数据库已经存在,所以它想重新创建数据库。如果Netbeans看到它,为什么我的Java程序看不到它?(我在grant语句中发现了错误,因此我将纠正它。) 我有删除数据库和用户的例程。在这里,如果我删除一个数据

我想让Java为我创建一个数据库和一个用户。我正在使用Netbeans,以便查看存在哪些数据库。创建数据库时,我可以在Netbeans->Services->Databases中看到该数据库存在

程序首先检查数据库是否已经存在,以便我可以多次运行它。令我惊讶的是,当我第二次运行它时,它不知道数据库已经存在,所以它想重新创建数据库。如果Netbeans看到它,为什么我的Java程序看不到它?(我在grant语句中发现了错误,因此我将纠正它。)

我有删除数据库和用户的例程。在这里,如果我删除一个数据库,它也会消失在Netbeans->Services->Databases中

用户的情况是没有问题的。如果我删除一个用户,然后创建数据库,它将识别出该用户不存在,并创建他。如果我只删除数据库,它会识别出用户已经存在

我将包括drop数据库和用户的一些代码片段:

    String sql = "drop user '" + user + "'@'%'";
    try {
        stm1 = con1.createStatement();
        executeStatement(stm1, sql);
        stm1.close();
        con1.close();
    } catch (Exception e) { System.out.println(e.getMessage());}

    String sql = "drop database " + dbName;
    try {
        stm1 = con1.createStatement();
        executeStatement(stm1, sql);
        stm1.close();
        con1.close();
    } catch (Exception e) { System.out.println(e.getMessage());}
可以看出,这里没有什么特别的事情。在create数据库中,我认为问题可能源于我在这个阶段没有创建任何表。(编辑以删除表的添加。)

好的,在这个阶段,数据库没有表。我需要第二次访问,现在我希望能够连接到我刚刚创建的数据库,该数据库是由对该数据库具有权限的用户创建的。我得到的错误是

Access denied for user 'myuser'@'%' to database 'mytst1'
我刚刚创建了mytst1,我在Netbeans->Services->Databases下看到了它。它目前没有表。错误再次出现在grant语句中

以下是创建数据库的例程:

void createDB() {
    Connection con1 = connect2database(false, false);
    if( con1 != null) {
        JOptionPane.showMessageDialog(this, "The database already exists.\n"
            + "Maybe you only need to create the tables?");
        return;
    }
    con1 = connect2database(false, true);
    if( con1 == null) {
        JOptionPane.showMessageDialog(this, "Can't connect to mySQL server.\n"
            + "Is the path to the database correct, including IP (with :3306)\n"
            + "The database name itself (the last part) is ignored, but the path is used.\n"
            + "Is the root password correct?");
        return;
    }
    String tmp, user = jTextUser.getText();
    String host, pwTmp;
    String userPw = jTextPW.getText();
    String sql = "create database if not exists " + dbName;
    boolean OK1, itExists;
    Statement stm1, stm2;
    ResultSet rSet;
    try {
        stm1 = con1.createStatement();
        OK1 = executeStatement(stm1, sql);
        if( !OK1) {
            JOptionPane.showMessageDialog(this, "Create database failed.");
            return;
        }

        sql = "select host, user from mysql.user where user = '" + user + "'";
        rSet = stm1.executeQuery(sql);
        itExists = false;
        while(rSet.next()) {
            itExists = true;
            host = rSet.getString(1);
            tmp = rSet.getString(2);
        }

        if(!itExists) {
            sql = "create user '" + user + "'@'%' identified by '" + userPw + "'";
            OK1 = executeStatement(stm1, sql);
            if( !OK1) {
                JOptionPane.showMessageDialog(this, "Create user failed.");
                return;
            }
        }
        sql = "grant all privileges on " + dbName + ".* to '" + user + "'@'%' identified ";
        sql += "by '" + userPw + "' with grant option";
        executeStatement(stm1, sql);
        sql = "flush privileges";
        executeStatement(stm1, sql);
        stm1.close();
        con1.close();
    } catch (Exception e) { System.out.println(e.getMessage()); }
}
我希望发生的是,它会在例程的顶部退出,说数据库已经存在。如果我要求使用一个我已经使用了很多年的数据库来存储我的数据,它确实会在此时退出。旧数据库显然有很多表

我的错误是执行“授予mytst1上的所有权限”而不是“授予mytst1上的所有权限。*”,即mytst1中的所有表

谢谢,
Ilan

创建用户或模式时,用户和模式不同,但必须添加用户权限才能对模式进行操作,一旦删除其中任何一个,用户和模式就会丢失。创建单独的语句以授予特权时,请确保用户存在
FLUSH
语句从
mysql
模式重新加载priv,以使其在用户连接后生效。如果该模式中没有记录,则效率较低。如果您想访问数据库元数据,特别是在开发阶段,还需要将用户权限授予mysql模式。

我不确定我是否理解您的意思。我的代码首先创建数据库,然后检查用户是否存在。如果不是,他就是被创造出来的。如果他已经存在,他将被授予对刚刚创建的数据库的权限。在Connect2Database(false,false)中,它尝试连接到存在或不存在的数据库。如果失败,connect2database(false,true)将使用根密码连接到数据库mysql。这就是您所指的模式吗?也许我应该连接其他东西而不是mysql?我不知道还能连接到什么。对不起,我做了一些愚蠢的事情。通过添加“调试信息”并创建表,我在连接到mysql而不是刚刚创建的数据库时做到了这一点。哑的因此,我返回到我的原始代码,没有添加任何表,但我无法使用用户连接到新创建的数据库。我不明白为什么不可以。在连接url中,您可以指定默认模式。通过使用根pw指定我与mysql的连接,我认为我有效地指定了默认模式?请注意,我编辑了原始问题,以便在连接到mysql时不添加表。问题是:我为什么不能连接到一个目前没有表的数据库?我没有看到你的
connect2database
源代码,我想你是的。如果无法连接到数据库,有几种可能性,请在将其编码到程序的数据源之前检查并测试与您喜爱的IDE的连接。