如何从数据库中获取所有表名?

Max*_*AMM 57 java database jdbc database-metadata

我想从数据库模式中检索所有表名,如果可能的话,让所有表以指定的前缀开头.

我尝试使用JDBC,connection.getMetaData().getTables()但它根本不起作用.

Connection jdbcConnection = DriverManager.getConnection("", "", "");
DatabaseMetaData m = jdbcConnection.getMetaData();
ResultSet tables = m.getTables(jdbcConnection.getCatalog(), null, "TAB_%", null);
for (int i = 0; i < tables.getMetaData().getColumnCount(); i++) {
   System.out.println("table = " + tables.getMetaData().getTableName(i));
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

Pet*_*ang 125

您需要遍历ResultSet调用next().

这是java2s.com的一个例子:

DatabaseMetaData md = conn.getMetaData();
ResultSet rs = md.getTables(null, null, "%", null);
while (rs.next()) {
  System.out.println(rs.getString(3));
}
Run Code Online (Sandbox Code Playgroud)

3栏是TABLE_NAME(见文件DatabaseMetaData::getTables).

  • 如果这对你来说失败了(就像我做的那样),你需要确保数据库用户可以在数据库上实际显示表. (3认同)
  • 它显示了所有数据库中的所有表.您可以将数据库名称作为第一个参数传递给仅显示该数据库中的表. (3认同)
  • 对于 mysql,ResultSet rs = md.getTables(connection.getCatalog(), null, "%", new String [] {"TABLE"}); 仅提供当前模式的表。 (2认同)

小智 26

 public void getDatabaseMetaData()
    {
        try {

            DatabaseMetaData dbmd = conn.getMetaData();
            String[] types = {"TABLE"};
            ResultSet rs = dbmd.getTables(null, null, "%", types);
            while (rs.next()) {
                System.out.println(rs.getString("TABLE_NAME"));
            }
        } 
            catch (SQLException e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 它显示所有数据库中的所有表。您可以将数据库名称作为第一个参数传递,以仅显示该数据库中的表。 (2认同)

Pun*_*tel 5

在您的示例中,问题是在DatabaseMetaData的getTables函数中传递表名模式.

某些数据库支持大写标识符,有些支持小写标识符.例如,oracle以大写形式获取表名,而postgreSQL以小写形式获取它.

DatabaseMetaDeta提供了一种确定数据库如何存储标识符的方法,可以是大小写,大写,小写,请参阅:http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#storesMixedCaseIdentifiers( )

从下面的示例中,您可以获取所有表和提供表名模式的视图,如果只需要表,则从TYPES数组中删除"VIEW".

public class DBUtility {
    private static final String[] TYPES = {"TABLE", "VIEW"};
    public static void getTableMetadata(Connection jdbcConnection, String tableNamePattern, String schema, String catalog, boolean isQuoted) throws HibernateException {
            try {
                DatabaseMetaData meta = jdbcConnection.getMetaData();
                ResultSet rs = null;
                try {
                    if ( (isQuoted && meta.storesMixedCaseQuotedIdentifiers())) {
                        rs = meta.getTables(catalog, schema, tableNamePattern, TYPES);
                    } else if ( (isQuoted && meta.storesUpperCaseQuotedIdentifiers())
                        || (!isQuoted && meta.storesUpperCaseIdentifiers() )) {
                        rs = meta.getTables(
                                StringHelper.toUpperCase(catalog),
                                StringHelper.toUpperCase(schema),
                                StringHelper.toUpperCase(tableNamePattern),
                                TYPES
                            );
                    }
                    else if ( (isQuoted && meta.storesLowerCaseQuotedIdentifiers())
                            || (!isQuoted && meta.storesLowerCaseIdentifiers() )) {
                        rs = meta.getTables( 
                                StringHelper.toLowerCase( catalog ),
                                StringHelper.toLowerCase(schema), 
                                StringHelper.toLowerCase(tableNamePattern), 
                                TYPES 
                            );
                    }
                    else {
                        rs = meta.getTables(catalog, schema, tableNamePattern, TYPES);
                    }

                    while ( rs.next() ) {
                        String tableName = rs.getString("TABLE_NAME");
                        System.out.println("table = " + tableName);
                    }



                }
                finally {
                    if (rs!=null) rs.close();
                }
            }
            catch (SQLException sqlException) {
                // TODO 
                sqlException.printStackTrace();
            }

    }

    public static void main(String[] args) {
        Connection jdbcConnection;
        try {
            jdbcConnection = DriverManager.getConnection("", "", "");
            getTableMetadata(jdbcConnection, "tbl%", null, null, false);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)