一、问题描述
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