2009-06-12 31 views
9

私はjava.sql.DatabaseMetaDataインターフェイスに精通していますが、私はそれを使用するには非常にclunkyを見つける。たとえば、テーブル名を調べるには、getTablesを呼び出して、よく知られているリテラルを列名として使用して、返されたResultSetをループする必要があります。Javaでデータベースメタデータを取得する最も簡単な方法は?

データベースメタデータを取得する簡単な方法はありますか?

答えて

11

これは、簡単にDdlUtilsを使用して行われています:

import javax.sql.DataSource; 
import org.apache.ddlutils.Platform; 
import org.apache.ddlutils.PlatformFactory; 
import org.apache.ddlutils.model.Database; 
import org.apache.ddlutils.platform.hsqldb.HsqlDbPlatform; 

public void readMetaData(final DataSource dataSource) { 
    final Platform platform = PlatformFactory.createNewPlatformInstance(dataSource); 
    final Database database = platform.readModelFromDatabase("someName"); 
    // Inspect the database as required; has objects like Table/Column/etc. 
} 
6

は、この目的のために設計された別のAPIである、SchemaCrawlerは(フリーかつオープンソース)を見てみましょう。いくつかのサンプルSchemaCrawlerはコード:

// Create the options 
final SchemaCrawlerOptions options = new SchemaCrawlerOptions(); 
// Set what details are required in the schema - this affects the 
// time taken to crawl the schema 
options.setSchemaInfoLevel(SchemaInfoLevel.standard()); 
options.setShowStoredProcedures(false); 
// Sorting options 
options.setAlphabeticalSortForTableColumns(true); 

// Get the schema definition 
// (the database connection is managed outside of this code snippet) 
final Database database = SchemaCrawlerUtility.getDatabase(connection, options); 

for (final Catalog catalog: database.getCatalogs()) 
{ 
    for (final Schema schema: catalog.getSchemas()) 
    { 
    System.out.println(schema); 
    for (final Table table: schema.getTables()) 
    { 
     System.out.print("o--> " + table); 
     if (table instanceof View) 
     { 
     System.out.println(" (VIEW)"); 
     } 
     else 
     { 
     System.out.println(); 
     } 

     for (final Column column: table.getColumns()) 
     { 
     System.out.println("  o--> " + column + " (" + column.getType() 
          + ")"); 
     } 
    } 
    } 
} 

http://schemacrawler.sourceforge.net/

+0

あなたが接続を自分で閉じる必要がありますかgetDatabase()メソッドは、あなたのためにそれを行うんですか? –

+0

@AndrewSwan - SchemaCrawlerは接続を閉じません。あなたはそれを自分で閉じる必要があります。 –

+0

その場合、finallyブロックの接続を閉じるようにサンプルを更新したいかもしれませんか? –

関連する問題