首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -I无法查看预设mysql数据库中的表,但可以查看用户创建的数据库中的表

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

Stack Overflow用户
提问于 2013-12-06 00:51:38
回答 1查看 179关注 0票数 0

我的代码有一个非常严重的问题,我正在开发一个数据库GUI应用程序。这个应用程序的目标是提供一个界面来管理类似于phpMyAdmin的databases..Its。我正在获取所有的数据库,并在JTree上显示它们,在单击每个数据库时,将其表显示为树叶。我现在的问题是,除了那些随mysql安装而来的数据库(Information_schema、mysql、test、performance_schema..etc)之外,所有的数据库都像预期的那样显示了它们的表。树上不显示括号中每个数据库下的表,只显示用户创建的databases..ie上的表。那些数据库是我自己创建的。但是显示的是mysql安装附带的数据库,但每个数据库都有空表。我不知道我的连接URL中是否遗漏了什么。代码的可能摘要如下:

代码语言:javascript
复制
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();
}

在我的Database类中,我有以下字段

代码语言:javascript
复制
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中选择数据库,因为我将处理所有数据库。

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

EN

回答 1

Stack Overflow用户

发布于 2013-12-06 01:06:47

这可能是权限问题。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身份,或具有“授予选项”的用户):

代码语言:javascript
复制
GRANT ALL ON *.* TO 'someuser'@'somehost';
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20405900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档