繁体   English   中英

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

[英]Java - I cannot view tables in preset mysql databases but can view on user-created databases

我的代码有一个非常严重的问题,我正在开发数据库GUI应用程序。 该应用程序的目的是提供一个管理数据库的界面。它有点像phpMyAdmin。 我正在获取所有数据库,并将它们显示在JTree上,在单击每个数据库后,将其表显示为叶子。 我的问题现在是,所有数据库均按预期显示其表,除了我所指的与mysql安装一起提供的那些数据库(Information_schema,mysql,test,performance_schema..etc)。 括号中的每个数据库下的表都不会显示在树上,而只会显示用户创建的数据库上的表。 我创建自己的那些数据库。 但是显示的是mysql安装附带的数据库,但每个数据库都有空表。 我不知道我的连接URL中是否缺少某些内容。 该代码的可能摘要如下:

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中选择数据库,因为我将要在所有数据库上工作。

我什至进行了一项测试,当单击每个数据库时,该对话框会在对话框中显示每个数据库的名称,并且效果很好。

可能是权限问题。 根拥有对所有系统信息的完全访问权限。 但是,个人用户受到的限制更大(引用从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';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM