我在从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下不区分大小写。)

10-08 13:27