使用Java DatabaseMetaData查询表时返回全库表,如何仅获取目标库表
问题解决方法
问题原因
MySQL的JDBC驱动中,DatabaseMetaData.getTables()方法的第一个入参对应数据库名(catalog),你传入null时,驱动会返回当前连接拥有访问权限的所有数据库的表,即使连接URL中指定了默认数据库也不会自动做过滤。
修改方案
你只需要给getTables()方法的第一个参数传入目标数据库名称即可,有两种实现方式:
- 直接传入方法入参的
dbName:
ResultSet rs1 = databaseMetaData.getTables(dbName, null, "%", types);
- 从当前连接动态获取默认库名,不用硬传入参数,适配性更强:
ResultSet rs1 = databaseMetaData.getTables(conn.getCatalog(), null, "%", types);
修改后完整参考代码
public int countElementsInDB(String dbName) { // 注意:此处创建的DatabaseOperations对象当前代码未使用,可自行确认是冗余代码还是conn获取逻辑需要调整 DatabaseOperations db = new DatabaseOperations("localhost:3306", dbName, user, password); try { DatabaseMetaData databaseMetaData = conn.getMetaData(); String[] types = {"TABLE"}; // 传入目标数据库名做过滤 ResultSet rs1 = databaseMetaData.getTables(dbName, null, "%", types); int counter = 0; while(rs1.next()){ counter += countRowsInTable(rs1.getString("TABLE_NAME")); } return counter; } catch (Exception e) { e.printStackTrace(); } return -1; }
注意事项
- Linux环境下MySQL默认对库名、表名大小写敏感,Windows环境默认不敏感,传入的
dbName要和数据库实际创建时的名称大小写保持一致,避免匹配不到。 - 确认代码中使用的
conn对象确实是目标数据库的连接,避免拿到其他连接的库信息。
内容的提问来源于stack exchange,提问作者Zouhair
相关产品推荐
相关产品推荐

