【问题标题】:Error with getting all tables from a database using DatabaseMetaData使用 DatabaseMetaData 从数据库中获取所有表时出错
【发布时间】:2022-01-02 02:31:26
【问题描述】:

我想从数据库中检索所有表,以便计算它们的行数并最终计算数据库中当前的所有元素。我正在尝试使用 Java 的 DatabaseMetaData 来做到这一点。

这是我的构造函数的内容,它负责建立与数据库的连接:

String driver = "com.mysql.cj.jdbc.Driver";
String fullUrl = "jdbc:mysql://"+ url + "/" + db;
  
try {
    Class.forName(driver);
    setConn(DriverManager.getConnection(fullUrl, username, password));
} 

连接到 WAMP 服务器,并且在此之前的多次尝试都可以完全正常工作。有人可以帮我解决这个问题吗?

这是我正在实现的用于计算数据库中所有元素的方法,并且 countRowsInTable 方法已经实现并且可以工作。

public int countElementsInDB(String dbName) {
    DatabaseOperations db = new DatabaseOperations("localhost:3306", dbName, user, password);
    try {
        DatabaseMetaData databaseMetaData = conn.getMetaData();
        String[] types = {"TABLE"};
        ResultSet rs1 = databaseMetaData.getTables(null, null, "%", types);
        int counter = 0;
        while(rs1.next()){
            counter += countRowsInTable(rs1.getString("TABLE_NAME"));
        }
        return counter;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return -1;
}

该代码正在运行,但实际上正在返回服务器中存在的所有数据库中的所有表,即使我使用的 URL 表示此处有问题的数据库。如何让它只返回我所针对的数据库中的表?

【问题讨论】:

  • 您可能需要将数据库名称作为第一个参数传递给getTables(..) (catalog),也许是第二个参数。
  • 需要在getTables方法的第二个参数中设置数据库名
  • 感谢两位的帮助。但是,按照您的建议在第一个或第二个参数中传递数据库名称不起作用。事实上,将它作为第一个参数传递会返回一个空的ResultSet,并将它传递到第二个参数会导致与我的原始代码相同的输出。我一直在想是不是服务器端有问题?我这样说是因为同一个连接只针对相关数据库,而不是所有数据库。

标签: java mysql sql database-metadata


【解决方案1】:

一位朋友提出了以下建议,该建议仅适用于有权访问服务器及其数据库并允许更改其中的表的情况。例如,如果目标数据库是“human_resources”,我们可以简单地将其所有表更改为具有诸如“hr”之类的前缀,然后将其作为第三个参数传递给 getTables 方法:

ResultSet rs1 = databaseMetaData.getTables(null, null, "hr%", types);

这解决了问题,但需要更改数据库。对我来说仍然是一个足够好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多