【问题标题】:Java - I cannot view tables in preset mysql databases but can view on user-created databasesJava - 我无法查看预设 mysql 数据库中的表,但可以查看用户创建的数据库
【发布时间】:2013-12-05 16:51:37
【问题描述】:

我的代码有一个非常严重的问题,我正在开发一个数据库 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 中选择数据库,因为我将处理所有数据库..

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

【问题讨论】:

    标签: java mysql database tree jtree


    【解决方案1】:

    这可能是权限问题。 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 ALL ON *.* TO 'someuser'@'somehost';
    

    【讨论】:

    • 感谢您的及时回复。实际上我现在是唯一的用户,所以我使用的是 root 用户帐户和我为其配置的密码..同时我会尝试再次授予权限,即使我在为 root 设置密码时这样做了帐户。
    • 如果它不起作用,请告诉我,但它似乎符合您的问题,尤其是当您看到数据库时。
    • 是的,我已经做到了,但仍然没有办法,它说 0 行受到影响。我什至打开user表查看,发现root用户目前拥有所有权限,对所有表都有。
    • 也许我遗漏了一些细节。这就是我的假设……如果您通过普通客户端“mysql -u root”登录到 mysql,您将看到您想要的所有信息。然后,如果您从您的应用程序访问相同的 mysql 服务器,并为用户名和 root 密码提供“root”(如,您确认,使用断点/打印语句将其传递给 JDBC),您应该有权访问所有表和所有行。如果凭据没有正确传递,我会怀疑你在说什么,它只是以非特权用户的身份连接。
    • 好的,我现在真的明白你的意思了。在这种情况下,请查看我上面的代码并告诉我如何真正登录到服务器。因为我认为你是对的。这就是我进行连接的方式。连接 = DriverManager.getConnection(database.getUrl(), property);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多