Java - 我无法在预设的mysql数据库中查看表,但可以在用户创建的数据库上查看

时间:2013-12-05 16:51:38

标签: java mysql database tree jtree

我的代码存在非常严重的问题,我正在研究数据库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中选择数据库,因为我要处理所有数据库..

我甚至运行了一个测试,在单击每个数据库时在对话框中显示每个数据库名称,并且它运行正常。

1 个答案:

答案 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';