【发布时间】: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