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!
java sql jdbc databasemetadata parametermetadata resultsetmetadata
Commentami!