一、问题描述
DatabaseMetaData .getTables()方法常常用来获取数据库中的所有表信息。
但我想要获取我的本地数据库db_test中的表信息,出现了错误。
try {
Connection conn = DBManager.getConnection();
DatabaseMetaData metaData = conn.getMetaData();
ResultSet tableRet = metaData.getTables(null, "%", "%",
new String[]{"TABLE"});
while (tableRet.next()) {
String tableName = (String) tableRet.getObject("TABLE_NAME");
TableInfo ti = new TableInfo(tableName, new HashMap<String, ColumnInfo>(),
new ArrayList<ColumnInfo>());
tables.put(tableName, ti);
ResultSet set = metaData.getColumns(null, "%", tableName,
"%");
while (set.next()) {
ColumnInfo ci = new ColumnInfo(set.getString("COLUMN_NAME"),
set.getString("TYPE_NAME"), 0);
ti.getColumns().put(set.getString("COLUMN_NAME"), ci);
}
// 查询表的主键
ResultSet set2 = metaData.getPrimaryKeys(null, "%", tableName);
while (set2.next()) {
ColumnInfo ci2 = (ColumnInfo) ti.getColumns().get(set2.getObject("COLUMN_NAME"));
ci2.setKeyType(1);
ti.getPriKeys().add(ci2);
}
if (ti.getPriKeys().size() > 0) {
ti.setOnlyPriKey(ti.getPriKeys().get(0));
}
}
} catch (SQLException e) {
e.printStackTrace();
}


解决方案
mysql8.0的驱动,在5.5之前nullCatalogMeansCurrent属性默认为true,8.0中默认为false,官网链接地址。所以导致DatabaseMetaData.getTables()加载了全部的无关表。
解决方法是,在jdbc 创建连接的url后加上&nullCatalogMeansCurrent=true



本文介绍了一种在使用DatabaseMetaData.getTables()方法时遇到的问题,特别是在MySQL 8.0环境下,由于nullCatalogMeansCurrent属性的默认值改变,导致获取本地数据库表信息时出现错误的情况。文章提供了详细的解决方案,包括如何正确设置JDBC连接URL参数来避免加载无关表。





