67

データベース スキーマからすべてのテーブル名を取得し、可能であれば、指定されたプレフィックスで始まるすべてのテーブルを取得したいと考えています。

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));
}

誰かがこれについて私を助けることができますか?

4

8 に答える 8

139

ResultSetの呼び出しを繰り返す必要がありますnext()

これはjava2s.comの例です:

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

3TABLE_NAME(のドキュメントを参照DatabaseMetaData::getTables)です。

于 2010-05-06T10:38:11.120 に答える
30
 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();
        }
    }
于 2013-05-16T06:28:40.897 に答える
7

あなたの例の問題では、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();
        }
    }
}
于 2014-03-21T05:50:42.100 に答える
4

データベース スキーマ メタデータに関する多くの JDBC の複雑さを隠す高レベル API を使用する場合は、次の記事をご覧ください: http://www.devx.com/Java/Article/32443/1954

于 2010-05-06T19:59:17.057 に答える