Estrapolare i database metadata con JDBC in Java

Estrapolare i database metadata con JDBC in Java

Usando JDBC, è abbastanza semplice identificare i metadata di un db.

Ogi vediamo qualche esempio, in cui andremmo a prendere diverse info su db e tabelle.

Ovviamente dovete aggiungere il driver JDBC al vostro progetto; se usate Maven aggiungete questo al vostro pom.xml:

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

Bene, vediamo due metodi:

  • nel primo tireremo fuori le info generali sul db
  • nel secondo, estrapoleremo info su una tabella passata come argomento.

Ecco il codice:

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {

    private static final String URL = "jdbc:mysql://localhost:3306/countries_states?zeroDateTimeBehavior=convertToNull";
    private static final String USERNAME = "user";
    private static final String PASSWORD = "pwd";

    public static void main(String[] args) {
        getDbMetaData();
        getTableMetaData("countries");
    }

    private static void getDbMetaData() {
        try {
            try (Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD)) {
                DatabaseMetaData metaData = conn.getMetaData();
                if (metaData != null) {
                    System.out.println("Versione database: " + metaData.getDatabaseProductVersion());
                    System.out.println("Nome driver: " + metaData.getDriverName());
                    System.out.println("Versione driver: " + metaData.getDriverVersion());
                    System.out.println("URL: " + metaData.getURL());
                    System.out.println("Username: " + metaData.getUserName());
                    System.out.println((metaData.supportsANSI92FullSQL() ? "ANSI92FullSQL supportata" : "ANSI92FullSQL non supportata"));
                    System.out.println((metaData.supportsTransactions() ? "Transazioni suppoprtate" : "Transazioni non suppoprtate"));
                } else {
                    System.out.println("I metadati non sono supportati");
                }
                System.out.println("--------------------------------------");
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }

    private static void getTableMetaData(String table) {
        try {
            try (
                    Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
                    Statement stmt = conn.createStatement();
                    ResultSet rs = stmt.executeQuery("SELECT * FROM " + table)) {
                    ResultSetMetaData rsmd = rs.getMetaData();
                if (rsmd != null) {
                    int cols = rsmd.getColumnCount();
                    System.out.println("Numero di colonne: " + cols);
                    System.out.println("Nome tabella: " + rsmd.getTableName(1));
                    System.out.println("Nome database: " + rsmd.getCatalogName(1));
                    System.out.println("--------------------------------------");
                    for (int i = 1; i <= cols; i++) {
                        System.out.println("Nome colonna: " + rsmd.getColumnName(i));
                        System.out.println("Tipo colonna: " + rsmd.getColumnTypeName(i));
                        System.out.println("Nome classe Java: " + rsmd.getColumnClassName(i));
                        System.out.println("--------------------------------------");
                    }
                } else {
                    System.out.println("I metadati non sono supportati");
                }
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }
}

Questo l'output:

Versione database: 5.5.5-10.0.28-MariaDB-0+deb8u1
Nome driver: MySQL-AB JDBC Driver
Versione driver: mysql-connector-java-5.1.6 ( Revision: ${svn.Revision} )
URL: jdbc:mysql://flocalhost:3306/countries_states?zeroDateTimeBehavior=convertToNull
Username: user
ANSI92FullSQL non supportata
Transazioni suppoprtate
--------------------------------------
Numero di colonne: 5
Nome tabella: countries
--------------------------------------
Nome database: countries_states
Nome colonna: country_id
Tipo colonna: INT
Nome classe Java: java.lang.Integer
--------------------------------------
Nome colonna: country_name
Tipo colonna: CHAR
Nome classe Java: java.lang.String
--------------------------------------
Nome colonna: country_code_3
Tipo colonna: CHAR
Nome classe Java: java.lang.String
--------------------------------------
Nome colonna: country_code_2
Tipo colonna: CHAR
Nome classe Java: java.lang.String
--------------------------------------
Nome colonna: country_published
Tipo colonna: TINYINT
Nome classe Java: java.lang.Boolean
--------------------------------------

Come vedete, tiriamo su parecchie info.

Volendo andare ancora più a fondo, potete usare ParameterMetaData per avere info su eventuali parametri passati alle Prepared Statement.

Enjoy!