2009-06-12 9 views
9

Ho familiarità con l'interfaccia java.sql.DatabaseMetaData, ma la trovo abbastanza goffa da usare. Ad esempio, per trovare i nomi delle tabelle, è necessario chiamare getTables e passare attraverso il numero restituito ResultSet, utilizzando letterali noti come nomi di colonne.Il modo più semplice per ottenere i metadati del database in Java?

C'è un modo più semplice per ottenere i metadati del database?

risposta

11

E 'facilmente fatto utilizzando 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

Date un'occhiata a SchemaCrawler (libero e open source), che è un altro API progettato per questo scopo. Alcuni di codice di esempio 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

Avete bisogno di chiudere la connessione se stessi o fa il metodo() getDatabase farlo per voi? –

+0

@AndrewSwan - SchemaCrawler non chiude la connessione per te. Devi chiuderlo da solo. –

+0

In tal caso, è possibile aggiornare l'esempio in modo che chiuda la connessione in un blocco finale? –

Problemi correlati