我想让 Java 为我创建一个数据库和一个用户。我正在使用 Netbeans,以便可以查看存在哪些数据库。当我创建数据库时,我可以在 Netbeans -> 服务 -> 数据库中看到该数据库存在。
程序首先检查数据库是否已存在,以便我可以多次运行它。令我惊讶的是,当我第二次运行它时,它不知道数据库已经存在,因此它想要重新创建数据库。如果 Netbeans 看到它,为什么我的 Java 程序看不到它? (我在授予语句中发现了错误,因此我会将其修复为正确的。)
我有删除数据库和用户的例程。在这里,如果我删除数据库,它也会在 Netbeans -> 服务 -> 数据库中消失。
用户的情况工作没有问题。如果我删除一个用户然后创建数据库,它会识别出该用户不存在并创建他。如果我只删除数据库,它会识别出该用户已经存在。
我将包含一些用于删除数据库和用户的代码片段:
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());}
可以看出,这里没有什么特别的事情发生。在创建数据库时,我认为问题可能源于我在此阶段没有创建任何表。 (已编辑以删除添加表格。)
好的,此时数据库还没有表。我需要第二次进入,现在我希望能够使用具有数据库权限的用户连接到我刚刚创建的数据库。我得到的错误是
Access denied for user 'myuser'@'%' to database 'mytst1'
我刚刚创建了 mytst1,我在 Netbeans -> 服务 -> 数据库下看到它。目前没有 table 。错误再次出现在授权声明中......
这是创建数据库的例程:
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 中的所有表。
谢谢, 宜兰
最佳答案
当您创建用户或架构时,用户和架构并不相同,但您必须添加用户权限才能对架构进行操作,一旦删除其中任何一个,这些权限就会丢失。当您创建单独的语句来授予权限时,请确保用户存在。 FLUSH
语句从 mysql
架构重新加载 privs,使其在用户连接后生效。如果该模式中没有记录,则效率较低。如果您想访问数据库元数据,特别是在开发阶段,还需要授予用户对 mysql
架构的权限。
关于java - 在 mySQL 中创建数据库似乎无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19750975/