一、问题描述
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
版权声明:本文为flying_monkey_1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。