我的代码存在非常严重的问题,我正在研究数据库GUI应用程序。 该应用程序的目的是提供一个管理数据库的界面..它有点像phpMyAdmin的东西。 我获取所有数据库并在JTree上显示它们,点击每个数据库后显示其表格为叶子。我现在的问题是所有数据库都按预期显示其表,除了那些附带mysql安装的数据库我的意思是(Information_schema,mysql,test,performance_schema..etc)。括号中每个数据库下的表未显示在树上,只显示用户创建的数据库上的表。我自己创建的那些数据库。 但是mysql安装附带的数据库正在显示,但每个都有空表。 我不知道我的连接网址中是否有遗漏的内容。 代码的可能摘要如下:
public static Connection getConnection(Database database) throws SQLException {
try {
Class.forName(database.getDriver()).newInstance();
Properties property = new Properties();
property.setProperty("user", database.getUser().getUsername());
property.setProperty("password", database.getUser().getPassword());
connection = DriverManager.getConnection(database.getUrl(), property);
} catch (SQLException | InstantiationException | IllegalAccessException ClassNotFoundException ex) {
ex.printStackTrace();
}
return connection;
}
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Databases");
JTree tree = new JTree(root);
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
try {
DatabaseMetaData databaseMetaData = getDatabaseMetaData(database);
ResultSet resultSet = databaseMetaData.getCatalogs();
while (resultSet.next()) {
DefaultMutableTreeNode db = new DefaultMutableTreeNode(resultSet.getString("TABLE_CAT"));
root.add(db);
getDatabaseTableTree(database, tree, db);
}
} catch (SQLException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
public static DatabaseMetaData getDatabaseMetaData(Database database) throws SQLException {
return getConnection(database).getMetaData();
}
在我的数据库类中,我有以下字段
private String driver = "com.mysql.jdbc.Driver";
private String databaseName = "";
private String url = "jdbc:mysql://localhost:3306/";
private User user = null;
private String tableName = "";
还有所有这些的getter和setter方法,这就是为什么你看到我在上面的代码中调用getter和setter方法。
我希望我至少能够为你的常规解决方案描述我的挑战。
我选择不在上面的URL中选择数据库,因为我要处理所有数据库..
我甚至运行了一个测试,在单击每个数据库时在对话框中显示每个数据库名称,并且它运行正常。
答案 0 :(得分:0)
这可能是权限问题。 Root可以完全访问所有系统信息。但是,个人用户更受限制(引用从http://forums.mysql.com/read.php?20,585682,585683#msg-585683复制):
每个MySQL用户都有权访问这些表,但只能看到 表中与用户对应的对象的行 拥有适当的访问权限。在某些情况下(例如, INFORMATION_SCHEMA.ROUTINES表中的ROUTINE_DEFINITION列, 权限不足的用户会看到NULL。这些限制 不适用于InnoDB表;你只能用PROCESS看到它们 特权。
相同的权限适用于从中选择信息 INFORMATION_SCHEMA并通过SHOW查看相同的信息 声明。在任何一种情况下,您都必须拥有某个对象的特权 查看有关它的信息。
要授予用户对所有数据库的完全访问权限,您可以键入此内容(以root身份或具有“grant option”的用户):
GRANT ALL ON *.* TO 'someuser'@'somehost';