我在从MySQL连接(本地运行,Ubuntu 14,使用Java和NetBeans)检索元数据时遇到问题。我从getColumns
对象的DatabaseMetaData
方法得到一个空结果集。
代码如下:
private static HashMap getColumnsFromDB(Connection con, String dbSchema, String tableName) throws SQLException
{
HashMap Columns = new HashMap();
DatabaseMetaData metadata = con.getMetaData();
ResultSet rsColumns = metadata. getColumns(null, dbSchema.toUpperCase(), tableName.toUpperCase(), "%");
while (rsColumns.next())
{
ColumnClass col = new ColumnClass();
col.column_name = rsColumns.getString("COLUMN_NAME");
col.mw_type = UtilClass.toClass(rsColumns.getInt("DATA_TYPE")); // Convert to java type
col.is_nullable = rsColumns.getString("IS_NULLABLE");
col.column_default = rsColumns.getString("COLUMN_DEF");
Columns.put( col.column_name, col);
}
return Columns;
}
我可以正常地对数据库进行查询,用户是DBA,表中有列,我在其他问题中看到,在处理案例等方面可能会有点棘手,但我尝试了很多方法,没有得到预期的结果。
最佳答案
在MySQL中,“Schema”和“Database”的意思是一样的。测试表明MySQL Connector/J没有注意方法的schemaPattern
参数。
所以,如果使用
jdbc:mysql://localhost/db1
然后尝试使用
DatabaseMetaData metadata = con.getMetaData();
ResultSet rsColumns = metadata.getColumns(null, "db2", "mytable", "%");
如果数据库
DatabaseMetaData#getColumns
中没有名为db2
的表,您将得到一个空结果集。为了检索mytable
中表的信息,您需要使用db1
参数DatabaseMetaData metadata = con.getMetaData();
ResultSet rsColumns = metadata.getColumns("db2", null, "mytable", "%");
或使用
db2
更改当前数据库con.setCatalog("db2");
DatabaseMetaData metadata = con.getMetaData();
ResultSet rsColumns = metadata.getColumns(null, null, "mytable", "%");
请注意,在上面的两个工作示例中,第二个参数——
catalog
——是setCatalog
,但实际上它可以是任何东西;它只是被忽略了。编辑回复:评论
OP报告说,设置
schemaPattern
参数确实是必需的方法,而且在Linux下,表名(可能还有列名)似乎是区分大小写的。(我的测试表明,这些名称在Windows下不区分大小写。)