Salta el contingut

1. Metadata de la base de dades

Abans de recuperar dades, estudiarem com obtenir informació sobre la base de dades a la qual estem connectats. Les metadades d'una base de dades descriuen l'estructura que té: les taules que componen la base de dades, els camps que formen aquestes taules, els tipus d'aquests camps, etc. Tot i que normalment coneixem aquesta estructura prèviament, és possible que en necessitem informació en alguna ocasió, per això tenim les interfícies DatabaseMetaData i ResultSetMetaData.

La interfície DatabaseMetaData ens proporciona informació sobre les taules i vistes de la base de dades, així com la seva estructura. A continuació tenim alguns dels mètodes més rellevants d'aquesta interfície.

  • String getDatabaseProductName() \(\rightarrow\) Obté el nom del SGBD.
  • String getDriverName() \(\rightarrow\) Obté el nom del controlador JDBC que s'està utilitzant.
  • String getURL() \(\rightarrow\) Obté l'URL de la connexió.
  • String getUserName() \(\rightarrow\) Obté el nom de l'usuari connectat a la base de dades.
  • ResultSet getTables(String catalog, String schema, String patternTableName, String[] type) \(\rightarrow\) Obté informació de les taules disponibles en el catàleg indicat.
  • ResultSet getColumns(String catalog, String schema, String patternNameTable, String patternColumnName) \(\rightarrow\) Obté informació dels camps de la taula especificada en el catàleg i esquema indicats.
  • ResultSet getPrimaryKeys(String catalog, String schema, String patternNameTable) \(\rightarrow\) Obté la llista de camps que formen la clau primària.
  • ResultSet getImportedKeys(String catalog, String schema, String patternNameTable) \(\rightarrow\) Obté una llista amb les claus externes definides a la taula.
  • ResultSet getExportedKeys(String catalog, String schema, String patternNameTable) \(\rightarrow\) Obté una llista amb les claus externes que apunten a aquesta taula.

Informació

En aquest punt, cal assenyalar que els termes catàleg i esquema tendeixen a confondre's. Segons els estàndards, un catàleg conté diversos esquemes, amb informació detallada del sistema, des de la forma d'emmagatzematge intern fins als esquemes conceptuals. En un catàleg, sembla que hi ha un esquema anomenat INFORMATION_SCHEMA, amb les vistes i dominis de l'esquema d'informació del sistema.

En tot cas, la majoria dels SGBD coincideixen el catàleg amb el nom de la base de dades. A més, en aquesta consulta especifiquem el nom de la base de dades com a catàleg, mentre que si obrim MySQLWorkbench, la base de dades es representa com un esquema. Podeu trobar més informació sobre això en aquests enllaços:

1.1. Exercisi resolt

Anem a crear un programa Java que mostri informació interna d'una base de dades BDJocs, mitjançant DataBaseMetaData. Veurem el programa pas a pas.

Info

Podeu veure tota la informació del mètode i com les dades s'emmagatzemen en cada ResultSet del mètode en aquest enllaç.

1.1.1. Crear la connection

Recorda com connectar-te a un SGBD de manera senzilla:

Java
1
2
3
4
// load JDBC driver
2 Class.forName("com.mysql.cj.jdbc.Driver");
3 // Connecto to DBMS and DB BDJosc, with user and pass
4 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3308/BDJocs", "root", "root");

Molt senzill, carrega el controlador i connecta't a la base de dades de la manera que hem estudiat.

1.1.2. Recupera les metadades del SGBD i mostra-les en un format amigable

Utilitzarem la classe Color per mostrar les dades en format de text en la consola. Teniu aquesta classe a l'APAC1, dins del projecte.

Java
1
2
3
4
5
6
7
8
// get the metadata
DatabaseMetaData dbmd = con.getMetaData();

