2009-06-12 29 views
9

Estoy familiarizado con la interfaz java.sql.DatabaseMetaData, pero me parece bastante complicado de usar. Por ejemplo, para averiguar los nombres de tabla, debe llamar al getTables y recorrer el ResultSet devuelto, utilizando literales bien conocidos como nombres de columna.¿La forma más fácil de obtener metadatos de base de datos en Java?

¿Existe alguna manera más fácil de obtener metadatos de base de datos?

Respuesta

11

se realiza Es fácilmente usando 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

Tome un vistazo a SchemaCrawler (libre y de código abierto), que es otra API diseñado para este propósito. Parte del código SchemaCrawler muestra:

// 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

¿Es necesario cerrar la conexión sí mismo o hace el método() getDatabase hace eso para usted? –

+0

@AndrewSwan - SchemaCrawler no cerrará la conexión por usted. Debe cerrarlo usted mismo. –

+0

En ese caso, ¿le gustaría actualizar su ejemplo para que cierre la conexión en un bloque finally? –

Cuestiones relacionadas