System.out.println(Colors.Blue+"\nDBMS information--------"+Colors.Reset);
System.out.println(Colors.Bright_White+"SGBD:\t"+Colors.Reset + dbmd.getDatabaseProductName());
System.out.println(Colors.Bright_White+"SGBD:\t"+Colors.Reset + dbmd.getDriverName());
System.out.println(Colors.Bright_White+"SGBD:\t"+Colors.Reset + dbmd.getURL());
System.out.println(Colors.Bright_White+"SGBD:\t"+Colors.Reset + dbmd.getUserName());

Com podeu veure, obtenim el nom del SGBD, el controlador, l'URL i l'usuari que estem utilitzant. Òbviament, és el mateix que vam posar quan vam crear l'objecte Connection, però és un bon exemple per mostrar informació.

1.1.3. Recuperar taules en un esquema/base de dades

Utilitzant el mètode getTables() podem recuperar les taules i més informació. Suposem que BDJocs existeix al nostre SGBD:

Java
1
2
3
4
5
6
System.out.println(Colors.Bright_White+String.format("%-15s %-15s %-15s","Database","Table","Type"));
System.out.println("-------------------------------------------------------"+Colors.Reset);
ResultSet rsmd = dbmd.getTables("BDJocs", null, null, null);
while (rsmd.next()) {
  System.out.println(String.format("%-15s %-15s %-15s",rsmd.getString(1),rsmd.getString(3),rsmd.getString(4)));
}

Comentaris:

Repassa String.format() per establir una longitud específica de cada columna.

Segons la documentació de javadoc, obtenim que el ResultSet retornat per getTables té les següents columnes:

  1. TABLE_CAT String → catàleg de la taula (pot ser nul)
  2. TABLE_SCHEM String → esquema de la taula (pot ser nul)
  3. TABLE_NAME String → nom de la taula
  4. TABLE_TYPE String → tipus de taula. Els tipus típics són "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM".
  5. REMARKS String → comentari explicatiu sobre la taula
  6. TYPE_CAT String → catàleg dels tipus (pot ser nul)
  7. TYPE_SCHEM String → esquema dels tipus (pot ser nul)
  8. TYPE_NAME String → nom del tipus (pot ser nul)
  9. SELF_REFERENCING_COL_NAME String → nom de la columna "identificador" designada d'una taula indicada (pot ser nul)
  10. REF_GENERATION String → especifica com es creen els valors a SELF_REFERENCING_COL_NAME. Els valors poden ser "SYSTEM", "USER", "DERIVED". (pot ser nul)

Obtenim les columnes 1, 3 i 4.

1.1.4. Obtenir les columnes de la taula

És el moment d'obtenir les columnes d'una taula, utilitzant el mètode getColumns():

Java
String table=...; // we set the name of an existing table
ResultSet columnes = dbmd.getColumns("BDJocs",null , taula, null);
System.out.println(Colors.Bright_White+String.format("%-25s %-15 s%-15s","Atribut/Claus","Tipus","Pot ser nul?"+Colors.reset));

while (columnes.next()){
    String columnName=columnes.getString(4);
    String tipus=columnes.getString(6);
    String nullable=columnes.getString(18);

    System.out.println(String.format("%-25s %-15s %15s",columnName,tipus,nullable));
}

Comentaris:

  • getColumns() retorna un ResultSet amb 24 columnes, amb molta informació de la taula. Només obtenim les columnes 4, 6 i 18 amb el nom, el tipus i si pot ser nul. Podeu consultar la documentació de javadoc per obtenir més informació.
  • De la mateixa manera, per obtenir informació sobre les claus, podem utilitzar:
    • getPrimaryKeys() retorna un ResultSet amb les claus primàries de les taules.
    • getExportedKeys() retorna un ResultSet amb les columnes que apunten a la clau primària de la taula actual. Això significa tots els camps d'altres taules que apunten a la clau primària de la taula actual.
    • getImportedKeys() retorna un ResultSet amb les columnes que són claus primàries importades a la taula actual. Això significa les columnes que són claus externes (i apunten a una clau primària d'altres taules).

Teniu tot l'exemple a la carpeta DatabaseMeta de l'aplicació d'exemple i al següent enllaç.