JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

116
Pág. 1 de 125 Títol: JDBC DatabaseMetaData Volum: 1/1 Alumne: Joan Costa Canal Director/Ponent: Lluís Solano Albajes Departament: LSI Data: 08-07-2007

Transcript of JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Page 1: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Pág. 1 de 92

Títol: JDBC DatabaseMetaData

Volum: 1/1

Alumne: Joan Costa Canal

Director/Ponent: Lluís Solano Albajes

Departament: LSI

Data: 08-07-2007

Page 2: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Pág. 3 de 92

Page 3: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

DADES DEL PROJECTE

Títol del Projecte:JDBC DatabaseMetadata

Nom de l'estudiant: Joan Costa Canal

Titulació: Enginyeria en Informàtica

Crèdits: 15 crèdits

Director/Ponent: Lluís Solano Albajes

Departament: LSI

MEMBRES DEL TRIBUNAL (nom i signatura)

President: Lluís Pérez Albajes

Vocal: Josep Elgueta Monto

Secretari: Lluís Solano Albajes

QUALIFICACIÓ

Qualificació numèrica:

Qualificació descriptiva:

Data:

Pág. 5 de 92

Page 4: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Índex

Agraïments

Capítol 1 – Introducció ......................................................................................... 11

Capítol 2 - Anàlisi de requeriments ..................................................................... 19

Capítol 3 – Conceptes sobre Bases de Dades i Java JDBC ................................ 27

Capítol 4 – Casos d´ús ......................................................................................... 55

Capítol 5 – Disseny i Implementació .................................................................... 59

Capítol 6 – Joc de proves ..................................................................................... 71

Capítol 7 – Planificació i Costos Reals ................................................................. 83

Capítol 8 – Conclusions ........................................................................................ 87

Capítol 9 – Bibliografia .......................................................................................... 89

Apèndix 1: Definicions i Acrònims ......................................................................... 91

Apèndix 2: Breu Manual d’usuari .......................................................................... 93

Pág. 7 de 92

Page 5: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Agraïments

Vull agrair la col.laboració del meu director Lluís Solano en donar-me pautes per a la realització del PFC.

Pág. 9 de 92

Page 6: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

1 Introducció

Aquest capítol està destinat a descriure el projecte fent ènfasi en els objectius, motius de realització i justificació del projecte, Es detalla les eines de treball emprades. La part final explica com estructura la documentació del projecte.

1.1 Descripció i objectius del projecteEl projecte consisteix en el desenvolupament (especificació, disseny i implementació) d’una eina que ens permeti interactuar amb diferents gestors de Bases de Dades relacionals. Una eina que ens doni com s’estructura una Bases de Dades (objectes) i quines dades s’hi guarden.

L’objectiu principal del treball es demostrar un possible ús de l’especificació JDBC, centrarnos en una part de la mateixa (interface DatabaseMetaData): els metadatos de les Bases de Dades o dit informalment tota la informació que es pot extreure d’una Base de Dades des del punt de vista intern (descripció taules, vistes, procediments) sense oblidar l’extern (contingut taules). I es que la tecnologia o especificació JDBC de Java pot oferir grans possibilitats de les quals intentarem aprofitar una part.i el qual obre tot un ventall amplíssim de possibilitats.

L’objectiu es desenvolupar una eina bàsica que pugui accedir a la informació de les bases de dades més comunes o més usades en el mercat avui dia.. Per a portar-ho a terme, el llenguatje escollit es Java i la API JDBC de Java per accedir a les Bases de Dades.

Característiques principals inicials de la eina:

Definir conexions a Bases de Dades en funció de la parametrització dels driversCaldrà Especificar paràmetres de cada conexió: Ports (“listeners” o “oients” de peticions), usuari, passoword….

Visualitzar les Bases de Dades de sistema i d’usuari. Visualitzar definicions de taules, vistes i indexs de sistema i d’usuari. Visualitzar les claus primaries i claus forànees. Visualitzar autoritzacions operacions sobre Taules i camps. Visualitzar procediments emmagatzemats i llurs paràmetres d’entrada I sortida. Executar Sentencies SQL que l’usuari desitji (consultes, actualitzacions …)

1.2 MotivacióDes de fa més de 12 anys laboralment he estat treballant exclusivament en el mon Host. He treballat amb IBM 3090 però la major part ha estat i és avui dia dins sistema IBM AS/400. Dins el mon financer (treballo en una entitat financera) continua viu el llenguatge COBOL i que de ben segur causarà sorpresa en ambient purament universitaris... Una motivació que m’ha mogut personalment és entrar al món visual i al món de la programació orientada a objectes. El llenguatge no podia ser altre que Java. I com tota empresa que es gestioni informàticament, la part importat son les Bases de Dades Relacionals. Així entra el treball amb JDBC. I com que a tot empresa solen existir diferentes cases de SGBDR amb

Pág. 11 de 92

Page 7: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

cadascuna la seva arquitectura i gestió, aquí entra el sentit del projecte JDBC DatabaseMetaData: una eina única que tracta diferents gestors.

La programació orientada a objectes (POO) és la metodologia molt emprada actualment, i el llenguatge de modelització UML.... i com no, el llenguatge de programació Java en són els eixos principals. En Java tot són objectes (classes).

1.3 Estudi del mercatConvé preguntar-nos si al mercat existeixen ja eines semblants al que es vol realiltzar. Doncs si, existeixen alternatives. Les analitzarem i extraurem conclusions.

1.3.1 Alternatives al Mercat En l’estudi del mercat he vist que ja hi han alternatives. He descobert que la principal competidora del JDBC DatabaseMetaData és JDBC Manager. En destaquem:

JDBC Manager (URL: http://jdbcmanager.sourceforge.net/)

JDBC Manager

Es una eina que usa Java Swing GUI (front end) que permet conectarse a qualsevol JDBC Driver i amb l’ús ANSI SQL-92. És una bona ideia del creador Francisco Morero Peyrona. Va començar a realitzar el projecte al set-02 i va començar a escriure codi al gen-03. La versió penjada a la web es la 0.4 i es del 2004 i no hi ha continuitat com a eina independent.. Ha estat testejat per a treballar amb Microsoft SQL Server i usa SQL-92. (revisió major del SQL-87). I aquí s’ha quedat.

Pág. 12 de 92

Page 8: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Però precisament Sun Microsystems buscava un mòdul que ajudés a les tasques de gestió de bases de dades i que es pogués integrar al IDE oficial de Sun: NetBeans. Es curiós que hi han moltes eines de programació que no tenen integrat en el propi IDE l’acces a les Bases de Dades. Un exemple paral.lel es el propi Eclipse que cal usar plugins per a tenir aquesta funcionalitat integrada (exemples: Eclipse SQL Explorer). Amb tot això, el JDBC Explorer va ser seleccionat per ser integrat a la versió NetBeans que va sortir a finals del 2005. Felicitats pel creador.

SQL Developer (Oracle)

Es un explorador de dades que usa també els conectors JDBC. Permet treballar amb SQL i amb PL/SQL, realitzar informes … Malgrat permetre accés a altres bases de dades, veiem que està encarat a usar-se sobretot en les pròpies bases de dades Oracle.

Oracle SQL Developer

1.3.2 Conclusions

Analitzat les alternatives de mercat trobem alguns motius de pes:

No trobem eines independents que suportin la riquesa de les últimes implementacions de JDBC i de SQL3. La versió lliure de JDBC Manager s’ha quedat ja desfasada i descontinuada.

No treballen correctament per a quelsevol SGBDR. I es que, i tal com es també passa en el projecte, realitzar un programa que serveixi per a qualsevol gestor es fa realment complex donat que cada gestor té les seves particularitats. Tots son relacionals però d’arquitectures ben diferentes.

No generen informes amb sortida a EXCEL i a PDF de forma directa, per dir alguns formats. A l’empresa s’usa bastant.

Pág. 13 de 92

Page 9: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

1.4 Justifiació del projecteConvé preguntar-nos si el projecte té sentit el realiltzar-ho. Doncs bé, des del meu punt de vista i observant per exemple en la entitat on treballo la resposta es que si. Una eina que fos generalista, àmplia i robusta i amb moltes funcionalitats a les Bases de Dades crec que tindria gran ús i utilitat. Avui dia encara veig com s’accedeix a la informació de forma rudimentaria i es generan informes usant formes ja desfasades i propietaries. No entro en detall de com es fa, però observo que el punt important per l’empresa es que funcionen i donen els resultats esperats.

Amb l’eina inicial que es proposa, i mirant la entitat on treballo, concretament podira incialment:

Accedir a les Bases de Dades DB2 i popietaria de IBM AS/400. Accedir a les Bases de Dades SQL Server y Oracle que s’usen a la web d’accès a la

entittat. Veure els objectes de les Bases de Dades. En el IBM AS-400 podria veure els arxius

físics i arxius lògics. Podria mantenir Taules (crear-ne, alterar-les afegint camps, canviant accessos…).

Però usant l’eina es guanyaria molt de temps en la elaboració d’informes i anàlisi de dades? Doncs si, si l’eina fos capaç de seleccionar la informació (guardar consultes) que es vol treure i generar sortides EXCEL i en PDF.

Per altra banda, ens preguntem ara: els SGBDR ja porten els seus exploradors (GUI) d’acces a les Bases de Dades. Aleshores, continua servint l’eina? Si, ja que és una única eina d’accés a diferents arquitectures de Bases de Dades dins un mateix patró o especificació d’accés a la informació: JDBC.

Però amb l’eina de mercat JDBC Manager presentada en el punt anterior no en tenim suficient? Doncs no. Primerament, l’eina ja no té versió independent actualitzada (última del 2004) i sols implementa part de la potencia de l’especificació JDBC i de la interface DatabaseMetaData. I sembla que no funciona per a qualsevol Base de Dades Relacional. 1.5 Eines de treball

1.5.1 Entorn proposat Es detalla a continuació les eines (software) emprat per a realitzar el projecte. S’especifica alguns detalls d’instalació i a on estan disponibles. Destacar la importància en la mesura del possible d’usar versions lliures. Per la finalitat del projecte és més que suficient.. Altrament, s’ha emprat com a base el sistema operatiu Windows XP tot i que es posible usar Linux.

JavaSE - JDK (Java Development Kit) Entorn de Desenvolupament en Java que inclou el JRE (Java Runtime Environment)). Inclou utilitats command-line de desenvolupament. S’ha instalat la versió Java SE - JDK 6u2 (la recent). Java SE ve de Java Standard Edition. Hi ha la JAVA EE (Enterprise Edition) pero que no es necessari pels objectius del projecte.Es pot trovar a URL: http://java.sun.com/javase/. Destinació instalació: “c:\Archivos de programa\Java”.

Pág. 14 de 92

Page 10: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

IDE EclipseEntorn de desenvolupament lliure potent i versàtil. Prové d’IBM. Es poden instalar sota ell multitud de plugins que afegeixen mils de funcionalitats (UML, bases dades, …)S’ha instalat la versió Eclipse SDK 3.3. Es pot trovar a URL: http://www.eclipse.org/

Entorn alternatius lliures: NetBeans IDE 6 (URL: http://www.netbeans.org/) . Prové de Sun. Entorn integrat que ja

inclou tot el necessari per realitzar aplicacions empresarials i aplicacions web. Oracle Jdeveloper 10g (v10.1.3.2 Build 4066) (Revisió: gener’07) (URL:

http://www.oracle.com/technologies/java/index.html)

Sistemes Gestors Bases de Dades Relacionals (SGBDR)

S’ha instal.lat les versión gratuites limitades de les versions comercilas complertes.Convé al instalar anotar els usuaris i passwords d’administrador asignats així com els ports que usen.

Versions lliures de les versions comercials

DB2 Express-C v9.1.2 Interface aplicació inclou espanyol. Es pot trovar a: http://www-306.ibm.com/software/data/db2/express/.Documentació útil de DB2 (manual online: Centre d’informació de la Base de Dades IBM DB2 per a Linux/Unix/Windows. Es pot trovar a: http://publib.boulder.ibm.com/infocenter/db2luw/v9//index.jsp .

Oracle Database 10g Release 2 Express Edition for Microsoft Windows IEs pot trovar a: http://www.oracle.com/technology/software/products/database/xe/htdocs/102xewinsoft.html S’ha baixat la versió Universial (Multi-Byte Unicode). Interface aplicació inclou espanyol.

Microsoft SQL Server 2005 Express Edition SP2Es pot trovar a: http://www.microsoft.com/downloads/details.aspx?familyid=31711D5D-725C-4AFA-9D65-E4465CDFF1E7&displaylang=es. Interface en Espanyol. Publicació: 28-feb-2007.

Versions lliures

MySQL v5.0.41Es pot trovar a http://dev.mysql.com/downloads/mysql/5.0.html.

Conectors JDBC (Drivers)

IBM DB2 Driver for JDBC and SQLJ (Driver de Tipus 4)Es pot trovar dins apartat DB2 Clients and Development Tools de la pàgina central de DB2 Express-C. Es de Tipus 4.i implementa JDBC 3.0.

Oracle Database 10g Release 2 (10.2.0.3) JDBC Drivers S’ha escollit JDBC Thin for All Plataforms: ojdbc14.jar (classes for use with JDK 1.4 and 1.5). Es pot trovar a: http://www.oracle.com/technology/tech/java/sqlj_jdbc/index.html. Es de Tipus 4 I implementa JDBC 3.0.

MySQL Connector Java v5.0.6. Es pot trovar a: http://dev.mysql.com/downloads/connector/j/5.0.html. Es de Tipus 4 que implementa JDBC 3.0.

Pág. 15 de 92

Page 11: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Controlador JDBC de Microsoft SQL Server 2005 v1.1.1501.101 (Publicació: 02-feb-2007)Es pot trovar a: http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=6d483869-816a-44cb-9787-a866235efc7c Es de Tipus 4 que implementa JDBC 3.0.

Tots son drivers de Tipus 4. Una forma que Java els reconeixi es posar l’arxiu .jar de cada driver a la carpeta C:\Archivos de programa\Java\jre1.6.0_01\lib\ext . Hi ha entre d’altres (els noms en si no importen):

sqljdbc.jar per a Microsoft SQL Server 2005. mysql-connector-java-5.0.6-bin.jar per a MySQL. ojdbc14.jar per a Oracle 10g db2jcc.jar per a IBM DB2.

Eines adicionals lliures

Oracle SQL Developer v1.1 Patch 3 (v1.1.3.27.66) (Revisió: Maig 9, 2007) Es pot trovar a: http://www.oracle.com/technology/products/database/sql_developer/index.html Eina gràfica per a desenvolupament Bases de Dades. Es pot visualitzar els objectes de la Base de Dades, ejecutar sentències SQL, editar/debugar sentències PL/SQ. Instalació: Descomprimir en un directori destí i executar sqldeveloper.exe. Cal indicarli lloc on està instalat el JDK. Nota: Segons documentació requereix jdk 1.5 però s’ha executat sota jdk 1.6u1.

Microsoft SQL Server Management Studio Express SP2 Eina d’administració de la BD.Es pot trovar a: http://www.microsoft.com/downloads/details.aspx?familyid=6053C6F8-82C8-479C-B25B-9ACA13141C9E&displaylang=es. Interface en Espanyol. Publicació: 17-feb-2007.

MySQL GUI Tools Bundle for 5.0 r12Eina gràfica per MySQL. Interface en Inglés. Es pot trovar a: http://dev.mysql.com/downloads/gui-tools/5.0.html

1.5.2 Entorns alternatius

Podria usar-se un sistema operatiu completament lliure: Linux. Els IDE de java tenen versió per a Linux.

IDE alternatius

NetBeans 6 (http://www.netbeans.org/)Entorn de desenvolupament lliure potent i versàtil de la propia Sun. Aquest, a diferencia d’Eclipse, ja.Integra utilitats accés a Bases de Dades, servidor web… Té també versions per a Windows i Linux. 1.6 Estructura documentacióLa documentació del PFC JDBC DatabaseMetaData s’ha separat en varis apartats que es centren en:

Pág. 16 de 92

Page 12: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Especificació de RequerimentsEs dona informació del que fa l’aplicaicó (funcionalitats) i requeriments no funcionals (elements necessaris per l’aplicació).

Conceptes sobre Base de Dades i Java JDBCEs el complement dels Requeriments. Es donen una sèries de definicions sobre Terminologia de Bases de Dades i de Java JDBC com a model d’accès als diferents sisemes gestors de Bases de Dades.

Casos d’úsEs dóna exemples d’usos de l’aplicació.

Disseny i ImplementacióEs dona detalls del disseny i montatge dels elements de l’aplicació com poden ser definir paquets, classes i model de dades. Es dona informació sobre la implementació del paquet d’accés als gestors (utilitats.jdbc)

ProvesEs pretèn donar algunes proves ilustratives del funcionament de l’aplicació

ApèndixsEsta format per un resum d’acrònims/definicions i per un breu manual de l’aplicació.

Pág. 17 de 92

Page 13: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

2 Anàlisi de requeriments

La finalitat d’aquest capítol es definir de la forma més precisa possible el que es vol desenvolupar mitjançant l’Especificació de Requeriments de Software (SRS). El software que es preten construir ha de satisfer les necessitats que es vol cubrir i aquestes han d’estar especificades aquí.

Dir que els requeriments són la peça fonamental del desenvolupament del software i forma part del cicle de vida de tot projecte. Amb ells, per exemple, es podrá:

Plantejar el projecte i els recursos que s’usarà en ells (personal, màquines, software). Evaluar els costos i temps Planificar les proves

2.1 Previ requerimentsPer tal de poder entendre els requeriments es imprescindible efectuar una sèries de definnicions. Aquests seràn d’ajut per la resta d’apartats.

Es recomana en aquest punt també efectuar lectura de les definicions i conceptes necessaris per entendre aquest capítol i que es pot trobar en el capítol de conceptes de Bases de Dades i Java JDBC. Aquí es presenta de forma sintètica.

2.1.1 Definicions i acrònims

Es dona un conjunt d’acrònims i definicions necessaris per entendre millor el present capítol.

Acrònims

SRS: Especificación de requerimientos software. PC: ordenador personal. SSOO: sistemas operativos.

API: Application Programming Interface Interficie de programació d’aplicació ANSI: American National Standard Institute JDBC: Java Database Connectivity ODBC: Open DataBase Connectivity RDBMS : Relational Data Base Management System (Sistema Gestor de Bases de

Dades Relacional) SQL: Structured Query Languaje (Llenguatge de Consulta Estructurat) SDD: Descripción de diseño software. SW: Software. URL: Uniform Resource Locator (Localitzador Unoforme de Recursos) XML: eXtensible Markup Language (Llenguatge de marques extès)

Definicions

Pág. 19 de 92

Page 14: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Bases de dades relacionalsLa informació s’estructura en relacions vistes de manera simple com taules composades de registres (files) i de camps (columnes).

SQL - Llenguatge de Conulta Estructurat (Structured Query Language) Es un llenguatge declaratiu d’accés i manipulació de Bases de Dades relacionals. Es un estándar ANSI.. Malgralt ser un estándar, hi han moltes versions. Els SGBDR solen afegir extensions o particularitzacions al SQL estàndard.

Sentencia SQLOrdres-Comandes en SQL que interaccionen amb una BD (consultes, actualitzacions....)

TaulaConjunt de dades relacionades vista com una representació en camps (columnes) i registres (files)

VistaConsulta SQL d’una o varies Taules vista com una Taula.

IndexÚs d’una o més columnes d’una Taula per a permetre ràpid accés a files d’una taula.

Claus Principals, Claus ForàneesClau Principal es conjunt de camps (o camp) que identifica un registre unívocament. Clau forànea son camps que s’usen com a claus principals d’una altre taula.

Procediments EmmagatzematsRutines que es guarden en el gestor usables per les aplicaciones.

2.1.2 Referències

Les referències que s’usan es pot trobar al final de la memòria.

2.1 Descripció general

2.1 Perspectiva eina

L’eina que es vol desenvolupar es completament independent en el sentit que no s’integra a cap eina superior que la inclogui. Per tant, aquest es pot posar junt amb un mínim necessari com disposar del JRE de Java, un Sistema Operatiu i els SGBR amb els conectors de conexió.

2.2 Funcionalitat de l’eina

Amb l’ús de l’especificació JDBC de Java i per tant usant llenguatge Java, es realitza una eina que permeti funcionalitats com:

Definir conexions a Bases de Dades en funció de la parametrització dels driversCaldrà Especificar paràmetres de cada conexió: Ports (listeners o oients els quals reben peticions), usuari, passoword….

Mostrar les Bases de Dades de sistema i d’usuari. Mostrar definicions de taules, vistes i indexos de sistema i d’usuari. Veure integritat

referencial (claus primàries i claus forànees). Veure els procediments emmagatzemats i llurs paràmetres d’entrada I sortida.

Mostrar autoritzacions operacions sobre Taules i camps. Executar Sentencies SQL que l’usuari desitji (consultes, actualitzacions …)

2.3 Restriccions

Pág. 20 de 92

Page 15: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

El sistema està exclusivament fet en Java i usa l’especificació JDBC per intereccionar amb els gestors de Bases de Dades. Al seguir l’especificació JDBC, pot (i de fet passa) que es ressisteixi el seu funcionament sobre determitats gestors (que malfuncioni o no doni els resultas esperats). En quest cas, un culpable cal trobar-ho en que els drivers dels gestors no implementen adecuadament l’especificació JDBC. Es pot important aleshores saber escollir els conectors adequats. 2.4 Suposicions i dependències

El sistema es prova en base a unes versions de software (especificats en introducció). Es evident que aquesta dependència es màxima en el sentit que no es pot canviar a la lleugera determinats components software. Un exemple clar i dràstic es un canvi de Sistema Operatiu: malgrat Java sigui portable, és ben segur a la pràctica que pot haver-hi quelcom que deixi de funcionar de la forma esperada.

2.5 Evaluació previsible software

El software que es realitza és un punt d’entrada a tot un amplíssim món de la gestió de Bases de Dades. L’eina cobreix la part de visualització d’objectes peró deixa apart una rigurosa gestió dels objectes amb els quals es pugui treballar (malgrat que una part es pot fer introduïnt Sentencies SQL una a una però és millor visualment).

2.3 Requisits específicsUna aproximació dels requisits específics ens porta a dividir-ho en requisits funcionals i no funcionals.

2.3.1 Requeriments funcionals

Es descriu el que el sistema (eina o software) ha de fer. En cap cas, aquí no s’explica com es fa: algoritmes i lògica (disseny e implementació). Solament ens destaquen les funcionalitats.

2.3.1.1 Requisits de Conectors (drivers) i Conexions JDBC

Fa referencia al tractament dels drivers proporcionats pels fabricants dels diferents SGBDR que implementen especificació JDBC. També a les conexions creades en base als drivers.

Manteniment de Conectors (drivers) JDBC a SGBDRHa d’existir un arxiu de conectors JDBC en forma de claus-valor que ens indiqui per cada sistema gestor de Bases de Dades (dbVendor) les parelles (nom sistema o dbVendor , cadena driver | format cadena conexió) on el caràcter | separa les cadenes.Cal que l’arxiu estigui en estàndard de dades XML. Les cadenes driver i conexió anirán separats per |.

Manteniment de Conexions JDBC a SGBDRHa d’existir un arxiu de conexions JDBC en forma de claus-valor que ens indiqui per cada nom de conexió creat al sistema gestor de Bases de Dades (dbVendor) les parelles (nom conexio ; propietats conexio) on propietats conexió está format per ristres clau=valor separats per |. En concret.sistema i cadenes driver i cadena conexió. Cal que l’arxiu estigui en estàndard de dades XML..

2.2.1.2 Requeriments d’Informació objectes de la Base de Dades

Pág. 21 de 92

Page 16: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Un cop conectats amb una Base de Dades, el sistema mostra els objectes relacionats amb la conexió. Així mostra:

Informació de Driver i conexió a la Base de DadesHa de proporcionar-nos informació respecte al Driver (nom, versió, minor-major versió) i respecte a la Base de Dades (nom BD, versió Base Dades, minor-major versió). Ha de proporcionar-nos informació URL de la Base de dades, el UserName (Nom Usuari).

Informació Arquitectura Bases de DadesHauria d’incloure com a mímin:

o Informació sobre els Termes que s’usen per: Catàleg, Esquema, Separador Catàleg, Procediment…

o Informació sobre Tipus de Taules que s’usen. Típicament: TABLE (Taula), VIEW (Vista), SYSTEM TABLE (Taula de sistema).

o Infomació mapaig complet entre Tipus de Dades del gestor de Bases de Dades i tipus de dades de JDBC.

Tipus SQL i seu mapeig amb Tipus JDBC

o Infomació de elements de suport Base de Dades tal com: Nivell SQL ANSI92 amb què es pot treballar, tipus gramàtica SQL, suport supresió per posicionament, actualitzacions en Batch (procés per lots), suport a stored procedures

Informació Límits Base de DadesHauria d’incloure com a mínim informació límits operacions sobre:

o Tamany màxim fila (registre) Informacióo Tamany màxim sentència SQL.o Númeró máxim de conexions que suporta la Base de Dades.o Número de camps que suporta una Taula.o Número de Taules màxim permès en una sentencia SQL.

Informació Objectes de Base de DadesHa de mostrar informació sobre:

o Catàlegs i Esquemes de la Base de Dades. Obtenció dels atributs.o Taules, Vistes, Indexs i Procediments emmagatzemats. o Claus primaries i claus forànes (tant importades com exportades) respecta a una

Taula.o Detall de camps de les Taules i Vistes.

Cal especificar ordre, tipus de dades que emmagatzema, valors per defecte…o Detall de permisos sobre Taules, Vistes i camps taules o vistes.o Detall de paràmetres entrada i sortida dels procediments emmagatzemats.Caldria efectuar una distinció si són objectes de l’usuari o bé formen part interna del gestor de Base de Dades.

Pág. 22 de 92

Page 17: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Exemple informació Indexs Taula Lloc introducció sentencies SQL

Permeti introduir qualsevol sentència SQL válida (SELECT, UPDATE...) contra la base de dades.

Exemple execució d’una sentencia SQL

2.3.2 Requeriments no funcionals

2.3.2.1 Requeriments de portabilitat programa i de dades

Ens interessa un llenguatge que permeti la portabilitat de programa i per tant els programes funcionin tant si s’executa sota el sistema operatiu Windows com per exemple en Linux. El llenguatge en qüestió es Java. La portabilitat seria efectiva amb petits retocs.

Font: http://www.jorgesanchez.net/programacion/Java.pdf

Pel que fa a les dades, està agafant pes XML com a mitjà de portabilitat de les dades. XML és un estàndard acceptat i pot ser usat per milliorar la compatibilitat entre aplicacions. Permet l’intercanvi d’informació entre aplicacions (o mòduls). Per tant, en el paquet de funcions JDBC DatabaseMetadata (UtilsJDBC) les funcions retornen també valors en format XML.

Pág. 23 de 92

Page 18: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

2.3.2.2 Requeriments d’usabilitat

El software va encarat tan a administradors com a usuaris en general. Això no te més problema ja que a tota conexió a una Base de Dades mostrarà els objectes (taules, vistes....) al qual té accés un usuari en concret. Així si és un usuari administrador, es evident que tindrà accès a tots els objectes. En tot sistema sol haver una jerarquia d’accessos.

El programa s’acompanya d’una Ajuda en format HTML de les prestacions del programa i accessibles directament des del programa. També hi ha la versió escrita.

2.3.2.3 Requeriments ergonòmics

Un requeriment ergonòmic de pes és la inteface amb l’usuari (GUI – Graphic User Interface) ja que és l’única forma que l’usuari interactua amb el sistema. La interface ha de complir:

Disposar de menú de navegació part superior i d’una Barra d’eines amb les funcionalitats més principals per a un accés ràpid.

Els objectes de la BD han de ser desplagats en forma d’arbre i estar clarament identificats.

Ha de disposar d’un lloc per a sentencies SQL

El paquet de software que es basa per a contruir el GUI es ús del paquet Java Swing que és un estàndard.

2.3.2.4 Requeriments d’Interface

L’eina interactua principalment amb els gestors de Bases de Dades. El programa té fons d’entrada en formats de dades XML (estándar d’intercanvi dades) i formats propietaris de Java (array strings). Per interrogar la Base de Dades se sol usar protocols de xarxa com a medi de transport de la informació. El tipus d’informació és sempre sobre dades i metadatos sobre la Base de Dades.

2.3.2.5 Requeriments de desenvoltura

El programa ha de ser de resposta preferentment ràpida però que no arriba a ser ni molt menys crític. Destinat preferentment com una eina de consulta i no com a eina de producció. Tammateix, hi ha consultes que de per si són més complexes (com consultes integritat referencial) i per tant no es pot demanar respostes inmediates.

Els recursos que fa servir el programa depen molts cops de les consultes que es facin (de la seva complexitat). Cal ser conscients del tipus consultes que es fan.

Pág. 24 de 92

DocumentXML

ObjectesJava

Page 19: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

3 Conceptes sobre Bases de Dades i Java

JDBCAquest capítol està destinat a definir conceptes bàsics necesaris sobre Bases de dades per després arribar a Java JDBC. Es pot englobar en una explicació més detallada de les definicions i conceptes necessaris en Anàlisi de Requeriments. Per tant, el que s’explica son conceptes que s’usen en l’aplicació.

Cada final apartat de cada apartat es descriu o s’intenta justificar mínimament en què s’usa els conceptes que es detallen aquí.

3.1 Conceptes sobre Bases de DadesEs donen definicions referents a Bases de Dades, de general a elements que la formen.

3.1.1 Base de Dades i Sistema Gestor de Base de Dades

Una Base de Dades (BD) és una colecció de dades emmagatzemades de fàcil accès. Les Bases de dades relacionals (BDR) és un model de Bases de Dades on la informació s’estructura en relacions vistes de manera simple com taules composades de registres (files) i de camps (columnes). I precisament un Sistema Gestor de Base de Dades (SGBD) o Manejador de Bases de Dades (DBMS = Data Base Management System) és el software encarregat de mantenir les dades d’una Base de Dades.

El model relacional es basa en el concepte matemàtic de relació (degut a Codd) que gràficament es representa mitjançant una taula. Codd va usar la terminologia matemàtica de teoria de conjunts i lògica de predicats.

Destacar que el model relacional és un model lògic de dades. És a dir, oculta les característiques de la representació física. Informalment, que guardi la informació físicament com cregui convenient mentres retorni resultats de la forma esperada i eficient. O sigui, per un usuari, un SGBDR es percep com un conjunt de taules.

Hi han models que ajuden a dissenyar el model de dades d’una Base de Dades. Un model d’exemple són els diagrames o model Entitat-Relació (E-R Entity relationship) on es defineixen entitats (objectes), relaciones entre entitats i atributs de cada entitat. En les relacions cal definir la Cardinalitat de les relacions (relacions un a un, d’un a molts, de molts a molts), Això va intimament lligat per exemple a les restriccions de clau foranea que es pot definir en una Base de Dades.

Els objectes bàsics d’una Base de Dades són:

Taula

Una Taula d’una Base de Dades es pot veure com un conjunt de dades que representen una informació relacionada. Informalment es pot veure com una fulla de càlcul. Una taula es composa de:

Pág. 25 de 92

Page 20: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Camps: Son les columnes. És la unitat básica d’una Taula. Cada columna té associat un tipus de dades (definim el tipus de dades que es vol emmagatzemar i propietats associades).

Registres: Son les files. Representen les dades. Cada columna del registre está associat amb la columna (camp) que la defineix.

El Tipus de dades d’una columna indicará que totes les dades emmagatzemades en aquella columna dels registres hauran de ser del mateix tipus. Cada gestor defineix un conjunt de Tipus de Dades que soporta. Al definir-los caldrà especirficar si s’acepta la característica de valors nuls (NULL)..

Clau principal Un concepte important en una Taula es la definició de clau principal o primaria (primary key) com el camp (o camps) que permeten identificar i localitzar un registre de forma ràpida. Es pot veure com una restricció que garantitza que cap taula té files duplicades i que no poden ser NULL.. En ell s’hi sol definir si s’ordenen de forma ASCendent o DESCendent.

Índex

Un índex es una carácterística de les Bases de Dades que permet ràpid accés a les files o registres d’una Taula o fitxer. Els índexs són creats usant un o més columnes d’una Taula.Un índex es pot veure informalment com un índex d’un llibre de la forma de parelles d’elements: element a indexar i la posició a la Base de Dades.Els índexs convé usarlos sobre aquells camps sobre els quals es fan freqüents búsquedes Ocupen molt menys que les dades en si. Es solen construir usant arbres de cerca B, B+ o B*.Fer un abús d’índexs el que comporta es més lentitud general de la Base de Dades. Cal trobar un equilibri.

Vista

Una vista d’una Base de Dades és el resultat d’un consulta SQL de zero, una o varies taules. Les vistes tenen la mateixa estructura que una Taula: files (resgistres) i columnes (camps). L’única diferència es que una Vista és una definició (es guarda unicament com s’obtenen les dades) a diferencia de les Taules que si són les dades en si.En una vista igualment es poden fer operacions de consulta, insercions, actualitzacions i borrats.

Procediments Emmagatzemats

Els procediments emmagatzemats (Stored Procedures) són procediments o rutines disponibles a les aplicacions que accedeixen a les Bases de Dades. Estan emmagatzemats físicament a la Base de Dades. Tenen acces directe a les dades (rapidesa) i sols es necessari enviar resultats de la petició. Un possible problema es que solen estar escrits en llenguatges propietaris de la Base de Dades com exemple PL/SQL per a Oracle.

Un ús típic pot ser els processos de validació de dades o mecanismes de control d’accés. De fet, molta part de la lógica de les aplicaciones es posen en stored procedures que aporta avantatge la rapidesa pero com a incovenient la dependència del gestor.

3.1.2 SQL

Pág. 26 de 92

Page 21: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

SQL (Structured Query Language o Llenguatge Estructurat de Consultes) és el llenguatge més habitual per a construir consultas a Bases de Dades relacionales. Aquest estàndard està implementat pels principals motors o SGBDR (Sistemes de gegstió de bases de dades relacionals).

Revisions actuals ANSI SQLAl 1992 apareix SQL-92 (SQL2), al 1999 apareix SQL:1999 (SQL3)

Revisions ANSI SQL Alias Nom Any ComentarisSQL-87 SQL-86 | SQL-1 1986

SQL-89 1989SQL2 SQL-92 1992SQL3 SQL-1999

SQL:20031999 2003

Al 1999, s’introdueix expressións regulars, consultes recursives, triggers i algunes característiques orientades a objectes Al 2003, s’Inclou alguna operativa XML…

Terminologia

Taula (Fitxer) Columna (Camp)

Parts principals SQL

SQL Data Manipulation Language (DML).Sentencies per a consultar (SELECT), insertar (INSERT INTO), actualizar (UPDATE) i borrar (DELETE) dades.

SQL Data Definition Languaje (DDL)Sentencies per a crear taules (CREATE TABLE), canviar una taula (ALTER TABLE), eliminar una taula (DROP TABLE), crear indexs (CREATE INDEX), borrar indexs (DROP INDEX)

SQL Data Control Language (DCL)Sentències sobre privilegeis. Exemple: GRANT, REVOKE

SQL Transction Control (TCL)Sentencies transaccionals pel maneig de sentències DML. Exemples: COMMIT, ROLLBACK, SET TRANSACTION, SAVEPOINT…

3.1.3 Integritat de Dades. Integritat Referencial. Restriccions.

La integritat referencial (referential constraint) persegueix protegir la Integritat de les Dades. Es vol evitar que apareguin dades incorrectes, repeticions, dades perdudes …

Una restricció (constraint) que es pot definir sobre una columna o grup de columnes es el concepte de clau forànea que conté un valor (valors) que fa referencia a una fila o registre d’una altre taula.

Algunes restricciones són:

Restriccions de clau principal (Integritat d’entitat)Una restricció de clau principal garantizar que no s’escriguin valors duplicats ni nuls en les columnes especificades (cal garantir l’exclusivigtat). Exemple: una columna ID_Article identifica els detalls (camps) d’un Article.

Restriccions de clau externa (foreign keys) (Integritat Referencial)Es una forma de garantir la integritat referencial en les tables que es relacionen. Es a dir,

Pág. 27 de 92

Page 22: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

no es pugui afegir un columna .a una taula sense que aquesta no estigui com a clau primaria d’una taula.

(Extret de: Introducció a Oracle de http://www.lcc.uma.es/~esc/docenciabd/Tema%202%20Relacional.pdf)

Quan es defineixen claus forànees cal definir també les accions que cal fer quan s’intenta borrar o actualitzar una fila d’una taula on hi ha les claus afectades (clau foranea d’una Taula i clau primaria de l’altre taula).

Per exemple, en la taula podriem definir que fer (actualització i borrats en cascada) si canviem de la taula departaments el valor 30 por 130 o bé borrem el departament 30. Doncs bé, pel primer cas caldrá canviar en cascada de la taula d’empleats els 30 per 100 i el el segon cas desapareixeran tots els empleats del departament 10.(cada empeleat pertany a un departament).

En MySQL es defineix les claus forànes al crear la taula o al alterar taula:

ALTER TABLE <table identifier> ADD [ CONSTRAINT <constraint identifier> ] FOREIGN KEY ( <column expression> {, <column expression>}... ) REFERENCES <table identifier> [ ( <column expression> {, <column expression>}... ) ] [ ON UPDATE <referential action> ] [ ON DELETE <referential action> ]

CREATE TABLE table_name ( id INTEGER PRIMARY KEY, col2 CHARACTER VARYING(20), col3 INTEGER, ... CONSTRAINT col3_fk FOREIGN KEY(col3) REFERENCES other_table(key_col) ON DELETE CASCADE, ... )

3.1.4 Gestors de Bases de Dades

En el projecte es proven els Gestors de Bases de Dades ( a la introducció hi ha definits les versions que s’han usat):

MySQL Oracle SQL Server DB2 Microsoft Access

Pág. 28 de 92

Page 23: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Queda fora de l’abast entrar en els detalls interns de cada gestor, és a dir, la seva arquitectura. El que ens importa en el projecte es usar JDBC com a única forma única per a tots ells d’obtindre la informació que ens interessa. A nivell general tots permeten definir els conceptes vistos fins ara (es la base). Es important recalcar que exclusivament estem tractant Bases de Dades Relacionals

3.1.5 Usuaris de Bases de Dades

En tota Base de Dades es té usuaris amb més privilegis que altres. Especialment el que té accès a tot el sistema són els usuaris administradors. Se solen definir nivells d’usuaris en el sentit de permetre solament un subconjunt d’operacions.

Es pot estabilir restriccions sobre comuntment Bases de Dades, Taules i Columnes. Les instruccions SQL específiques son GRANT i REVOKE.

3.1.6 A on s’usa els conceptes de Base de Dades en el projecte?

Aquí ens preguntem, i on s’usa tot això? Doncs bé en el programa:

Al efectuar una conexió a una Base de Dades doncs saber que el que estem veient son precisament els objectes d’una Base de Dades i per tant Taules, Vistes, Índexs i Procediments Emmagatzemats.

Que al veure les propietats d’una Taula doncs estem veient quines són les claus primaries, quins camps composa una taula, quines restriccions d’integritat s’hi defineixen, si hi ha claus forànees…

Que al efectuar consultes o actualitzacions a una Base de Dades, estem usant precisament SQL.

Al conectarse a una Base de Dades es important el nivell de l’usuari ja que apareixerà diferents conjunts d’objectes segons el nivell de l’usuari.

3.2 Conceptes sobre Java JDBC 3.2.1 Introducció JDBC es acrónim de Java Database Connectivity. JDBC és defineix alternativament:

JDBC és una inteface i plataforma independent entre Bases de Dades Relacionals i Java.

JDBC és una API per accés a Bases de Dades empresarials en Bases de Dades relacionals (com per exemple Oracle, MySQL, SyBase, PostgreSQL, DB2…) usant SQL.

La API JDBC ofereix una forma homogènea d’accés a diferents SGBDR. Les intefaces JDBC defineixen (no implementen) els accesos a les Bases de Dades en base a especificació concretes. Les implementacions d’aquestes ens permetran ja accedir-hi per a realitzar-hi tot tipus d’operacions usant SQL.

Al permetre Java i JDBC realitzar aplicacions a Bases de Dades independents de la plataforma i del SGBDR, vol dir que una mateixa aplicació funcionaria sobre una Base de Dades MySQL o Oracle per esmentar-ne algunes i a més sota Windows o Linux. Desgraciadament, es demostra a la pràctica que així és però amb retocs concrets a cada plataforma. 3.2.2 Drivers JDBC

Pág. 29 de 92

Page 24: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Amb el driver o controlador JDBC ens permetrà conectarnos a una Base de dades. Per desgràcia, dependrà molt del driver i com estigui fet i de les versions sobre els resultats de les diverses consultes que se li fagin. La teoria de la interface que va bé per un driver resulta que no funciona per un altre.

API’s Java (Font: http://www.itver.edu.mx/comunidad/material/tallerbd/apuntes/2.4_Txt.htm)

Tipus de drivers

Tipus 1. JDBC-ODBC bridge plus ODBC driverPermet accedir a fons ODBC. El pont JDBC-ODBC implementa operacions JDBC traduintles a operacions ODBC per a que aquest accedeixi a la Base de Dades. A cada maquina client s’ha de configurar previament la font ODBC.Conté codi natiu. S’inclou en els JDK.

Tipus 2. Native-API partly-Java driver.Están escrits en Java i codi natiu. Necesiten de configuració previa com Tipus 1. Converteix crides JDBC a crides propies de cada SGBDR.

Tipus 3. JDBC-NET pure Java driverEscrit en Java pur. Usa un protocol independent de la Base de Dades per a comunicar les peticions a un servidor que les tradueix a un protocol específic de la Base de Dades.

Tipus 4. Native-Protocol pure Java Driver.Escrits en Java pur (independent de la màquina en que s’executi). Son com Tipus 3 pero sense el pas intermig. Permet una comunicació directa. Es converteixen les crides JDBC al protocol de xarxa natiu usat per cada SGBDR. No es necessari intermediaris per parlar amb el servidor

Es recomana l’ús de drivers de tipo 3 o 4 per a accedir a les Base de Dades (el solen subministrar ja els SGBDR comuns). Els Tipus 1 i 2 podrien considerar-se solucions provisionals fins que apareixin els de Tipus 3 o 4.

Com a important:

Els paquets java.sql i javax.sql defineixen la API JDBC. S’usa el llenguatje SQL. En les distribucions JDK es dona un controlador Tipus 1 (no recomenable usar).

Tammateix, els diferents SBBDR ofereixen drivers optimitzats de Tipus 3 o 4.

Pág. 30 de 92

Page 25: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Tipus 1: Pont JDBC-ODBC Tipus 2: Java Binari

Tipus 3: Java Protocol independent

Tipus 4: Java Protocol / Natiu

3.2.3 API JDBC

La API JDBC proporciona interfaces i clases per accedir i processar dades usualment d’una BD relacional.

Paquets importants:

Package Descripciójava.sql Defineix la API JDBC javax.sql Es extensió extandard JDBC. Proporciona funcionalitat d’un fons de dades (objecte DataSource) i

agrupació de conexions (connection pooling).

Package java.sql Una descripció segons la funcioanlitat es:

Per a fer conexions a Bases de Dades usant DriverManagerObjecte Tipus DescripcióDriverManager clase Per a fer una conexió a un driverSQLPermission clase - Driver interface Aquesta interface l’han d’implementar tots els fabricants de drivers

JDBC.DriverPropertyInfo clase Propietats d’un driver JDBC

Per a enviar sentencies SQL a la Base de DadesObjecte Tipus DescripcióStatement interface Objecte usat per executar sentencies SQL estàtiques i returnar els

resultas que produeix.PreparedStatement interface Objecte que representa a sentencies SQL precompilades.CallableStatement interface Per executar SQL stored procdueres (procediments emmagatzemats)

Pág. 31 de 92

Page 26: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Connection interface Una conexió (sessió) a una Base de Dades concreta.Savepoint interface Representació d’un savepoint, que és un punt dins de la trnsacció

actual que es pot referir dins del mètode Connection.rollback.

Per a recuperar i actualitzar els resultats d’una consulta (query)Objecte Tipus DescripcióResulSet interface Una Taula de dades que representa un cojunt de resultats generats

usualment per l’execució d’una sentencia de consulta a una Base de Dades.

Per a mapetjos de tipus de dades SQL cap a classes o interfaces de JavaObjecte Tipus DescripcióArray interface Per a representar/Mapejar el Tipus de dades SQL ARRAY.Blob interface Per a representar/Mapejar el Tipus de dades SQL BLOB.Clob interface Per a representar/Mapejar el Tipus de dades SQL CLOB.Date clase Per a representar/Mapejar el Tipus de dades SQL DATERef interface Per a representar/Mapejar el Tipus de dades SQL REFStruct Interface Per a representar/Mapejar el Tipus de dades SQL STRUCTTime Clase Per a representar/Mapejar el Tipus de dades SQL TIMETimestamp Clase Per a representar/Mapejar el Tipus de dades SQL TIMESTAMPTypes Clase Constants per als Tipus de dades SQL.

Informació MetadataObjecte Tipus DescripcióDatabaseMetadata interface Informació respecte a una Base de Dades.ResultSetMetaData interface Objecte que s’usa per aconseguir informació respecte als tipus i

propietats de les columnes d’un ResultSet.ParameterMetaData interface Objecte que s’usa per aconseguir informació sobre els tipus i

característiques dels paràmetres d’un objecte PreparedStatement.

Control ExceptionsObjecte Tipus DescripcióBatchUpateException clase Excepció que indica errors durant una operació d’actualització en batch.DataTruncation clase Excepció quan es trunca (DataTruncation) per acomodar una dada. En

lectures es dona avís (warning) i en escripures es llença excepció. SQLException clase Excepció que dona informació sobre varis errors d’access a la BD.SQLWarning clase Avisos sobre accesos a BD.

Package javax.sql

Es una extenció de JDBC. Ofereix funcionalitats noves resumides en les quatre categories següents:

Interface DataSourse: Per a treballar amb el servei de noms JNDI (Java Naming and Directory Interface) que permet establir conexions amb una font de dades.

Pooling de conexions: Mecanisme que permet reutilitzar les conexions en lloc de crear una nova conexió cada vegada que es necessiti. La gestió d’un pool es fa en general transparent a l’usuari.

Transaccions distribuides: Mecanisme que permet utilitzar en una mateixa transacció diferentes servidors de Bases de Dades.

Interface RowSet: Component de JavaBean. Es un conenidor per un conjunt de files. Al heredar de ResultSet te la funcionalitat d’aquesta.

InterfacesObjecte DescripcióConnectionEventListener Listener events relatius a un PoolConnection. ConnectionPoolDataSource Representa una font de dades gestionant els pools de conexionsDataSource Per a conexions a Bases de Dades.PoolConnection Resenta una conexió que pertany a un pool.RowSet Suport a JDBC API per al model de components JavaBeans.

Pág. 32 de 92

Page 27: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

RowSetInternal -RowSetListener Representa Oient RowSetRowSetMetaData Representa els Metadatos d’un RowSetRowSetReader -RowSetWriter -XAConnection Per a transaccions distribuides.XADataSource -

ClasesObjecte DescripcióConnectionEvent Representa un event de ConnectionEventListener.RosSetEvent Representa un event generat per RowSet.

java.sql i javax.sqlL’ús de Javax.sql ja s’escapa dels propòsits del projecte i ja és més complex. Va emcaminat ja a projectes empresarials. Aquí s’usa java.sql. Un exemple d’ús rigurós de javax.sql en quan al tema de realitzar conexions a Bases de Dades i sobretot en entorns de producció es usar pools de conexions. La forma que s’usa en el projecte és més senzilla i es suficient pels propòsits que es marca el projecte. 3.2.4 Relacions entre les classes i paquets principals Package java.sql Al establir una conexió o sessió a una Base de dades específica (inteface Connection), podem crear 3 tipus de sentencies bàsiques:

Statement (Sentència) creada amb createStatement,Permetrà executar sentències SQL sense paràmetres.

PreparedStatement (sentències preparades o precompilades) creades amb preparedStatementPermetrà crear una plantilla sentència SQL amb un o varis paràmetres.

CallableStatement (sentència invocable) amb prepareCall.Permetrà executar procediments emmagatzemats. També amb paràmetres (PrepareCall).

Aleshores es podrá invocar en consultes (SELECT) el mètode executeQuery. Si s’actualitza (INSERT, UPDATE, DELETE) , s’invoca executeUpdate. Els resultats els podrem tractar amb ResultSet.

Els gràfics que s’acompanyen representen les relacions entre els elements principals del paquet javax.sql. El segon gràfic alternatiu està en notació o nomenclatura UML (Unified Modeling Language) i OMT (Object Modeling Technique).

Aquí es veu la interface Statement permet executar sentències SQL sense paràmetres. La interface PreparedStatement, que descendeix o exten Statement, s’usa per crear una plantilla sentència SQL amb un o varis paràmetres (sentencia precompilada). Finalment, la interface CallableStatement exten PreparedStatement que permetrà execugtar procediments emmagatzemats.

Exemples

Exemple 1Us de sentencia SQL sense paràmetres i mètode executeQuery. Al crear una sentència li diem adicionalment que el resultat de la consulta ResultSet es de sols lectura i a més diem que sigui sensible als canvis que es fagin mentres estigui obert l’objecte Statement.

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

Pág. 33 de 92

Page 28: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

ResultSet srs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");

Exemple 2Veiem la mateixa sentencia usant un SQL sense paràmetres i la mateixa usant Sentències Preparades (paràmetres).

Statement

String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERE COF_NAME LIKE 'Colombian'";stmt.executeUpdate(updateString);

PreparedStatement

PreparedStatement updateSales = con.prepareStatement( "UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");updateSales.setInt(1, 75); updateSales.setString(2, "Colombian"); updateSales.executeUpdate():

Exemple 3Donada una conexió con, crearem un procediment SHOW_SUPPLIERS resultat d’un join de dos taules per SUP_ID. Es crea l’objecte Statement i s’executa.

String sql = "create procedure SHOW_SUPPLIERS as select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME from SUPPLIERS, COFFEES " +

"where SUPPLIERS.SUP_ID = COFFEES.SUP_ID order by SUP_NAME";Statement stmt = con.createStatement();stmt.executeUpdate(sql);

Pág. 34 de 92

Page 29: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Font: JDBC 3.0 Specification (Sun) October 2001

Pág. 35 de 92

Page 30: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Relacions entre les diferents interfaces-classes (en UML - OMT) (Font: http://www.itapizaco.edu.mx/paginas/JavaTut/froufe/parte21/cap21-4.html )

3.2.5 Estructura interna Base de Dades segons JDBC

L’especificació JDBC veu l’estructura interna d’una Base de Dades com: Objectes de Bases de Dades (taules, vistes, procediments…) estan continguts en un

Esquema (Schema). Esquemes (espais de nom d’usuaris –user namespaces-) están continguts en un

catàleg. Catàlegs (Particions de Bases de Dades, Bases de Dades) estan continguts a un

Servidor de Bases de Dades( com Oracle, MS SQL… )

Desgraciadament ja en el punt inicial de catàlegs i esquemes ja trobem distincions segons el gestor de Bases de Dades. I ja en general trobem diferent semàntica en l’ús del mateix JDBC API. Per exemple, per Oracle un esquema es el nom de la base de dades pero per MySQL és el Catàleg..

Pág. 36 de 92

Page 31: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Vista segons JDBC de la estructura interna d’una BD (Font: http://jguru.com/faq/view.jsp?EID=1183)

3.2.5 Metadatos

Per parlar de Metadatos, la API Java usa el terme MetaData ja que Java es sensible a minúscules-majúscules, però en aquí usem metadata (es escriure ja el programa o bé és explicar concepte).

Les dades i els metadatos són punts molt importants en aplicacions empresarials. Usem Metadatos per donarnos “dades sobre dades”. En aquest sentit, es pot veure com els tipus de dades i descripció del que conté les dades. Així per exemple, donat un resultat d’una consulta d’una Base de Dades podrem saber analitzant el resultat (seus metadatos) quantes columnes té, tipus dades… del resultat (la informació està implícita en el resultat).

I JDBC treballa amb les dades i els metadatos d’una Base de Dades. Cada Base de Dades té moltíssims metadatos i per complicar-ho més cada Base de Dades té els seus i precisament JDBC el que fa es mapejar-los amb l’us d’una API comuna. Ja s’encarreguen els drivers de complir aquesta API comuna ja que han d’implementar-la si volen ser compatibles amb la norma que imposa l’especificacio JDBC Java.

La programació JDBC i la programació JDBC Metadata es diferencien en què la primera estem solament interessats en resultats de consultes però en canvi en Metadata voldriem la descripció de tals consultes (data sobre data).

En general amb JDBC metadata podrem trobar resposta per exemple als metadatos d’una conexió a una Base de Dades i en concret a per exemple:

Quina llista de taules o vistes están disponibles? Quins són els noms i els tipus de columnes en cada taula o vista? Quins són els camps clau d’una Taula? Quins són els camps clau forànis que usa una Taula (si els té) (integritat referencial) ? Quina es la signatura d’un stored procedure? Quins camps d’entrada i sortida té?

3.2.6 Interfaces sobre metadatos sobre Bases de Dades

Ara veurem algunes interfaces sobre metadatos sobre la Bases de Dades que estem conectats. Disposem de tres interfaces importants molt útils:

Interface DatabaseMetaData Informació sobre la Base de Dades que ens hem conectat

Interface ResulsetMetaData Informació sobre columnes d’un ResultSet.

Pág. 37 de 92

Page 32: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Interface ParameterMetaDataInformació sobre els tipus i propietats dels paràmetres d’un objecte PreparedStatement.

3.2.6.1 Interface DatabaseMetaData

Interface DatabaseMetaData dona informació àmplia sobre la Base de Dades que estem conectats. Aquesta informació es pot dividir en les categories d’informació:

Els esquemes, els catàlegs, taules, vistes, columnes i tipus de columnes La Base de Dades, usuaris, drivers, procediments emmagatzemats i funcions. Els límits de la Base de Dades. Exemple: máxim de conexions que suporta la BD. Les característiques que soporta y no soporta la Base de Dades. Exemple: si soporta en

els SQL Outer Joins…

Per a crear l’objecte DatabaseMetaData cal invocar el mètode getMetaData sobre la conexió a la Base de Dades. Un cop creat l’objecte, tenim molta informació disponible de la Base de Dades. És el pilar bàsic! Es fa de la forma general:

. . . . .// Aconseguir Metadatos de la conexió Connection connDatabaseMetaData mtdt = conn.getMetaData(); // MetaData sobre la base de dades !!!

if (mtdt == null) { return null; }. . . . .

Font: Apress – JDBC Metadata, MySQL and Oracle Recipies. A Problem Solution [2006] Es donen algunes funcions, d’una amplissima llista, segons la seva funcionalitat en el format: Tipus_valor_retorn Nom_FuncioInformació(). Per exemple: String getUserName() és la funció de nom getUserName que retorna un String

Informació general String getURL() --- Retorna la URL de la DBMS. String getUserName() --- Retorna el nom usuari a la BD. String getDatabaseProductVersion() / int getDriverMajorVersion() / int getDriverMinorVersion() ---

Retorna la versió de la BD i els números de versions Major nivell i seguent nivell. Exemple: 10.2.1 retorna Major 10 i Minor 1.

String getSchemaTerm / String getCatalogTerm / String getProcedureTerm Retorna els Termes Esquema, Catàleg I Procediemtns usats.

boolean nullsAreSortedHigh / boolean nullsAreSortedLow boolean usesLocalFiles / boolean usesLocalFilePerTable String getSQLKeywords() --- Retorna les paraules SQL de la Base de Dades suportades

Suport boolean supportsAlterTableWithDropColumn boolean supportsBatchUpdates -- Indica si se soporta actualitzacions en Batch (o procés per lots) boolean supportsTableCorrelationNames boolean supportsPositionedDelete boolean supportsFullOuterJoins --- Indica si se soporta Ourter Joins complerts boolean supportsStoredProcedures --- Indica si se soporta Procediments emmagatrzemats boolean supportsMixedCaseQuotedIdentifiers

Pág. 38 de 92

Page 33: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

boolean supportsANSI92EntryLevelSQL--- Indica si se soporta ANSI92 boolean supportsCoreSQLGrammar -- Indica si se soporta gramática SQL

Limits Orígen Dades int getMaxRowSize -- Obtindre tamany màxim permès fila. int getMaxStatementLength --- Obtindre tamany màxim permés en una sentencia. int getMaxTablesInSelect --- Obtindre màxim Taules permesa en una Consulta int getMaxConnections -- Obtindre màxim Conexions possibles int getMaxCharLiteralLength int getMaxColumnsInTable -- Obtindre màxim columnes permeses en una Taula.

Objectes SQL i els seus atributs ResultSet getSchemas() / ResultSet getCatalogs()

Ens dona els Esquemes i els Catàlegs ResultSet getTables --- Ens dona les Taules ResultSet getPrimaryKeys --- Ens dona la descripció de les claus primaries ResultSet getProcedures / ResultSet getProcedureColumns

Ens dona els Procediments I les columnes de cada procediment ResultSet getUDTs

Retorna les descripcions dels tipus definits per l’usuari que pertany al catàleg, esquema, nom de tipus i patró de tipus passats com a paràmetre.

ResultSet getColumns – Retorna les descripcions de les columnes que pertanyen al patró catàleg, esquema, nom taula i nom de columa pasats com a paràmetre.

Transaccions supportsMultipleTransactions getDefaultTransactionIsolation

JDBC 3.0 afegeix els mètodes:

getSuperTypes — Retorna una descripció de la jerarquia de tipus definits per l’usuari a partior de l’esquema donat de la font de daes subjacent.

getSuperTables — Retorna una descripció de la jerquida de taula definita partir de l’esquema de la font de dades subjacent.

getAttributes — Retorna una descripció dels tipus d’atributs definits per l’usuari del catàleg doant d’una font de dades subjacent.

getSQLStateType — Retorna el tipus de SQLSTATEs que retorna el mètòde SQLException.getSQLState supportsSavepoints — Retorna true si la implementació JDBC API suporta savepoints. supportsNamedParameters — Retorna true si la implementació JDBC API suporta els noms de

paràmegtres pasats per objectes CallableStatement. supportsMultipleOpenResults — Retorna true si la implementació JDBC API suporta múltiples

ResultSets oberts per objectes CallableStatements supportsGetGeneratedKeys — Retorna true si la implementació JDBC API suporta la recuperació

automàtica de generació de claus. getResultSetHoldability — Retorna el holdability per defecte d’objectes ResultSet retornats pel driver.

i modifica els mètodes getTables, getColumns, getUDTs I getSchemas.Donat que s’usen pel projecte, s’ha agafat la definició JDBC 3.0. Actualment, per complicar-ho més, ja hi ha la JDBC 4.0 que data de desembre’06.

Tot seguit es dona informació dels mètodes que s’usen a l’aplicació dividits segons la funció que fan. A l’especificiació de Sun de JDBC n’hi han tot un amplíssim detall de la inteface java.sql.DatabaseMetaData. Es pot trovar a http://java.sun.com/j2se/1.5.0/docs/api/java/sql/DatabaseMetaData.html.

>>> Catalegs, EsquemesDisposem dels mètodes getShemas y getCatalogs.

Mètode getShemas-> public ResultSet getSchemas() throws SQLException

Pág. 39 de 92

Page 34: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Retorna els esquemes disponibles a la Base de Dades.La informació en columnes que ens dona es:

1. TABLE_SCHEM String => Nom esquema2. TABLE_CATALOG String => Nom catàleg (pot ser nul)

Mètode getCatalogs-> public ResultSet getCatalogs() throws SQLException

Retorna els catàlegs disponibles a la Base de Dades, ordenats pel nom catàleg.La informació en columnes que ens dona:

1. TABLE_CAT String => Nom catàleg.

>>> Tipus de TaulesDisposem del mètode getTableTypes.

Mètode getTableTypes-> public ResultSet getTableTypes() throws SQLException

Retorna els tipus de taules disponibles a la Base de Dades, ordenats per tipus taula.La informació que columnes que ens dona:

1. TABLE_TYPE String => table type.

Els valors típics són: “TABLE”, “VIEW”, “SYSTEM TABLE”, “GLOBAL TEMPORARY”, “LOCAL TEMPORARY”, “ALIAS”, “SYNONYM”.

>>> Aconseguir les Taules de la Bases de DadesDisposem del mètode getTables el qual ens dona les Taules.

Métode getTables-> public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException

Retorna una descripció de les taules disponibles en el catàleg donat i en base al patrons esquema, nom de taula i tipus de taula donats. Per exemple, si volem taules que comencin per ‘SYS%’ ho especificarem em parámetre tableNamePattern. S’han de passar els noms que realment son gravats a la Base de Dades (alguns sistemes son sensibles a mínúscules-majúscules com Oracle).

Cada descripció de la taula té les columnes: 1. TABLE_CAT String => Nom catàleg Taula catalog (pot ser nul) 2. TABLE_SCHEM String => Nom esquema Taula (pot ser nul) 3. TABLE_NAME String => Nom Taula4. TABLE_TYPE String => Tipus Taula. Valors típics de te tipus de taula són: "TABLE", "VIEW", "SYSTEM

TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM". 5. REMARKS String => Comentaris que deixa el gestor sobre la Taula. 6. TYPE_CAT String => El tipus de catàleg (pot ser nul) 7. TYPE_SCHEM String => El tipus d’esquemaa (pot ser nul) 8. TYPE_NAME String => El tipus de nom (pot ser nul) 9. SELF_REFERENCING_COL_NAME String => El nom que es designa a la columna "identifier" d’un tipus

de taula (pot ser nul). 10. REF_GENERATION String => especifica quins valors a SELF_REFERENCING_COL_NAME són creats.

Valors són: "SYSTEM", "USER", "DERIVED". (pot ser nul)

Els resultats són ordenats per TABLE_TYPE, TABLE_SCHEM i TABLE_NAME.Nota: Algunes dbVendors no retornen la informació de totes les taules.

Aconseguir els camps d’una Taula de la Bases de Dades

Pág. 40 de 92

Page 35: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Disposem del mètode getColumns el qual ens dona les columnes de la Taula o Taules especificades.

Mètode getColumns-> public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException

Retorna la descripció de les columnes disponibles d’una taula en el catàleg especificat i d’acord amb els patrons esquema, nom taula i nom columna. Per exemple: Es vol totes les taules que comencin per ‘T%’ i que les columnes comencin per ‘ID%’

Cada descripció de la columna té els camps: 1. TABLE_CAT String => Nom catàleg taula (pot ser nul) 2. TABLE_SCHEM String => Nom esquema taula (pot ser null) 3. TABLE_NAME String => nom taula 4. COLUMN_NAME String => nom columna5. DATA_TYPE int => Tipus SQL descrita a java.sql.Types 6. TYPE_NAME String => Font de Dades depenent del tipus de nom, per a UDT el tipus de nom es complert

qualificat. 7. COLUMN_SIZE int => Tamany de la columna. Per caracters o tipus tipus de dada és el màxim númer ode

caràcters, per númerics o tipus decimals, representa la precisió. 8. BUFFER_LENGTH – No usat. 9. DECIMAL_DIGITS int => El numero de dígits fraccionats (decimals). 10. NUM_PREC_RADIX int => Base (típicamet sol ser 10 or 2) 11. NULLABLE int => si els NULL són permesos.

Valors possibles: - columnNoNulls – no pot tenir valors NULL - columnNullable – permet valors NULL - columnNullableUnknown – Es desconeix si permet o no valors NULL

12. REMARKS String => Comentari que descriu la columna (pot ser nul) 13. COLUMN_DEF String => Valor per defecte (pot ser nul) 14. SQL_DATA_TYPE int => No usat15. SQL_DATETIME_SUB int => No usat16. CHAR_OCTET_LENGTH int => per cada tipus de caràcter el máxim número de bytes en el camp. 17. ORDINAL_POSITION int => index del camp a la taula (es comença per 1) 18. IS_NULLABLE String => "NO" significa que el camp no permet valors NULL, "YES" permet el camp valors

NULL. Un valor buit significa que es desconeix. Nota: Igual a columna 11. 19. SCOPE_CATLOG String => catàleg de la taula que està com a atribut referencia (null si DATA_TYPE no

és REF) 20. SCOPE_SCHEMA String => schema de la taula que està a un atribut de refeencia (null si DATA_TYPE no

és REF) 21. SCOPE_TABLE String => nom taula que està a un atribut de referència o tipus REF generat per l’usuariull

si DATA_TYPE no és REF) 22. SOURCE_DATA_TYPE short => el tipus de font d’un tipus distinct o tipus REF generat per l’usuari , Tipus

SQL a java.sql.Types (null si DATA_TYPE no és DISTINCT o REF generat per l’usuari)

Els resultats son ordenats per TABLE_SCHEM, TABLE_NAME i ORDINAL_POSITION.

Aconseguir els privilegis d’una Taula i dels camps d’una Taula de la Bases de DadesDisposem dels mètodes getTablePrivileges i de getColumnPrivileges el qual ens dona informació dels privilegis o permisos d’una Taula o bé d’un camp.

Mètode getColumnPrivilegies-> public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) throws SQLException

Retorna la descripció de l’accès o permisos dels camps de les Taules.Cada descripció de privilegi té la informació següent:

Pág. 41 de 92

Page 36: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

1. TABLE_CAT String => Nom catàleg taula (pot ser nul) 2. TABLE_SCHEM String => Nom esquema Taula (pot ser nul) 3. TABLE_NAME String => Nom Taula 4. COLUMN_NAME String => Nom Columna 5. GRANTOR String => grantor d’acéss (pot ser nulll): ID d’autorització de l’usuari que ha otorgat el privilegi.6. GRANTEE String => grantee d’accés: ID d’autorització de l’usuari a qui se li ha otorgat el privilegi. 7. PRIVILEGE String => name of access (SELECT, INSERT, UPDATE, REFRENCES, ...) 8. IS_GRANTABLE String => "YES" si es permet a GRANTEE otorgar aquest privilegi a altres usuaris;; "NO"

si no; null si es desconeix.

Els resultats estan ordenats per COLUMN_NAME i PRIVILEGE. Mètode getTablePrivileges-> public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) throws SQLException

Retorna la descripció de l’accès o permisos de cada Taula disponible en el Catàleg. Cada privilegi d’una taula s’aplica a un o més camps de la taula però en cap cas es erroni assumir que s’apliquen a tots els camps (pot ser veritat solament en algunes Bases de Dades).Cada descripció de privilegi té la informació següent:

1. TABLE_CAT String => Nom catàleg taula (pot ser nul) 2. TABLE_SCHEM String => Nom esquema Taula (pot ser nul) 3. TABLE_NAME String => Nom Taula 4. GRANTOR String => grantor d’acéss (pot ser nulll): ID d’autorització de l’usuari que ha otorgat el privilegi.5. GRANTEE String => grantee d’accés: ID d’autorització de l’usuari a qui se li ha otorgat el privilegi. 6. PRIVILEGE String => name of access (SELECT, INSERT, UPDATE, REFRENCES, ...) 7. IS_GRANTABLE String => "YES" si es permet a GRANTEE otorgar aquest privilegi a altres usuaris;; "NO"

si no; null si es desconeix.

Els resultats estan ordenats per TABLE_SCHEM, TABLE_NAME i PRIVILEGE..

Aconseguir les claus primaries d’una TaulaDisposem del mètode getPrimaryKeys que ens dona les claus primaries d’una Taula.Una clau Primaria (PK) és una camp o varis camps que identifiquen una fila o registre d’una Taula.

Mètode getPrimaryKeys-> public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException

Retorna una descripció dels camps que forma la clau primaria d’una Taula. Cada columna de la clau primaria disposa de la informació:

1. TABLE_CAT String => Nom catàleg taula (pot ser nul) 2. TABLE_SCHEM String => Nom esquema taula (pot ser nul) 3. TABLE_NAME String => Nom Taula 4. COLUMN_NAME String => Nom Columna 5. KEY_SEQ short => Número seqüència dins la clau primaria. 6. PK_NAME String => Nom de la clau primaria (pot ser nul)

Els resultats están ordenats per COLUMN_NAME.

Aconseguir informació Integritat Referencial (claus forànees)Una clau forànea (FK) és un camp o més camps d’una Taula que són usats com a clau primària d’una altre Taula.Disposem dels mètodes getImportedKeys (claus importades), getExportedKey (claus exportades) i getCrossReference (claus creuades).

Pág. 42 de 92

Page 37: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Font: http://help.sap.com/saphelp_nw2004s/helpdata/en/cf/21ea77446011d189700000e8322d00/content.htm

Mètode getExportedKeys

-> public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException

Donada una Taula, retorna una descripció dels camps de clau forànea que formen la clau primaria de la Taula (les claus forànees exportades per una Taula). Cada camp de clau forànea té la següent informació:

1. PKTABLE_CAT String => Nom catàleg clau primaria taula (pot ser nul) 2. PKTABLE_SCHEM String => Nom esquema clau primaria taula (pot ser nul) 3. PKTABLE_NAME String => Nom clau primaria taula4. PKCOLUMN_NAME String => Nom columna clau primaria5. FKTABLE_CAT String => Nom catàleg clau forànea taula (pot ser nul) que está essent exportat (pot ser

nul) 6. FKTABLE_SCHEM String => Nom esquema clau forànea taula (pot ser nul) que está essent exportat (pot

ser nul)7. FKTABLE_NAME String => Nom Taula clau forànea que está essent exportat. 8. FKCOLUMN_NAME String => Nom columna clau forànea que está essent exportat. 9. KEY_SEQ short => Número seqüència dins la clau forànea 10. UPDATE_RULE short => Que passa en la clau forànea quan la clau primaria canvia:

a. importedNoAction – No permetre canviar clau primaria si ha estat importada b. importedKeyCascade – Canviar la clau importada al canviar la clau primaria c. importedKeySetNull – Canviar la clau importada a NULL si la clau primaria ha estat canviat. d. importedKeySetDefault – Canviar la clau importada a valors per defecte si la clau primària ha

estat canviada. e. importedKeyRestrict – el mateix que importedKeyNoAction (per compatibilitat ODBC 2.x)

11. DELETE_RULE short => Que passa en la clau forànea quan la clau primaria es borrada. a. importedKeyNoAction – No permetre supressió sobre clau primaria si ha estat importada b. importedKeyCascade – suprimir files que importen una clau suprimida c. importedKeySetNull – canviar clau importada a NULL si la clau primària ha estat suprimida. d. importedKeyRestrict – el mateix que importedKeyNoAction (per a compatibilitat ODBC 2.x) e. importedKeySetDefault – canviar clau importat a valor per defecte si la clau primaria ha estat

suprimida. 12. FK_NAME String => Nom clau forànea (pot ser nul) 13. PK_NAME String => Nom clau primària (pot ser nul) 14. DEFERRABILITY short => can pot l’evaluació de condicions (constraint) de clau forànea ser aplaçat fins

commita. importedKeyInitiallyDeferred – veure SQL92 per a definició b. importedKeyInitiallyImmediate - veure SQL92 per a definició c. importedKeyNotDeferrable - veure SQL92 per a definició

Els resultats són ordentats per FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, and KEY_SEQ.

Mètode getImportedKeys

Pág. 43 de 92

Page 38: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException

Retorna la descripció de camps de la clau primaria que estan referenciades per camps de clau primaria d’una Taula donada (les claus primaries importades per una Taula). Cada camp de la clau primaria té la descripció:

1. PKTABLE_CAT String => Nom catàleg clau primaria que está essent importat (pot ser nul) 2. PKTABLE_SCHEM String => Nom esquema clau primaria que está essent importat (pot ser nul) 3. PKTABLE_NAME String => Nom taula clau primaria primaria que està essent importat.4. PKCOLUMN_NAME String => Nom columna clau primaria que esta essent importat. 5. FKTABLE_CAT String => Nom catàleg clau forànea (pot ser nul) 6. FKTABLE_SCHEM String => Nom esquema clau forànea (pot ser nul) 7. FKTABLE_NAME String => Nom taula clau forànea 8. FKCOLUMN_NAME String => Nom columna clau forànea 9. KEY_SEQ short => Número seqüència dins la clau forànea 10. UPDATE_RULE short => Que passa a una clau forànea quan la clau primaria canvia:

a. importedNoAction – No permetre canviar la clau primaria si ha estat importada b. importedKeyCascade – Canviar clau importada quan la clau primaria canvia c. importedKeySetNull – Canviar clau importada a NULL si la clau primaria ha estat canviada d. importedKeySetDefault – canviar clau importada a valors per defecte si la clau primaria ha estat

canviada e. importedKeyRestrict – el mateix que importedKeyNoAction (per a compatibilitat amb ODBC 2.x)

11. DELETE_RULE short => Que passa a una clau forànea quan la clau primaria es suprimida: a. importedKeyNoAction – No permetre suprimir la clau primaria si ha estat importada b. importedKeyCascade – suprimir les files que importen la clau suprimirda c. importedKeySetNull – canviar la clau importada a NULL si la clau primaria ha estat suprimida d. importedKeyRestrict – el mateix que importedKeyNoAction (per compatibilitat amb ODBC 2.x) e. importedKeySetDefault – canviar clau importada a valor per defecte si la clau primaria ha estat

suprimida 12. FK_NAME String => Nom clau forànea (pot ser null) 13. PK_NAME String => Nom clau primària (pot ser null) 14. DEFERRABILITY short => pot l’evaluació de condicions (constraint) de clau forànea ser aplaçat fins

commita. importedKeyInitiallyDeferred - veure SQL92 per una definició b. importedKeyInitiallyImmediate - veure SQL92 per una definicióc. importedKeyNotDeferrable - veure SQL92 per una definició

Els resultats estan ordenats per PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME, and KEY_SEQ.

Mètode getCrossReference ResultSet getCrossReference(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException

Retorna una descripció dels camps de clau foranea d’una taula de clau forànea que referencia camps de clau primaria d’una taula de clau primaria (descriu com una taula importa altres claus). Generalment retorna simple clau fornaea/clau primaria ja que moltes taules importen una clau forànea solament des de una taula.Cada camp clau forànea té la descripció:

1. PKTABLE_CAT String => Nom catàleg clau primaria (pot ser nul) 2. PKTABLE_SCHEM String => Nom esquema clau primaria (pot ser nul) 3. PKTABLE_NAME String => Nom taula clau primaria primariay que està essent importat.4. PKCOLUMN_NAME String => Nom columna clau primaria que esta essent importat. 5. FKTABLE_CAT String => Nom catàleg clau forànea (pot ser nul) 6. FKTABLE_SCHEM String => Nom esquema clau forànea (pot ser nul) 7. FKTABLE_NAME String => Nom taula clau forànea 8. FKCOLUMN_NAME String => Nom columna clau forànea

Pág. 44 de 92

Page 39: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

9. KEY_SEQ short => Número seqüència dins la clau forànea 10. UPDATE_RULE short => Que passa a una clau forànea quan la clau primaria canvia:

a. importedNoAction – No permetre canviar la clau primaria si ha estat importada b. importedKeyCascade – Canviar clau importada quan la clau primaria canvia c. importedKeySetNull – Canviar clau importada a NULL si la clau primaria ha estat canviada d. importedKeySetDefault – canviar clau importada a valors per defecte si la clau primaria ha estat

canviada e. importedKeyRestrict – el mateix que importedKeyNoAction (per a compatibilitat amb ODBC 2.x)

11. DELETE_RULE short => Que passa a una clau forànea quan la clau primaria es suprimida: a. importedKeyNoAction – No permetre suprimir la clau primaria si ha estat importada b. importedKeyCascade – suprimir les files que importen la clau suprimirda c. importedKeySetNull – canviar la clau importada a NULL si la clau primaria ha estat suprimida d. importedKeyRestrict – el mateix que importedKeyNoAction (per compatibilitat amb ODBC 2.x) e. importedKeySetDefault – canviar clau importada a valor per defecte si la clau primaria ha estat

suprimida 12. FK_NAME String => Nom clau forànea (pot ser null) 13. PK_NAME String => Nom clau primària (pot ser null) 14. DEFERRABILITY short => pot l’evaluació de condicions (constraint) de clau forànea ser aplaçat fins

commita. importedKeyInitiallyDeferred - veure SQL92 per una definició b. importedKeyInitiallyImmediate - veure SQL92 per una definició c. importedKeyNotDeferrable - veure SQL92 per una definició

Aconseguir els índexs d’una TaulaUn índex és la característica d’una Base de Dades que permet ràpid access a les files d’una Taula. Es creat usant un o més columnes d’una Taula. Disposem del mètode getIndexInfo que ens retornarà informació dels indexs d’una Taula.

Mètode getIndexInfo-> public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException

Retorna una descripció dels índexs I estadístiques d’una Taula donada. Cada descripció de camp índex té la següent informació:

1. TABLE_CAT String => Nom catàleg taula (pot ser nul) 2. TABLE_SCHEM String => Nom esquema taula (pot ser nul) 3. TABLE_NAME String => Nom taula4. NON_UNIQUE boolean => True: Si pot ser que els valors índex no siguin únics (non-unique). False: quan

TYPE és tableIndexStatistic 5. INDEX_QUALIFIER String => Nom catàleg index (pot ser nul); null when TYPE is tableIndexStatistic 6. INDEX_NAME String => nom índex, nul quan TYPE és tableIndexStatistic 7. TYPE short => index type:

a. tableIndexStatistic - this identifies table statistics that are returned in conjuction with a table's index descriptions

b. tableIndexClustered - this is a clustered index c. tableIndexHashed - this is a hashed index d. tableIndexOther - this is some other style of index

8. ORDINAL_POSITION short => column sequence number within index; zero when TYPE is tableIndexStatistic

9. COLUMN_NAME String => column name; null when TYPE is tableIndexStatistic 10. ASC_OR_DESC String => column sort sequence, "A" => ascending, "D" => descending, may be null if sort

sequence is not supported; null when TYPE is tableIndexStatistic 11. CARDINALITY int => When TYPE is tableIndexStatistic, then this is the number of rows in the table;

otherwise, it is the number of unique values in the index. 12. PAGES int => When TYPE is tableIndexStatisic then this is the number of pages used for the table,

otherwise it is the number of pages used for the current index. 13. FILTER_CONDITION String => Filter condition, if any. (may be null)

Els resultats són ordenats per NON_UNIQUE, TYPE, INDEX_NAME, and ORDINAL_POSITION.

Pág. 45 de 92

Page 40: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Aconseguir informació procediments emmagatzemats (stored procedures)Els stored procedures són procediments (i funcions) emmagatzemats a la Base de Dades.Disposem dels mètodes getProcedures y getProcedureColumns.

Mètode getProcedures-> public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException

Retorna la descripció dels procediments emmagatzemats disponibles en un catàleg. Solament la descripció d’un procediment es correspoen aamb l’esquema i Cada procediment té la seguent informació:

1. PROCEDURE_CAT String => Nom catàleg procediment (pot ser nul) 2. PROCEDURE_SCHEM String => Nom esquema procediment (pot ser nul) 3. PROCEDURE_NAME String => Nom procediment4. Reservat per ús futur 5. Reservat per ús futur 6. Reservat per ús futur 7. REMARKS String => Comentaris sobre el procediment 8. PROCEDURE_TYPE short => Tipus de procediment:

a. procedureResultUnknown – Pot retornar un resultat b. procedureNoResult – No retorna un resultat c. procedureReturnsResult – Retorna un resultat

Els resultats són ordenats per PROCEDURE_SCHEM i PROCEDURE_NAME.

Mètode getProcedureColumns-> ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException

Retorna una descripció dels stored procedures que hi ha en el catàleg passat amb els camps de resultat. Es pot especificar patró de búsqueda amb esquema, nom procediment i nom columnes (exemple: començin per ‘C%’). Cada fila del ResultSet és una descrició d’una parámete o camp del procediment amb la informació següent:

1. PROCEDURE_CAT String => Nom catàleg procediment (pot ser nul) 2. PROCEDURE_SCHEM String => Nom esquema procediment (pot ser nul) 3. PROCEDURE_NAME String => Nom procediment 4. COLUMN_NAME String => nom columna/parámetre5. COLUMN_TYPE Short => Tipus de columna/parametre:

a. procedureColumnUnknown – no es coneix b. procedureColumnIn - IN parametre entrada c. procedureColumnInOut - INOUT parametre entrada/sortida d. procedureColumnOut - OUT parametre sortida e. procedureColumnReturn – procediment retorna valor f. procedureColumnResult – columnes resultats en ResultSet

6. DATA_TYPE int => SQL tipus desde java.sql.Types 7. TYPE_NAME String => SQL nom de tipus per a tipus UDT el tipus de nom es completament qualificat 8. PRECISION int => precisió 9. LENGTH int => longitud en bytes de les dades 10. SCALE short => scala 11. RADIX short => base 12. NULLABLE short => pot contindre NULL.

a. procedureNoNulls – no es permeten valors NULL b. procedureNullable – es permet valors NULL c. procedureNullableUnknown – es desconeix la nulabilitat

13. REMARKS String => Comentaris extres que descriuen el parametre/columna

Pág. 46 de 92

Page 41: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Els resultats estan ordenats per PROCEDURE_SCHEM i PROCEDURE_NAME.

3.2.6.2 Interface ResultSetMetaData

La interface ResultSetMetaData representa els metadatos sobre un ResultSet (conjunt de resultats). Amb aquesta interface podrem obtindre i contestar qüestions com:

Obtindre el número de columnes, els noms de columna, tipus i longitud. Trobar els noms de taula per totes les columnes d’un ResultSet. Determinar quan una columna es llegible o no. Determinar el màxim tamany d’una columna? Determinar quan una columna pot ser usada per cláusula SQL WHERE, SELECT,

UPDATE o DELETE.

No es dona cap detall de la seva especificació.

3.2.6.3 Interface ParameterMetaData

La interface ParameterMetaData conté mètodes amb els quals es pot obtindre informació respecte als paràmetres marcats amb ? en una objecte PreparedStatement.Es nou a JDBC 3.0.

No es dona cap detall de la seva especificació.

Pág. 47 de 92

Page 42: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

3.2.7 Conversions de Tipus de Dades

Les següents taules mostren les conversions o mapetjos que es realitzen pel fet de tindre difents tipus de variables segons sigui el món dels Tipus JDBC i dels tipus Java.

Font: JDBC 3.0 Specification (Sun) October 2001

Pág. 48 de 92

Page 43: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Font: JDBC 3.0 Specification (Sun) October 2001

3.2.6 A on s’usa les definicions sobre Java JDBC?

Aquí ens preguntem, i tot aquest ampli conjunt de definicions relacionats amb JDBC a on s’usen? Calen donar-los? Doncs bé, podem dir que s’afegeixen als requeriments i per tant:

Serveix per entendre els drivers (conectors). Usem majoritariament, per qüestions obvies de rendiment i de portabilitat, les de tipus 4 (les de tipus 1 no es recomanen i sols s’usen pel cas especial de Microsoft Acces).

Serveix per entendre d’on surt les respostes que dona el programa en quan a consultes dels objectes d’una Base de Dades, les seves propietats .... Es fa palés que es una implementació estàndard JDBC i que com a tal els diferents gestors l’haurien de seguir.

Son la base de la realització del paquet JDBC de l’aplicació (amb XML.de resposta...).

Pág. 49 de 92

Page 44: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

3.3 XML

3.3.1 XML

XML és l’acrònim de eXtensible Markup Language (llenguatge de marques extensible) i és un metallenguatge (llenguatge per definir altres llenguatges) extensible d’etiquetes desenvolupat per la Word Wide Web Consortium (W3C). És una simplificació de SGML.

Exemple<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ficha> <nombre>Angel</nombre> <apellido>Barbero</apellido> <direccion>c/Ulises, 36</direccion> </ficha>

En el projecte s’ha fet el paquet JDBC de consultes que retornen resultats amb XML.

Parts d’un XML Pròleg (no obligatori)

Conté el DTD (declaració de tipus de document) Cos

Format pels elements, atributs…

3.3.2 Parsejar un XML: SAX XML com a mitjà de transport de dades comporta que per exemple en destí s’hagi de llegir el document XML i convertir-lo en un mitjà entenible en el llenguatge. És a dir, cal passar de l’estructura XML a estructura orientada a objectes (en el cas de Java). Això es pot aconseguir amb els parsers. Un parser senzill que funciona per events es SAX (un altres es DOM que es més complex).

Font: http://www.ibm.com/developerworks/xml/library/x-bindcastor/

Pág. 50 de 92

Page 45: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

3.3.3 A on s’usa XML?

XML l’usem principalment en la definició dels drivers i de l’especificació de les conexions. I, al elaborar Aquí ens preguntem, i tot aquest ampli conjunt de definicions relacionats amb JDBC a on s’usen? Calen donar-los? Doncs bé, podem dir que s’afegeixen als requeriments i per tant: I SAX es usat com a conversió d’XML a objectes Java.

Pág. 51 de 92

Page 46: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

4 Casos d’ús

Entrarem sintèticament en alguns casos d’ús de l’aplicació. Aquí l’usuari o actor es l’únic del sistema. Aquest usuari pot ser Administrador o un usuari Limitat.

JDBCDatabaseMetaData mostran els camps d’una Taula

El següent diagrama de casos d’ús mostra gràficament alguns usos de l’aplicació.

A continuació es descriu amb més detall els casos d’ús.

CAS D’ÚS: Veure Drivers

Pág. 53 de 92

Mantiendre Conexions

Usuari

Veure drivers

Veure Característiques BD

Veure Taules, Vistes, Indexs, Stored Procedures

Introduir Sentencies SQL

Page 47: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Escenari 1 : Veure DriversPrecondicions : Dades en arxiu drivers.xml en format XML.Actor: Usuari (administrador o limitat)Detall operació: Un cop oberta l’aplicació, es pot polsar al menú Arxiu->Conexions->Drivers i es desplegará una pantalla informant dels drivers disponibles d’ús.

Escenari 2 : Canviar DriversPrecondicions : Dades en arxiu drivers.xml en format XML.Actor: Usuari (administrador o limitat)Detall operació: Caldrà mantindre manualment l’arxiu ja que es considera vital i no ha de ser posible modificarlo.

CAS D’ÚS: Mantindre Conexions

Escenari 1 : Veure ConexionsPrecondicions : Dades en arxiu conexions.xml en format XML.Actor: Usuari (administrador o limitat)Detall operació: Un cop oberta l’aplicació, es pot polsar al menú Arxiu->Conexions->Conexions i es desplegará una pantalla informant de les conexions disponibles d’ús.

Escenari 2 : Test ConexionsPrecondicions : Dades en arxiu conexions.xml en format XML.Actor: Usuari (administrador o limitat)Detall operació: Igual que Escenari 1.1. Caldrá seleccionar una conexió disponibles de la taula o bé introduir-ne una nova i acte seguit polsar botó Test on es provará la conexió.

CAS D’ÚS: Veure Característiques Bases de Dades

Escenari 1 : Veure Info Driver Precondicions : Una conexió establerta a la Base de Dades.Actor: Usuari (administrador o limitat)Detall operació: Cal anar a l’arbre d’objectes de la Base de Dades i seleccionar el node Arquitectura i dins el desplegable Driver Info. S’informa entre d’altres el Nom i Versió del driver que s’usa.

Escenari 2 : Analitzar els tipus de variables de la Base de DadesPrecondicions : Una conexió establerta a la Base de Dades.Actor: Usuari (administrador o limitat)Detall operació: Cal anar a l’arbre d’objectes de la Base de Dades i seleccionar el node Arquitectura i dins el desplegable SQL Types. En la Taula del SQL Types mostra els tipus de variables que té el gestor i els mapeja contra els tipus de JDBC (correspondencia).

Escenari 3 : Analitzar els tipus de Taules de la Base de DadesPrecondicions : Una conexió establerta a la Base de Dades.Actor: Usuari (administrador o limitat)Detall operació: Cal anar a l’arbre d’objectes de la Base de Dades i seleccionar el node Arquitectura i dins el desplegable Table Types.

CAS D’ÚS: Veure les Taules de la Bases de Dades

Escenari 1 : Veure Info Taules

Pág. 54 de 92

Page 48: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Precondicions : Un cop obert els catàlegs de la Base de Dades i desplegat el catàleg on es vegin els nodes Taules, Vistes, Indexs i Procediments.Actor: Usuari (administrador o limitat)Detall operació: Cal anar a l’arbre d’objectes i seleccionar el node Taules. Es desplegarà informació sobre les Taules i Permisos d’aquestes.

Escenari 2 : Analitzar info VistesPrecondicions : Un cop obert els catàlegs de la Base de Dades i desplegat el catàleg on es vegin els nodes Taules, Vistes, Indexs i Procediments.Actor: Usuari (administrador o limitat)Detall operació: Cal anar a l’arbre d’objectes i seleccionar el node Vistes. Es desplegarà informació sobre les Taules i Permisos d’aquestes.

CAS D’ÚS: Executar sentencies SQL

Escenari 1 : Veure Info Taules Precondicions : Una conexió a la BD.Actor: Usuari (administrador o limitat)Detall operació: Introduir la sentencia SQL (SELECT, UPDATE, DELETE, CREATE ....) i polsar botó Executar SQL.

Pág. 55 de 92

Page 49: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

5 Disseny i Implementació

Un cop vist i analitzat els requeriments i l’ampli capítol de definicions que calen en els rerqueriments, ara toca entrar en aquest capítol en el disseny i implementació de l’eina. Es descriu com s’estructura internament l’aplicació, sene entrar en gran detalls.

5.1 Disseny interface a l’usuari (GUI)

La inteface amb l’usuari (capa de presentació) contindrà:

Menú d’opcions. Barra d’eines d’opcions directes. Arbre d’objectes de la Base de Dades (en forma d’arbre) situat a la part esquerra Area dreta superior per a entrar instruccions SQL. Ara de resultats (part dreta inferior). Es on es veura tota la informació.

JDBC DatabaseMetaData

Per la elaboració de la interface s’usaran sempre els objectes estàndards que aporta el JDK de java. Així per l’elaboració de la part gràfica s’usarà Java Swing (paquet per l’elaboració gràfica). Hi ha varis gestors per elaborar GUI’s pero Swing és un estàndard Java.

Pels obtindre dinàcament els objectes d’una conexió a una Base de Dades, aquesta es nutrirà del paquet elaborat d’utilitats JDBC: utilitats.jdbc..UTilsJDBC.java. El paquet utilitats.jdbc

Pág. 57 de 92

Page 50: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

conté tota la funcionalitat que fa referencia a JDBC i interrogar els gestors de Bases de Dades.

5.2 Arxius de propietats JDBC

Definirem 2 arxius de propietats vitats pel funcionament de l’eina. Els definrem en XML i usarem l’estàndard que defineix Sun per aquests tipus d’arxius. En la documentació especirfica que el DTD del XML segueix el patró:

<?xml version="1.0" encoding="UTF-8"?> <!-- DTD for properties --> <!ELEMENT properties ( comment?, entry* ) > <!ATTLIST properties version CDATA #FIXED "1.0"> <!ELEMENT comment (#PCDATA) > <!ELEMENT entry (#PCDATA) > <!ATTLIST entry key CDATA #REQUIRED>

Segons en vist en els requeriments són parelles (clau, valor) on els elements de valor van separats entre |. Els arxius de propietats engloba arxiu de drivers (conectors) i arxiu de conexions.

5.2.1 Arxiu conectors JDBC

Aquest es un arxiu vital pel funcionament ja que defineix drivers que implementes les especificacions JDBC de Java. Típicament un arxiu de conectors o drivers en XML serà de la forma:

Nom de l’arxiu: drivers.xmlContingut exemplle:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <!DOCTYPE properties (View Source for full doctype...)> <properties version="1.0">

  <comment>Drivers (Conectors)</comment>   <entry key="mysql">com.mysql.jdbc.Driver|jdbc:mysql://localhost:3306/World</entry>   <entry key="oracle">oracle.jdbc.driver.OracleDriver|

jdbc:oracle:thin:@localhost:1521:xe</entry>   <entry key="sqlserver">com.microsoft.sqlserver.jdbc.SQLServerDriver|jdbc:sqlserver://

localhost:1433;databaseName=master</entry>   <entry key="mysql">com.mysql.jdbc.Driver|jdbc:mysql://localhost:3306/World</entry>   <entry key="db2">com.ibm.db2.jcc.DB2Driver|jdbc:db2://localhost:50000/sample</entry>   <entry key="odbcmaccess">sun.jdbc.odbc.JdbcOdbcDriver|jdbc:odbc:C:\\Archivos de

programa\\Microsoft Office 2003\\OFFICE11\\SAMPLES\\neptuno.mdb</entry> </properties>

Si s’analitza amb cura es veu que les Key’s són els dbVendors (els sistemes gestors de Base de Dades) i com a valor tenen dos camps separats per la barra on a la part esquerra barra hi ha nom driver o cadena driver i a la part dreta de la barra hi figura el format de la cadena conexió (URL).

5.2.2 Arxiu de conexions JDBC

Aquest es un arxiu de diferents conexions a Bases de Dades i es nutreix de l’arxiu de drivers.Les key’s o claus són nom de conexió (text lliure) donat i els valors es composa dels elements (separats per |) on cada element segueix patró tipus element = valor.

Description: descripció de la conexió (text lliure). dbVendor: nom del gestor de la Base de Dades (serveix de víncul a l’arxiu de drivers)

Pág. 58 de 92

Page 51: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

url: cadena de conexió particular a la conexió segons el model que es dona al carregar driver. Aquest normalment inclou direcció física i Port de l’oient de la Base de Dades (programa resident que espera solicituts).

Usuari: Usuari conexió Base de Dades reconegut Password: Password d’accés.

Nom de l’arxiu: conexions.xmlContingut exemplle:

  <?xml version="1.0" encoding="UTF-8" standalone="no" ?>   <!DOCTYPE properties (View Source for full doctype...)> <properties version="1.0">

  <comment>Conexions a SGBDR</comment>   <entry key="mysql JCC">description=Conexió a MySQL i a BD Word|dbVendor=mysql|

url=jdbc:mysql://localhost:3306/World|user=root|password=admin</entry>   <entry key="oracle HR">description=Conexió Oracle HR|dbVendor=oracle|

url=jdbc:oracle:thin:@localhost:1521:xe|user=HR|password=admin</entry>   <entry key="oracle system">description=Conexió Oracle system|dbVendor=oracle|

url=jdbc:oracle:thin:@localhost:1521:xe|user=system|password=admin</entry>   <entry key="sqlserver">description=SQL

Server|dbVendor=sqlserver|url=jdbc:sqlserver://localhost:1433;databaseName=master|user=sa|password=sys46670458</entry>

  <entry key="db2 JCC">description=Conexió DB2|dbVendor=db2|url=jdbc:db2://localhost:50000/sample|user=db2admin|password=admin</entry>

  <entry key="MSAccess JCC">description=Conexió ODBC|dbVendor=odbcmaccess|url=jdbc:odbc:C:\\Archivos de programa\\Microsoft Office 2003\\OFFICE11\\SAMPLES\\neptuno.mdb|user=sa|password=admin</entry>

</properties>

5.3 Patró de disseny

En petits apartats i pel que fa a la presentació de dades (taules de resultats) se separa les dades de la inteface. S’usa una variant del patro MVC (Model-Vista-Controlador) coneguda com a Model Delegate on junta Vista-Controlador en un.

Aquest patró s’usa típlicament en les Taules on segons la figura veiem el Model: Tabla Model Object.

5.4 Disseny de clases i paquets

Pág. 59 de 92

Page 52: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Al treballar amb Java estem obligats a definir tota l’aplicació en classes i pensar en elles. També hi ha els paquets (package’s) que són agrupacions.

Vista de paquets i classes de l’explorador d’objectes IDE Eclipse pel programa JDBCDatabaseMetaData

Divisió programa en paquets (cada paquet amb les seves classes). (D’utilitats penja jdbc I xml)

Els paquets de l’aplicació són:

JDBCDatabaseMetaData Conté el cos aplicació (clases amb finalitat propies).

JDBCModel Conté clases on hi ha model de dades. Destacar les claes que nutreixen els tipus de dades per cada tipu de taula que es representa en pantalla (exemple: InfoTablePrimaryKeys defineix la informació que fa referencia a les claus d’una taula).

Pág. 60 de 92

Page 53: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Veiem també les clases ModelTaulaDades i ModelTaulaResultSet que es el model patró seguit per Taules.

utilitats.jdbc.Dins el paquet hi ha la clase UtilsJDBC on es defineix el conjunt ampli de funcions que nutreix l’aplicació. Tots aquests mètodes fan referencia a JDBC i a interrogar el gestor de Base de Dades actiu.Els resultats es poden cridar per a que es maneguin en l’estàndard d’intercanvi de dades XML o bé en Taules (array’s) de Java.

utilitats.xmlAquí es defineixen clases d’utilitats xml pròpies de l’aplicació. Hi ha la clase UtilsXML. Destacar clase prototip de conversió d’objectes XML a objectes Java (array). Es el parse SAX.

5.4.1 Paquet JDBCDatabaseMataData

Aquí conté la classe que posa en marxa el programa. Es la clase JDBCDatabaseMetaData.. Es dona a continuació les classes que es consideren realment importants del paquet (package).

Clase JDBCDataBaseMetaDataEs la clase on es posa en marxa tot el procés (es a on hi ha main(String[] args) ). Aquesta instancia la classe JDBCMainFrame que construirà el GUI..

Clase JDBCMainFrameAquesta clase es la responsable de presentar el GUI de l’aplicació. A través d’aquesta i amb les opcións i botóns i events definits, serà la que instanciarà la resta de classes.

Clase JDBCDriversAquesta clase es la responsable de presentar el dialeg dels Drivers o Conectors que s’usen per conectarse al gestor Base de Dades.

Clase JDBCConexionsAquesta clase es la responsable de presentar el diàleg de les Conexions.Sera responsable d’efectuar la conexió a la Base de Dades un cop omplert les dades necessàries (cadena Driver, cadena Conexió, usuari i password).

Pág. 61 de 92

Page 54: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Clase JDBCTreeNavigatorAquesta clase representa l’arbre d’objectes d’una conexió a una Base de Dades. Es construeix dinamicament segons les parts que es solicita (en cap cas es carrega de cop).

Clase JDBCDatabaseConnectionAquesta clase representa la conexió a la BD. En ella s’hi guarda la instancia de l’aobjecte Connection.. Guarda les dades de la conexió tal com es pot veure en el retall d’una part de la clase. El constructor de la clase es qui crea l’objecte amb la conexió vigent.

public class JDBCDatabaseConnection {

private boolean conectatSiNo = false;private Connection conn = null;private DatabaseMetaData mtdt = null;private static JDBCDatabaseConnection instancia;private String dbVendor;

public JDBCDatabaseConnection() { instancia = this; }

public JDBCDatabaseConnection(String url, String driver, String login,String password) throws Exception {

instancia = this;conn = utilitats.jdbc.UtilsJDBC.getConnection(url, driver, login, password);if (conn != null) {

conectatSiNo = true;}

} -------- --------}

5.4.2 Paquet utilitats.jdbc

La clase important que es defineix dins el package utilitats.jdbc es: UtilsJDBC. Aquesta clase es el cor de l’aplicació JDBC ja que conté els mètodes que intereccionen amb la Base de Dades i retorna els resultats (en XML o en Array).

Hi ha tot un ventall de mètodes que es donaran més endavant.

5.4.3 Paquet utilitats.xml

Conté utilitats que s’usen per XML. Conté també proves parser SAX de XML a objectes Java.

5.5 Implementació: Eines i Tecnologies usades

Es donen les eines i Tecnologies que s’usen (ja s’ha parlat a la introducció). Aquí es de forma sintética.

5.5.1 Paquet JDBCDatabaseMataData

Les eines de treball amb que es realitzarà és:

o JavaSE - JDK (Java Development Kit) Entorn de Desenvolupament en Java que inclou el JRE (Java Runtime Environment) necesari per a que s’executi l’aplicació,

Pág. 62 de 92

Page 55: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

o IDE Eclipse Entorn de desenvolupament

i per a poder treballar caldrà els conectors que es posaran a la llibreria /ext del JRE

5.5.2 Tecnologies

Podem destacar la introducció de XML com a estàndard reconegut.

5.6 Implementació GUI

El GUI de l’apart de disseny es l’encarregat de rebre les peticions de l’usuari usant la programació per events. Els encarregats de resoldre aquest aspecte son els oients (Listening’s) dels objectes que hi ha al GUI. Aquesta no deixa de representar la capa Controlador del conegut model Model-Vista-Controlador (MVC) on el controlador ressolt les peticions i el model les soluciona.

Exemple: Botó Executar SQL

JToolBar tbSQL = new JToolBar();tbSQL.setFloatable(false);m_displaySQL = new JTextField();m_displaySQL.setEditable(false);m_displaySQL.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));Action actionExecutarSQL = new AbstractAction("Executar SQL", iconaExecutarSQL) {

public void actionPerformed(ActionEvent e) {ExecuteSQL();

}};bt_ExecuteSQL = new JButton(actionExecutarSQL);iconaExecutarSQL =

JDBCUtils.createImageIcon("images/icones/IconaExecutarSQL.JPG");bt_ExecuteSQL.setIcon(iconaExecutarSQL);

5.7 Implementació paquet utilitats.jdbc

Aquest és el paquet més important de l’aplicació i representa la interacció del sistema amb la Base de Dades.

5.7.1 Indicacions generals

Constants

Es defineix en ella unes constants d’interés, entre d’altres:

public static final int MAX_ROWS_IN_SELECT = 1000;

public static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";

La primera constant es refereix al número màxim de files que es mostraran en pantalla al carregar una consulta de les dades d’una Taula. Es una solució per a que no es saturi la memòria pero la forma professional ha d’incloure paginació i carregarse pàgina a pàgina.

La segona es refereix a les capçaleres dels XML que es generan.

Metode getMetaData

Pág. 63 de 92

Page 56: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Sovint en les funcions començen totes d’igual manera invocant al métode getMetaData per preparar (no aconseguir!) els MetaDatos. Acte seguit es crida la funció dels MetaDatos en concret que interessa (si Taules, si Vistes, si Procediments, si claus primaries ....)

Exemple: Aconseguir info Arquitectura en format XML

public static String getEngineInfoAsXML (Connection conn) throws Exception {// Aconseguir Metadatos de la conexióDatabaseMetaData mtdt = conn.getMetaData();if (mtdt == null) { return null; }

------- sb.append("<InfoDatabase>\n");UtilsXML.appendXMLTag(sb, "DatabaseProductName", mtdt.getDatabaseProductName());UtilsXML.appendXMLTag(sb, "DatabaseProductVersion", mtdt.getDatabaseProductVersion());

-----

Tipus de dades SQL

Aquí per saber els java.sql.Types i mapejarlos a JDBC Types usa tècnica avançada de reflection (reflexió)

5.7.2 Mètodes

Els mètodes s’agrupen en categories per a facilitar treball. La nomenclatura dels mètodes es molt important ja que faciliten molt saber el que fan en sols lleguir el nom del mètode.

Es dona a continuació un esboç d’alguns mètodes per a que es vegi les nomemclatures que s’usa:

Referent a obrir conexió

public static Connection getConnection (String driver, String url, String user, String password)- private static void loadDriver(String sDriver)- private static Connection getConnectionDriverManager (String sURLConn, String userName, String password)

Referent a tancar objectes

public static void close(Connection conn) public static void close(ResultSet rs) public static void close(Statement stmt) public static void close(PreparedStatement pstmt)

Referent a Execució Consulta SQL I Sentencia SQL

En ArrayString public static String[][] getColumnNamesAndDataSQLQuerySentenceAsArryString(Connection conn,

String sqlQuery) public static String[][] getColumnNamesAndDataSQLSentenceAsArryString(Connection conn, String sql)- private static void checkForWarnings (SQLWarning warn)- private static String[][] getColumnNamesAndDataResultSetAsArrayString (ResultSet rs)- private static String[] getColumnNamesResultSetAsArrayString(ResultSet rs)- private static String[][] getOnlyDataResultSetAsArrayString(ResultSet rs)

Referent a Informació Sessió

En XML public static String getSessionInfoAsXML (Connection conn)En Array String public static String[][] getSessionInfoAsArrayString (Connection conn)

Referent a Informació Arquitectura

Pág. 64 de 92

Page 57: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

En XML public static String getEngineInfoAsXML (Connection conn)En Array String public static String[][] getEngineInfoDatabaseAsArrayString (Connection conn) public static String[][] getEngineInfoDriverAsArrayString (Connection conn)

Referent a Característiques BD

En XML public static String getFeaturesInfoAsXML (Connection conn)En Array String public static String[][] getFeaturesInfoAsXMLAsArrayString (Connection conn)

Referent a Tipus SQL disponibles

En XML public static String getAvailableSQLTypesAsXML (Connection conn)En Array String public static String[][] getAvailableSQLTypesAsArrayString (Connection conn)

Usa com a privat: - public static String getJdbcTypeName(int jdbcType)

Referent a Informació Catàlogs i Esquemes

En XML public static String getCatalogsAsXML(Connection conn)En Array String public static String[] getCatalogsAsArrayString(Connection conn)

Referent a Claus Forànees

En XML public static String getTableImportedKeysAsXML (Connection conn,

String catalog, String schema, String table) throws Exception----En Array String---- public static String[][] getTableExportedKeysAsArrayString (Connection conn,

String catalog, String table) throws Exception

5.7 Implementació conexions

Segons les expecificacions JDBC hi han 4 tipus de drivers (controladors). Els controladors de Tipus 4 són controladors java pur (faciliten portabilitat) i es fan conexions directes. Els controladors de Tipus 1 implementen la API JDBC amb correlació a una altre API d’access a dades usualment ODBC – Open Database Connectivity.

Usarem per a conectarnos a les BD’s els controladors subministrats pels SGBDR. Son de Tipus 4 i implementen JDBC 3.0. Una excepció és la Base de Dades Microsoft Access pel qual usarem Tipus 1.

Conexió a una BD usant la interface DriverManager del package java.sql.

Els passos que caldrà que a conectarnos a una Base de Dades es:

1. Carregar el controlador o driver JDBCEs carrega el controlador usant el mètode forName de la clase Class del package

Pág. 65 de 92

Page 58: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

java.lang.Forma: Class.forName(sDriver) on sDriver es el nom controlador. Excepcions: ClassNotFoundExceptionNota: La recent especificació JDBC 4 no caldrà (existirà un mecanisme automàtic).

2. Crear la conexió usant el controlador JDBCS’invoca al mètode DriverManager.getConnection. Admet varies formes: - Connection DriverManager.getConnection (String url); - Connection DriverManager.getConnection (String url, String user; String password); - Connection DriverManager getConnection (String url, Properties info);

Es dona 2 taules amb informació dels formats dels drivers o controladors i del format de la conexió.

Nom comuns dels controladors per a diferents SGBDR provatsdbVendor Nom comú del ControladorDB2 com.ibm.db2.jcc.DB2Driver.MySQL com.mysql.jdbc.DriverSQL Server 2005 com.microsoft.sqlserver.jdbc.SQLServerDriverOracle oracle.jdbc.driver.OracleDriverMS Access Sun.jdbc.odbc.JdbcOdbcDriver (Subministrat per Sun)

Nomenclatura URL segons diferents SGBDR provatsdbVendor Exemples formats URL comunsDB2 “jdbc.db2://<servidor>[:<port>]:<BaseDades>”

Exemple: “jdbc:db2://localhost:50000/sample” MySQL “jdbc.mysql://<servidor>[:<port>]:<BaseDades>”

Exemple: “jdbc:mysql://localhost:3306/World”SQL Server 2005 Exemple: “jdbc:sqlserver://localhost:1433:databaseName=master”Oracle “jdbc.oracle:

Exemple: “jdbc:oracle:thin:@localhost:1521:xe”Oracle “jdbc.oracle:

Exemple: “jdbc:oracle:thin:@localhost:1521:xe”MS Access “jdbc.odbc: <FuenteODBC>

Exemple: “jdbc:odbc:BDMAccessNeptuno

Els mètodes generics per a carregar driver I per realitzar conexió són:

Métode genèric per a carregar driver

private static void loadDriver(String sDriver) throws Exception {try {Class.forName(sDriver).newInstance();

} catch(ClassNotFoundException e) {// throw new Exception(e.toString());throw new Exception("Error al carregar el Driver");

}}

Métode genèric per a realitzar conexió

private static Connection getConnectionDriverManager (String sURLConn, String userName, String password) {

try {Connection conn;conn = DriverManager.getConnection(sURLConn, userName, password);return conn;

} catch (SQLException sqle) {

} return null;}

Pág. 66 de 92

Page 59: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

La forma de realitzar les conexions en entors de producció no són els més adeqüats. Cal implementar o millor dit usar pools de conexions els quals permet reaprofitar conexions per tal de no saturar els servidors.

Pág. 67 de 92

Page 60: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

6 Joc de proves JDBC

Aquest capítol està destinat a proporcionar els joc de proves a que es sotmet la especificació JDBC front a Sistemes Gestors de Bases de Dades relacionas comuns.

6.1 Proves ConexionsS’ha provat les conexions a diferents gestors de Bases de Dades usant les cadenes driver i cadena de conexió següents (son exemples):

DB2sDriver = "com.ibm.db2.jcc.DB2Driver";sURLConn = "jdbc:db2://localhost:50000/sample";

MySQLsDriver = "com.mysql.jdbc.Driver";sURLConn = "jdbc:mysql://localhost:3306/World";

SQL Server 2005sDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";sURLConn = "jdbc:sqlserver://localhost:1433;databaseName=master";

OraclesDriver = "oracle.jdbc.driver.OracleDriver";sURLConn = "jdbc:oracle:thin:@localhost:1521:xe";

MS AccesssDriver = "sun.jdbc.odbc.JdbcOdbcDriver";sURLConn = "jdbc:odbc:BDMAccessNeptuno”;

Tos els drivers provats son de Tipus 4 que són els recomenats per Sun (100 % Java), a excepció de MS Access que es fa necessari usar ODBC. En l’exemple BDMAccessNeptuno representa la conexió a la Base de Dades Neptuno d’exemple del paquet de Microsoft. 6.2 Provant interface DatabaseMetaData i ResultSetMetaData

6.2.1 Introducció

Un cop establerta una conexió a una Base de Dades, la interface DatabaseMetaData ens dona molta informació. Desgraciadament, cada driver te les seves particularitats i dificultats.

Font: Apress – JDBC Metadata, MySQL and Oracle Recipies. A Problem Solution [2006]Pág. 69 de 92

Page 61: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

6.2.2 Provant DatabaseMetaData

Es dona solament alguns exemples inicials de jocs de proves de la interface DatabaseMetaData.

6.2.2.1 Aconseguir informació Sessió

Per aconseguir informació sobre la sessió s’usa:

String getURL() – Dona la URL de la BD que ens em conectat. String getUserName() – Dona el nom usuari (login) a la BD.

Posem per exemple la part de codi que genera el XML amb la informació solicitada. Es pot veure que es construeixen els Tags d’inici i final usant el paquet UtilsXML i s’hi passa el contingut. public static String getSessionInformationAsXML (Connection conn) throws Exception {

// Aconseguir Metadatos de la conexióDatabaseMetaData mtdt = conn.getMetaData();if (mtdt == null) { return null; }// StringBuffer sb = new StringBuffer(Constants.XML_HEADER + "\n");StringBuffer sb = new StringBuffer();sb.append("<SessionInformation>\n");UtilsXML.appendXMLTag(sb, "URLInUse", mtdt.getURL());UtilsXML.appendXMLTag(sb, "userNameDB", mtdt.getUserName());sb.append("</SessionInformation>");return sb.toString();

}

Es mostra a continuació les sortides per alguns gestors. Els tags per si sols son descriptius del que contenen (en negreta).

DB2

<SessionInformation>  <URLInUse>jdbc:db2://localhost:50000/sample</URLInUse>   <userNameDB>db2admin</userNameDB> </SessionInformation>

MySQL

<SessionInformation>  <URLInUse>jdbc:mysql://localhost:3306/World</URLInUse>   <userNameDB>root@localhost</userNameDB> </SessionInformation>

SQL Server 2005

<SessionInformation><URLInUse>jdbc:sqlserver://

localhost:1433;selectMethod=direct;lastUpdateCount=true;databaseName=master;</URLInUse>   <userNameDB>sa</userNameDB> </SessionInformation>

Oracle

<SessionInformation>  <URLInUse>jdbc:oracle:thin:@localhost:1521:xe</URLInUse>   <userNameDB>SYSTEM</userNameDB> </SessionInformation>

MS Access

<SessionInformation>  <URLInUse>jdbc:odbc:BDMAccessNeptuno</URLInUse>   <userNameDB>admin</userNameDB> ----RESULTAT DOLENT </SessionInformation>

Tots donen informació correcta, excepte a MS Access que dona resultats dolents!Pág. 70 de 92

Page 62: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

6.2.2.2 Aconseguir informació identificació Bases de Dades i del Driver usats

Volem aconseguir informació de la indentificació de la Base de Dades que estem conectats i del Driver que estem usant per la conexió (conector dbVendor del gestor).Per a tal usarem les funcions:

String getDatabaseProductName() – Nom BD (dvVendor) String getDatabaseProductVersion() – Versió BD. int getDatabaseMinorVersion() – Número Versió nivell superior. Ex: Versió 10.2.1 retorna 10 int getDatabaseMajorVersion() – Número Versió dins del nivell superior. Ex: versio 10.2.1 retorna 2 String getDriverName() – Nom Driver String getDriverVersion() – Versió Driver int getDriverMinorVersion() – Número Driver nivell superior. Ex: Versió 10.2.1 retorna 10 int getDriverMajorVersion() – Número Driver nivell superior. Ex: Versió 10.2.1 retorna 10

Els resultats que ens dona al invocar mètode getEngineInfoAsXML per a diferents gestors són:

DB2

<EngineInformation>  <DatabaseProductName>DB2/NT</DatabaseProductName>   <DatabaseProductVersion>SQL09012</DatabaseProductVersion>   <DatabaseMinorVersion>1</DatabaseMinorVersion>   <DatabaseMajorVersion>9</DatabaseMajorVersion>   <DriverName>IBM DB2 JDBC Universal Driver Architecture</DriverName>   <DriverVersion>3.1.57</DriverVersion>   <DriverMinorVersion>1</DriverMinorVersion>   <DriverMajorVersion>3</DriverMajorVersion> </EngineInformation>

MySQL

<EngineInformation>  <DatabaseProductName>MySQL</DatabaseProductName>   <DatabaseProductVersion>5.0.37-community-nt</DatabaseProductVersion>   <DatabaseMinorVersion>0</DatabaseMinorVersion>   <DatabaseMajorVersion>5</DatabaseMajorVersion>   <DriverName>MySQL-AB JDBC Driver</DriverName>   <DriverVersion>mysql-connector-java-5.0.5 ( $Date: 2007-03-01 00:01:06 +0100 (Thu, 01 Mar 2007) $, $Revision: 6329 $ )</DriverVersion>   <DriverMinorVersion>0</DriverMinorVersion>   <DriverMajorVersion>5</DriverMajorVersion> </EngineInformation>

SQL Server 2005

<EngineInformation>  <DatabaseProductName>Microsoft SQL Server</DatabaseProductName>   <DatabaseProductVersion>9.00.3042</DatabaseProductVersion>   <DatabaseMinorVersion>0</DatabaseMinorVersion>   <DatabaseMajorVersion>9</DatabaseMajorVersion>   <DriverName>Microsoft SQL Server 2005 JDBC Driver</DriverName>   <DriverVersion>1.1.1501.101</DriverVersion>   <DriverMinorVersion>1</DriverMinorVersion>   <DriverMajorVersion>1</DriverMajorVersion> </EngineInformation>

Oracle

<EngineInformation>  <DatabaseProductName>Oracle</DatabaseProductName>   <DatabaseProductVersion>Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production</DatabaseProductVersion>   <DatabaseMinorVersion>2</DatabaseMinorVersion>   <DatabaseMajorVersion>10</DatabaseMajorVersion>   <DriverName>Oracle JDBC driver</DriverName>   <DriverVersion>10.2.0.1.0XE</DriverVersion>   <DriverMinorVersion>2</DriverMinorVersion>

Pág. 71 de 92

Page 63: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

  <DriverMajorVersion>10</DriverMajorVersion> </EngineInformation>

MS Access

<EngineInformation>  <DatabaseProductName>ACCESS</DatabaseProductName>   <DatabaseProductVersion>04.00.0000</DatabaseProductVersion>   <DatabaseMinorVersion>?</DatabaseMinorVersion>   <DatabaseMajorVersion>?</DatabaseMajorVersion>   <DriverName>JDBC-ODBC Bridge (odbcjt32.dll)</DriverName>   <DriverVersion>2.0001 (04.00.6304)</DriverVersion>   <DriverMinorVersion>1</DriverMinorVersion>   <DriverMajorVersion>2</DriverMajorVersion> </EngineInformation>

Analitzant els resultats totos donen una informació coherent amb el que s’espera.

6.2.2.3 Aconseguir característiques (arquitectura) de la Base de Dades

Aqui englobem varis apartats d’informació repecte l’arquitectura de la Base de Dades: Informació general, de suport i de límitacions. Les hem posat juntes. N’hi ha tot un ventall, pero solament ens hem quedat en algunes que poden ser d’interès.

String getShemaTerm() – Nom terme esquema que s’usa a la BD String getCatalogTerm() – Nom terme catàleg que s’usa a la BD String getProcedureTerm() – Nom terme procediment que s’usa a la BD String getSQLKeywords() – Sentencies SQL que s’usen a la BD String getNumericFunctions() – Funcions numèriques String getStringFunctions() – Funcios d’strings String getSystemFunctions() – Funcions de sistema String getTimeDateFunctions() – Funcions d’hora i Dia boolean supportsANSI92FullSQ() – si suporta ANSI 92 SQL boolean supportsMiniumSQLGrammar() – si suporta la mínima Gramàtica SQL boolenn supportsCoreSQLGrammar() – si soporta Gramàtica SQL int MaxColumnsInSelect() -- retorna el número màxim de camps admesos en una SELECT int MaxColumnsInGroupBy() -- retorna el número màxim de camps admesos en la clàusula GROUP BY

Els resultats que ens dona al invocar mètode getFeaturesInfoAsXML per a alguns gestors són:

DB2

<FeaturesInformation>  <ShemaTerm>schema</ShemaTerm>   <CatalogTerm>null</CatalogTerm>   <ProcedureTerm>stored procedure</ProcedureTerm>  <SQLKeyords>AFTER,ALIAS,ALLOW,APPLICATION,ASSOCIATE,ASUTIME,AUDIT,AUX,AUXILIARY,BEFORE,BINARY,BUFFERPOOL,CACHE,CALL,CALLED,CAPTURE,CARDINALITY,CCSID,CLUSTER,COLLECTION,COLLID,COMMENT,CONCAT,CONDITION,CONTAINS,COUNT_BIG,CURRENT_LC_CTYPE,CURRENT_PATH,CURRENT_SERVER,CURRENT_TIMEZONE,CYCLE,DATA,DATABASE,DAYS,DB2GENERAL,DB2GENRL,DB2SQL,DBINFO,DEFAULTS,DEFINITION,DETERMINISTIC,DISALLOW,DO,DSNHATTR,DSSIZE,DYNAMIC,EACH,EDITPROC,ELSEIF,ENCODING,END-EXEC1,ERASE,EXCLUDING,EXIT,FENCED,FIELDPROC,FILE,FINAL,FREE,FUNCTION,GENERAL,GENERATED,GRAPHIC,HANDLER,HOLD,HOURS,IF,INCLUDING,INCREMENT,INDEX,INHERIT,INOUT,INTEGRITY,ISOBID,ITERATE,JAR,JAVA,LABEL,LC_CTYPE,LEAVE,LINKTYPE,LOCALE,LOCATOR,LOCATORS,LOCK,LOCKMAX,LOCKSIZE,LONG,LOOP,MAXVALUE,MICROSECOND,MICROSECONDS,MINUTES,MINVALUE,MODE,MODIFIES,MONTHS,NEW,NEW_TABLE,NOCACHE,NOCYCLE,NODENAME,NODENUMBER,NOMAXVALUE,NOMINVALUE,NOORDER,NULLS,NUMPARTS,OBID,OLD,OLD_TABLE,OPTIMIZATION,OPTIMIZE,OUT,OVERRIDING,PACKAGE,PARAMETER,PART,PARTITION,PATH,PIECESIZE,PLAN,PRIQTY,PROGRAM,PSID,QUERYNO,READS,RECOVERY,REFERENCING,RELEASE,RENAME,REPEAT,RESET,RESIGNAL,RESTART,RESULT,RESULT_SET_LOCATOR,RETURN,RETURNS,ROUTINE,ROW,RRN,RUN,SAVEPOINT,SCRATCHPAD,SECONDS,SECQTY,SECURITY,SENSITIVE,SIGNAL,SIMPLE,SOURCE,SPECIFIC,SQLID,STANDARD,START,STATIC,STAY,STOGROUP,STORES,STYLE,SUBPAGES,SYNONYM,SYSFUN,SYSIBM,SYSPROC,SYSTEM,TABLESPACE,TRIGGER,TYPE,UNDO,UNTIL,VALIDPROC,VARIABLE,VARIANT,VCAT,VOLUMES,WHILE,WLM,YEARS</SQLKeyords>  <NumericFunctions>ABS,ACOS,ASIN,ATAN,ATAN2,CEILING,COS,COT,DEGREES,EXP,FLOOR,LOG,LOG10,MOD,POWER,RADIANS,RAND,ROUND,SIGN,SIN,SQRT,TAN,TRUNCATE</NumericFunctions>

Pág. 72 de 92

Page 64: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

 <StringFunctions>ASCII,CHAR,CONCAT,DIFFERENCE,INSERT,LCASE,LEFT,LENGTH,LOCATE,LTRIM,REPEAT,REPLACE,RIGHT,RTRIM,SOUNDEX,SPACE,SUBSTRING,UCASE</StringFunctions>   <SysstemFunctions>?> / SysstemFunctions>   <TimeDateFunctions /C   <supportsMinimumSQLGrammar>true</supportsMinimumSQLGrammar>   <supportsCoreQLGrammar>true</supportsCoreQLGrammar>   <supportsExtendedSQLGrammar>true</supportsExtendedSQLGrammar>   <supportsANSI92FullSQL>false</supportsANSI92FullSQL>   <supportsANSI92IntermediateSQL>false</supportsANSI92IntermediateSQL>   <supportsANSI92EntryLevelSQL>true</supportsANSI92EntryLevelSQL>   <supportsGroupByUnrelated>true</supportsGroupByUnrelated>   <supportsOuterJoins>true</supportsOuterJoins>   <MaxColumnsInSelect>1012</MaxColumnsInSelect>   <MaxColumnsInGroupBy>1012</MaxColumnsInGroupBy>   </FeaturesInformation>

SQL Server 2005

<FeaturesInformation>  <ShemaTerm>schema</ShemaTerm>   <CatalogTerm>database</CatalogTerm>   <ProcedureTerm>stored procedure</ProcedureTerm>  <SQLKeyords>BACKUP,BREAK,BROWSE,BULK,CHECKPOINT,CLUSTERED,COMPUTE,CONTAINS,CONTAINSTABLE,DATABASE,DBCC,DENY,DISK,DISTRIBUTED,DUMMY,DUMP,ERRLVL,EXIT,FILE,FILLFACTOR,FREETEXT,FREETEXTTABLE,FUNCTION,HOLDLOCK,IDENTITY_INSERT,IDENTITYCOL,IF,KILL,LINENO,LOAD,NOCHECK,NONCLUSTERED,OFF,OFFSETS,OPENDATASOURCE,OPENQUERY,OPENROWSET,OPENXML,OVER,PERCENT,PLAN,PRINT,PROC,RAISERROR,READTEXT,RECONFIGURE,REPLICATION,RESTORE,RETURN,ROWCOUNT,ROWGUIDCOL,RULE,SAVE,SETUSER,SHUTDOWN,STATISTICS,TEXTSIZE,TOP,TRAN,TRIGGER,TRUNCATE,TSEQUAL,UPDATETEXT,USE,WAITFOR,WHILE,WRITETEXT</SQLKeyords>   <NumericFunctions>ABS,ACOS,ASIN,ATAN,ATAN2,CEILING,COS,COT,DEGREES,EXP, FLOOR,LOG,LOG10,MOD,PI,POWER,RADIANS,RAND,ROUND,SIGN,SIN,SQRT,TAN,TRUNCATE</NumericFunctions>   <StringFunctions>ASCII,CHAR,CONCAT, DIFFERENCE,INSERT,LCASE,LEFT,LENGTH,LOCATE,LTRIM,REPEAT,REPLACE,RIGHT,RTRIM,SOUNDEX,SPACE,SUBSTRING,UCASE</StringFunctions>   <SysstemFunctions>DATABASE,IFNULL,USER</SysstemFunctions>   <TimeDateFunctions>DATABASE,IFNULL,USER</TimeDateFunctions>   <supportsMinimumSQLGrammar>true</supportsMinimumSQLGrammar>   <supportsCoreQLGrammar>true</supportsCoreQLGrammar>   <supportsExtendedSQLGrammar>false</supportsExtendedSQLGrammar>   <supportsANSI92FullSQL>false</supportsANSI92FullSQL>   <supportsANSI92IntermediateSQL>false</supportsANSI92IntermediateSQL>   <supportsANSI92EntryLevelSQL>true</supportsANSI92EntryLevelSQL>   <supportsGroupByUnrelated>true</supportsGroupByUnrelated>   <supportsOuterJoins>true</supportsOuterJoins>   <MaxColumnsInSelect>4096</MaxColumnsInSelect>   <MaxColumnsInGroupBy>0</MaxColumnsInGroupBy> ----RESULTAT INCONGRUENT </FeaturesInformation>

Oracle

<FeaturesInformation>  <ShemaTerm>schema</ShemaTerm>   <CatalogTerm /> ----IE7 falla per buits   <ProcedureTerm>procedure</ProcedureTerm>   <SQLKeyords>ACCESS, ADD, ALTER, AUDIT, CLUSTER, COLUMN, COMMENT, COMPRESS, CONNECT, DATE, DROP, EXCLUSIVE, FILE, IDENTIFIED, IMMEDIATE, INCREMENT, INDEX, INITIAL, INTERSECT, LEVEL, LOCK, LONG, MAXEXTENTS, MINUS, MODE, NOAUDIT, NOCOMPRESS, NOWAIT, NUMBER, OFFLINE, ONLINE, PCTFREE, PRIOR, all_PL_SQL_reserved_ words</SQLKeyords>  <NumericFunctions>ABS,ACOS,ASIN,ATAN,ATAN2,CEILING,COS,EXP,FLOOR,LOG,LOG10,MOD,PI,POWER,ROUND,SIGN,SIN,SQRT,TAN,TRUNCATE</NumericFunctions>  <StringFunctions>ASCII,CHAR,CONCAT,LCASE,LENGTH,LTRIM,REPLACE,RTRIM,SOUNDEX,SUBSTRING,UCASE</StringFunctions>   <SysstemFunctions>USER</SysstemFunctions>   <TimeDateFunctions>USER</TimeDateFunctions>   <supportsMinimumSQLGrammar>true</supportsMinimumSQLGrammar>   <supportsCoreQLGrammar>true</supportsCoreQLGrammar>   <supportsExtendedSQLGrammar>true</supportsExtendedSQLGrammar>   <supportsANSI92FullSQL>false</supportsANSI92FullSQL>   <supportsANSI92IntermediateSQL>false</supportsANSI92IntermediateSQL>   <supportsANSI92EntryLevelSQL>true</supportsANSI92EntryLevelSQL>   <supportsGroupByUnrelated>true</supportsGroupByUnrelated>   <supportsOuterJoins>true</supportsOuterJoins>

Pág. 73 de 92

Page 65: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

  <MaxColumnsInSelect>0</MaxColumnsInSelect>   <MaxColumnsInGroupBy>0</MaxColumnsInGroupBy> </FeaturesInformation>

6.2.2.4 Aconseguir Tipus variables SQL de la BD i el seu mapeig a tipus JDBC

Volem aconseguir informació sobre els Tipus de variables que manega el gestor de Base de Dades (variables SQL) i les volem fer correspondres amb les variables que maneja l’expecificació JDBC. Pels tipus senzills com els enters INTEGER solen ser directes però hi han altres com GRAPHIC (gràfic) que es mapeja a CHAR. Per exemple:

  <type vendorTypeName="INTEGER" data_type="4" jdbcTypeName="INTEGER" />  <type vendorTypeName="money" data_type="3" jdbcTypeName="DECIMAL" />  <type vendorTypeName="xml" data_type="-1" jdbcTypeName="LONGVARCHAR" />

veiem que el tipus money es correspon amb el tipus DECIMAL,i el tipus xml es correspon amb LONGVARCHAR. Però, el tipus INTEGER són el mateix en ambdòs sentits.

Per aconseguir s’invoca al mètode getTypeInfo dels metadatos de la Base de Dades el qual retorna un ResulSet. Per aaconsegur el Tipus Java a partir del Tipus SQL es fa ús de la tècnica de reflectation.

Un codi que resolt informa dels mapejos SQL Types versus JDBC Types és:

public static String getAvailableSQLTypesAsXML (Connection conn) throws Exception {// Aconseguir Metadatos de la conexióDatabaseMetaData mtdt = conn.getMetaData();if (mtdt == null) { return null; }// StringBuffer sb = new StringBuffer(Constants.XML_HEADER + "\n");sb.append("<AvailableSQLTypes>\n");

// Aconseguir info tipus ResultSet rs = mtdt.getTypeInfo(); while (rs.next()) { // Obtenir: database-specific type name String typeName = rs.getString("TYPE_NAME"); // Obtenir mapeig: database-specific type -> java.sql.Types type short dataType = rs.getShort("DATA_TYPE"); String jdbcTypeName = getJdbcTypeName(dataType); sb.append("\n<type vendorTypeName=\"" + typeName + "\" " + "data_type=\"" + dataType + "\" " + "jdbcTypeName=\"" + jdbcTypeName + "\" />"); }

sb.append("\n</AvailableSQLTypes>");return sb.toString();

}

static Map map;// Convertim java.sql.Types a jdbc types // Retorna el nom del tipus JDBC Type (null si no es reconeix)// NOTA: S’usa tècnica Reflectionpublic static String getJdbcTypeName(int jdbcType) {if (map == null) {map = new HashMap();// Aconseguim el camp a java.sql.TypesField[] fields = java.sql.Types.class.getFields();for (int i=0; i<fields.length; i++) {try {// Nom I valor del campString name = fields[i].getName();Integer value = (Integer)fields[i].get(null);// Afeim al mapmap.put(value, name);

} catch (IllegalAccessException e) {}

}}// Retornem el nom del JDBC type return (String)map.get(new Integer(jdbcType));

}

Pág. 74 de 92

Page 66: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Les diferents sortides per a alguns gestors en XML dona com a resultat:

DB2

<AvailableSQLTypes>  <type vendorTypeName="BIGINT" data_type="-5" jdbcTypeName="BIGINT" />   <type vendorTypeName="LONG VARCHAR FOR BIT DATA" data_type="-4" jdbcTypeName="LONGVARBINARY" />   <type vendorTypeName="VARCHAR () FOR BIT DATA" data_type="-3" jdbcTypeName="VARBINARY" />   <type vendorTypeName="CHAR () FOR BIT DATA" data_type="-2" jdbcTypeName="BINARY" />   <type vendorTypeName="LONG VARCHAR" data_type="-1" jdbcTypeName="LONGVARCHAR" />   <type vendorTypeName="LONG VARGRAPHIC" data_type="-1" jdbcTypeName="LONGVARCHAR" />   <type vendorTypeName="CHAR" data_type="1" jdbcTypeName="CHAR" />   <type vendorTypeName="GRAPHIC" data_type="1" jdbcTypeName="CHAR" />   <type vendorTypeName="DECIMAL" data_type="3" jdbcTypeName="DECIMAL" />   <type vendorTypeName="INTEGER" data_type="4" jdbcTypeName="INTEGER" />   <type vendorTypeName="SMALLINT" data_type="5" jdbcTypeName="SMALLINT" />   <type vendorTypeName="REAL" data_type="7" jdbcTypeName="REAL" />   <type vendorTypeName="DOUBLE" data_type="8" jdbcTypeName="DOUBLE" />   <type vendorTypeName="VARCHAR" data_type="12" jdbcTypeName="VARCHAR" />   <type vendorTypeName="VARGRAPHIC" data_type="12" jdbcTypeName="VARCHAR" />   <type vendorTypeName="DATE" data_type="91" jdbcTypeName="DATE" />   <type vendorTypeName="TIME" data_type="92" jdbcTypeName="TIME" />   <type vendorTypeName="TIMESTAMP" data_type="93" jdbcTypeName="TIMESTAMP" />   <type vendorTypeName="XML" data_type="1111" jdbcTypeName="OTHER" />   <type vendorTypeName="DISTINCT" data_type="2001" jdbcTypeName="DISTINCT" />   <type vendorTypeName="BLOB" data_type="2004" jdbcTypeName="BLOB" />   <type vendorTypeName="CLOB" data_type="2005" jdbcTypeName="CLOB" />   <type vendorTypeName="DBCLOB" data_type="2005" jdbcTypeName="CLOB" /> </AvailableSQLTypes>

SQL Server 2005

<AvailableSQLTypes>  <type vendorTypeName="sql_variant" data_type="-150" jdbcTypeName="null" />   <type vendorTypeName="uniqueidentifier" data_type="1" jdbcTypeName="CHAR" />   <type vendorTypeName="ntext" data_type="-1" jdbcTypeName="LONGVARCHAR" />   <type vendorTypeName="xml" data_type="-1" jdbcTypeName="LONGVARCHAR" />   <type vendorTypeName="nvarchar" data_type="12" jdbcTypeName="VARCHAR" />   <type vendorTypeName="sysname" data_type="12" jdbcTypeName="VARCHAR" />   <type vendorTypeName="nchar" data_type="1" jdbcTypeName="CHAR" />   <type vendorTypeName="bit" data_type="-7" jdbcTypeName="BIT" />   <type vendorTypeName="tinyint" data_type="-6" jdbcTypeName="TINYINT" />   <type vendorTypeName="tinyint identity" data_type="-6" jdbcTypeName="TINYINT" />   <type vendorTypeName="bigint" data_type="-5" jdbcTypeName="BIGINT" />   <type vendorTypeName="bigint identity" data_type="-5" jdbcTypeName="BIGINT" />   <type vendorTypeName="image" data_type="-4" jdbcTypeName="LONGVARBINARY" />   <type vendorTypeName="varbinary" data_type="-3" jdbcTypeName="VARBINARY" />   <type vendorTypeName="binary" data_type="-2" jdbcTypeName="BINARY" />   <type vendorTypeName="timestamp" data_type="-2" jdbcTypeName="BINARY" />   <type vendorTypeName="text" data_type="-1" jdbcTypeName="LONGVARCHAR" />   <type vendorTypeName="char" data_type="1" jdbcTypeName="CHAR" />   <type vendorTypeName="numeric" data_type="2" jdbcTypeName="NUMERIC" />   <type vendorTypeName="numeric() identity" data_type="2" jdbcTypeName="NUMERIC" />   <type vendorTypeName="decimal" data_type="3" jdbcTypeName="DECIMAL" />   <type vendorTypeName="money" data_type="3" jdbcTypeName="DECIMAL" />   <type vendorTypeName="smallmoney" data_type="3" jdbcTypeName="DECIMAL" />   <type vendorTypeName="decimal() identity" data_type="3" jdbcTypeName="DECIMAL" />   <type vendorTypeName="int" data_type="4" jdbcTypeName="INTEGER" />   <type vendorTypeName="int identity" data_type="4" jdbcTypeName="INTEGER" />   <type vendorTypeName="smallint" data_type="5" jdbcTypeName="SMALLINT" />   <type vendorTypeName="smallint identity" data_type="5" jdbcTypeName="SMALLINT" />   <type vendorTypeName="float" data_type="6" jdbcTypeName="FLOAT" />   <type vendorTypeName="real" data_type="7" jdbcTypeName="REAL" />   <type vendorTypeName="varchar" data_type="12" jdbcTypeName="VARCHAR" />   <type vendorTypeName="datetime" data_type="93" jdbcTypeName="TIMESTAMP" />   <type vendorTypeName="smalldatetime" data_type="93" jdbcTypeName="TIMESTAMP" /> </AvailableSQLTypes>

Oracle

<AvailableSQLTypes>  <type vendorTypeName="INTERVALDS" data_type="-104" jdbcTypeName="null" />   <type vendorTypeName="INTERVALYM" data_type="-103" jdbcTypeName="null" />   <type vendorTypeName="TIMESTAMP WITH LOCAL TIME ZONE" data_type="-102" jdbcTypeName="null" />   <type vendorTypeName="TIMESTAMP WITH TIME ZONE" data_type="-101" jdbcTypeName="null" />   <type vendorTypeName="NUMBER" data_type="-7" jdbcTypeName="BIT" />

Pág. 75 de 92

Page 67: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

  <type vendorTypeName="NUMBER" data_type="-6" jdbcTypeName="TINYINT" />   <type vendorTypeName="NUMBER" data_type="-5" jdbcTypeName="BIGINT" />   <type vendorTypeName="LONG RAW" data_type="-4" jdbcTypeName="LONGVARBINARY" />   <type vendorTypeName="RAW" data_type="-3" jdbcTypeName="VARBINARY" />   <type vendorTypeName="LONG" data_type="-1" jdbcTypeName="LONGVARCHAR" />   <type vendorTypeName="CHAR" data_type="1" jdbcTypeName="CHAR" />   <type vendorTypeName="NUMBER" data_type="2" jdbcTypeName="NUMERIC" />   <type vendorTypeName="NUMBER" data_type="4" jdbcTypeName="INTEGER" />   <type vendorTypeName="NUMBER" data_type="5" jdbcTypeName="SMALLINT" />   <type vendorTypeName="FLOAT" data_type="6" jdbcTypeName="FLOAT" />   <type vendorTypeName="REAL" data_type="7" jdbcTypeName="REAL" />   <type vendorTypeName="VARCHAR2" data_type="12" jdbcTypeName="VARCHAR" />   <type vendorTypeName="DATE" data_type="91" jdbcTypeName="DATE" />   <type vendorTypeName="DATE" data_type="92" jdbcTypeName="TIME" />   <type vendorTypeName="TIMESTAMP" data_type="93" jdbcTypeName="TIMESTAMP" />   <type vendorTypeName="STRUCT" data_type="2002" jdbcTypeName="STRUCT" />   <type vendorTypeName="ARRAY" data_type="2003" jdbcTypeName="ARRAY" />   <type vendorTypeName="BLOB" data_type="2004" jdbcTypeName="BLOB" />   <type vendorTypeName="CLOB" data_type="2005" jdbcTypeName="CLOB" />   <type vendorTypeName="REF" data_type="2006" jdbcTypeName="REF" /> </AvailableSQLTypes>

6.2.2.5 Aconseguir Tipus de Taules que manega el gestor

Volem averiguar quines Tipus de Taules manega un gestor. Això ho aconseguirem invocant el mètoe getTableTypes(). Per exemple, algunes sortides en XML han estat:

MySQL

<AvailableTableTypes>  <type>TABLE</type>  <type>VIEW</type>  <type>LOCAL TEMPORARY</type></AvailableTableTypes>

DB2

<AvailableTableTypes>  <type>ALIAS</type>  <type>HIERARCHY TABLE</type>  <type>INOPERATIVE VIEW</type>  <type>MATERIALIZED QUERY TABLE</type>  <type>NICKNAME</type>  <type>SYSTEM TABLE</type>  <type>TABLE</type>  <type>TYPED TABLE</type>  <type>TYPED VIEW</type>  <type>VIEW</type></AvailableTableTypes>

Oracle

<AvailableTableTypes>  <type>TABLE</type>  <type>VIEW</type>  <type>SYNONYM</type></AvailableTableTypes>

SQL Server

<AvailableTableTypes>  <type>SYSTEM TABLE</type>  <type>TABLE</type>  <type>VIEW</type></AvailableTableTypes>

6.2.2.6 Aconseguir les Catàlegs i Esquemes gestor

Pág. 76 de 92

Page 68: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

El terme Catàleg i Esquema són termes en què cada conector va per lliure. I això complica la gestió ja que cal usar “parxes” depenent de quin gestor s’estigui treballant (dbVendor). En aquest sentit:

Per a Oracle, s’usa Schema (Esquema) per nom base de dades i en canvi per a MySQL s’usa Catalog (catàleg) per nom base de dades. SQL Server va igual que MySQL.

SQL Server

<AvailableCatalogs> <Catalog>AdventureWorksLT</Catalog> <Catalog>master</Catalog> <Catalog>model</Catalog> <Catalog>msdb</Catalog> <Catalog>tempdb</Catalog> <Catalog>TESTBD1</Catalog></AvailableCatalogs>

MySQL

<AvailableCatalogs> <Catalog>information_schema</Catalog> <Catalog>mysql</Catalog> <Catalog>test</Catalog> <Catalog>testbd1</Catalog> <Catalog>world</Catalog></AvailableCatalogs>

6.2.2.7 Aconseguir els Noms de Taules i de Vistes

Per aconseguir els Noms de Taules i de Vistes cal usar el mètode getTables i passar-li si el que es vol es TABLE o bé VIEW al paràmetre tipus taula. Ara bé a Oracle cal usar la sentència SQL ja que la invocació ens retorna tots els objectes tant si son de sistema com si d’usuari.

select object_name from user_objects where object_type = 'TABLE';

Una sortida ha estat:

Oracle

<AvailableUserTables> <Table>COUNTIRES</Table> <Table>DEPARTMENTS</Table> <Table>EMPLOYEES</Table> <Table>JOB_HISTORY</Table> <Table>JOBS</Table> <Table>REGIONS</Table></AvailableUserTables>

MySQL

<AvailableUserTables> <Catalog Name=”WORLD”>  <Table>COUNTIRES</Table>  <Table>DEPARTMENTS</Table>  <Table>EMPLOYEES</Table>  <Table>JOB_HISTORY</Table>  <Table>JOBS</Table>  <Table>REGIONS</Table> </Catalog></AvailableUserTables>

<AvailableUserViews> <Catalog Name=”WORLD”>  <View>CITYESP</View> </Catalog></AvailableUserViews>

Pág. 77 de 92

Page 69: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

6.2.2.8 Aconseguir els camps i detalls d’una Taula o Vista

Per aconseguir els noms i detalls dels camps d’una Taula o vista invocarem el mètode del paquet UtilsJDBC getTableOrViewColumnsAsXML el qual usa getColumns().

MySQL

<AvailableColumnsTable> <Catalog Name=”WORLD”>  <Table=”TABLE1”> <columns>  <column name=”ID”>

<type>varchar</type> <size>10</size> <nullable>false</nullable> <position>1</position>

</column>  <column name=”name”>

<type>varchar</type> <size>20</size> <nullable>false</nullable> <position>2</position>

</column>  <column name=”age”>

<type>int</type> <size>11</size> <nullable>true</nullable> <position>3</position>

</column>  <column name=”address”>

<type>varchar</type> <size>100</size> <nullable>true</nullable> <position>4</position>

</column> </columns> </Table> </Catalog></AvailableUserViews>

6.2.2.9 Aconseguir les claus primaries d’una Taula

Per aconseguir les claus primàries d’una Taula usarem getTablePrimaryKeysAsXML el qual usa getPrimaryKeys.

MySQL

Per exemple, la descripció que ens dona MySQL de TABLE1 del catàleg WORLD és: +---------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+--------------+------+-----+---------+-------+| id | varchar(10) | | PRI | | || name | varchar(20) | | PRI | | || age | int(11) | YES | | NULL | || address | varchar(100) | YES | | NULL | |+---------+--------------+------+-----+---------+-------+4 rows in set (0.02 sec)

i la sortida XML és:

<AvailableTablePrimaryKeys> <Catalog Name=”WORLD”>  <Table=”TABLE1”>  <column name=”ID” keySeq=”1” />  <column name=”name” keySeq=”2” /> </Table> </Catalog></ AvailableTablePrimaryKeys>

Pág. 78 de 92

Page 70: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

6.2.3 Provant ResultSetMetaData

La interface ResultSetMetaData representen els metadatos d’un conjunt de resultats (ResultSet) d’executar una operació de consulta.

Aquest s’usa al introduir una Sentencia SQL qualsevol en la part superior de l’aplicació. La sortida es correspon amb els resultats esperats.

Pág. 79 de 92

Page 71: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

7 Planificació i Costos Reals

En el primer apartat d’quest capítol està destinat a analitzar la planificació seguida per a la realització del projecte analitzant les etapes que han estat necessarìes. En el segon apartat veurem quins costos suposa la seva posta en real.

7.1 PlanificacióPer a l’elaboració del projecte s’ha dividit en varies fases o etapes. Totes son necessàries i tenen la seva importancia. No es recomenable implementar sense dissenyar i sense abans haber efectuat el corresponent anàlisis de requeriments (SRS).

La part de Disseny i Implementació i la part de Documentació es porten el percentatge més gran de dedicació.

7.2 Costos Reals Per a calcular el cost real del projecte cal tenir en compte els costos associats. Tot i això no es tindran en compte els costos de posada en producció. Aquests costos es clasifiquen en:

Costos HardwareCostos derivats de la plataforma de desenvolupament del sistema.

Pág. 81 de 92

Page 72: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Costos SoftwareCostos derivats

Costos Recursos HumansCostos derivats de les tasques realitzades pel personal involucrat en un projecte.

7.2.1 Costos Hardware

Pel desenvolupament s’ha utilitzat un portàtil marca HP-Compaq model NX-9420 Core 2 Duo de febrer’07. El preu del producte va ser d’uns 1200 €.

Pel projecte, considerem un cost imputable del 10% de manera que serien 120 €. La vida útil del Hardware pot ser superior a 3 anys i el projecte té curta durada.

7.2.2 Costos Software

El software usat ha estat el següent:

Categoria Producte Preu NotesSistema Operatiu Windows XP Home Edition 80 € OEM inclós en portàtilIDE Eclipse SDK v3.3 Gratuït Java JDK 6 Update 2 Gratuït Inclou JDBCBases de Dades MySQL v5.0.41 Gratuït

Oracle Database 10g Release 2 Gratuït Express EditionMicrosoft SQL Server 2005 Gratuït Express EditionDB2 Express-C v9.1.2 Gratuït Express EditionMicrosoft Access 2003 (Neptuno.mdb) 50 € *

Conectors Propis de cada gestor Base de Dades GratuïtProcessador de Textes

Microsoft Word 2003 50 € *

Fulla de càcul Microsoft Excel 2003 50 € * * Microsoft Office 2003 conté els productes Word i Access 2003

Son preus estimats

Pràcticament tot el que s’ha usat es gratuït. Solament cal un cost petit pel Sistema Operatiu i Microsoft Office 2003. Una alternativa totalment gratüita es sota Linux.

7.2.3 Costos Recursos Humans

El càlcul dels preus de cada Tipus de Professional involucrats en un projecte pot variar sustancialment d’una empresa a una altre. No hi ha un estàndard. Tot i això podem trobar un preu mínim / mitjà amb els següents valors:

Tipus de professional Unitats Preu/Hora (Brut)

Analista 1 35,00 €/hProgramador 1 25,00 €/hCap de Projecte 1 50,00 €/h

Donat el tamany del projecte, la figura del Cap de Projecte es decideix despendre. Un cap de projecte sol ser l’encarregat de coordinar el projecte, gestionar temps i recursos, reunions ... Solament ho englobarem tot en les figures (o rols) d’Analista i de Programador.

La següent taula mostra les hores de treball necessàries de cada professional i el cost econòmic que suposen (d’alguna manera cal que sumien les 180 h descrites en l’especificació).

Professional Hores Cost

Pág. 82 de 92

Page 73: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

TreballadesAnalista 90 h. 3.150,00 €/hProgramador 90 h. 2.250,00 €

Total: 1 5.400,00 €

Notar que l’Analista serà l’encarregat de l’anàlisi, disseny, especificació i documentació, mentres que el programador serà l’encarregat de la implementació i proves oportunes.

7.2.4 Cost Total

La suma dels costos ens proporcionarà informació del cost total del projecte.

Professional Hores Treballades Cost

Analista 90 h. 3.150,00 €/hProgramador 90 h. 2.250,00 €

Total: 1 5.400,00 €

Nota: Hi ha costos que entrarien en la categoria d’altres (conexió a internet i altres). No s’han considerat.

Pág. 83 de 92

Page 74: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

8 Conclusions

Es preten valorar el cumpliment dels objectius fixats a l’inici del projecte. També es presenten millores i ampliacions per sentar les bases de la realitzaació d’un projecte de caràcter professional. Finalment es descriu com els objectius personals com a consequencia del projecte.

6.1 Resultats i compliment dels objectiusEl objectiu bàsic del projecte es ben clar: usar els drivers dels diferents fabricants de Bases de Dades que implementen la especificació JDBC de Java. I l’objectiu també es clar: obtindre tota la informació possible d’una conexió a una Base de Dades. La informació es veure les característiques internes i els objectes (taules, vistes, indexs…). Aquesta conexió i els objectes depen evidentment del perfil de cada usuari. No veurà el mateix un usuari administrador que un usuari limitat. Vista l’experiencia amb el projecte veiem que l’anunciada especificació única JDBC d’obtenció d’informació de la Base de Dades d’una mateixa forma per a totes les Bases de Dades es quedi en va. I es que veiem que depèn molt del driver i de les “ganes” del fabricant d’implementar l’especificació tal com la defineix Java. Un es desilusiona bastant arribats a aquest punt: particularitats de cada dbVendor (fafricant) i el necessari ús de “parxes” per a que funcioni.

Referents als objectius també es ben clar: posar a prova Java i JDBC davant a diferents gestors de Bases de Dades.

6.2 Possibles milloresUna de les fites importants d’un projecte es quan surt la “temuda” primera versió ja que aquesta es on es materialitzen les ideies i objectius. Però un cop arribats aquí i quan porta un rodatje, ja es pensa en millores, en enfocs diferents i en arrengar malfuncionaments.

A continuació exposo algunes característiques mínimes adicionals desitjables que hauria d’incorporar la eina. Tot i que permet introduir sentencies SQL que permenten multitud d’operacions, no deixa de ser més agradable que aquestes es fagin de forma visual. En destaquem:

Manteniment complert informació Taules: afegir, canviar i borrar dades de forma visual. Definir Bases de Dades. Definir usuaris i privilegis sobre els diferents objectes de la Base de Dades. Alterar estructura d’una taula: afegir, borrar, canviar camps, relacions. Definir vistes, índexs. Eines d’importació i exportació de dades.

Cal donar opcions per posar i extreure dades. Hauria de poderse exportar i importar dades a formats tant comunts com EXCEL i PDF.

Eines visuals de relacions entre Bases de Dades (entitat-relació).

I una important avui dia és que es fes una versió via web. Aixó portaria una avantatge que no caldria efectuar instalacions locals.

Pág. 85 de 92

Page 75: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

6.3 Objectius personalsL’objectiu personal del projecte es ben clar: introduirse en el món de la programació orientada a objectes amb Java i el món de les Bases de Dades usant la part JDBC de java que les tracta. El que he aconseguit es una mera introducció a tot un ampli món. I essent realistes, un se n’adona que falta molt per aprendre malgrat haver après moltes coses.

A nivell personal el tema no quedarà aquí i ben segur que podré aprendre moltes tècniques que em serveixin per aconseguir els objectius.

Pág. 86 de 92

Page 76: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

9 Bibliografia

Aquest capítol està destinat a proporcionar la bibliografia de suport emprada. Es dona enllaços per a obtenir informació.

Part programació Java Sun (http://java.sun.com/)

Java Tutorials URL: http://java.sun.com/docs/books/tutorial/index.html JDBC Metadata, MySQL, and Oracle Recipes A Problem-Solution Approach

Mahmoud Parsian. Apress. 2006. JAVA EE 5 compatible.URL: http://www.apress.com/ Ref. Llibre: http://www.apress.com/book/bookDisplay.html?bID=10098

Part gestors de Bases de Dades Anar als portals de cada gestor de Bases de Dades o veure el capítol introductori. En síntesi:

MySQL (http://dev.mysql.com/downloads/mysql/5.0.html. ) Oracle (http://www.oracle.com/ ) DB2 (http://www-306.ibm.com/software/data/db2/express/.) Microsoft Access I Microsoft SQL Server (http://www.microsoft.com/ )

Pág. 87 de 92

Page 77: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Apèndix 1 Acrónims i Definicions

Aquest capítol està destinat a descriure el projecte, els objectius, motius de realització. Es descriurá també les eines de treball emprades.

1.1 Acrònims

Tecnologia General

Abrev. Nom Traducció

API Application Programming Interface Interficie de programació d’aplicacióANSI American National Standard InstituteURL Uniform Resource Locator Localitzador Uniforme de Recursos

Tecnologia Bases de Dades

Abrev. Nom Traducció

JDBC Java Database ConnectivityODBC Open DataBase Connectivity

RDBMS Relational Data Base Management System Sistema Gestor de Bases de Dades RelacionalSQL Structured Query Languaje Llenguatge de Consulta Estructurat

Tecnologia Web, Llenguatges de marques

Abrev. Nom Traducció

WWW World Wide WebXML eXtensible Markup Language Llenguatge de marques extèsSGML Standard Generalized Markup Language Llenguatge de marcatge generalitzatHTML HyperText Markup Language Llenguatge de marques hipertextualsxHTML eXtensible Hypertext Markup Language Llenguatge extés de marcatge d’hipertexte

1.2 Definicions

JavaSE - JDK (Java Development Kit) Entorn de Desenvolupament en Java que inclou el JRE (Java Runtime Environment)). Inclou utilitats command-line de desenvolupament. A juny’07, la versió actual es jdk 1.6u1. Ja s’està treballant per la versió 7. Es pot trovar a URL: http://java.sun.com/javase/

JDBC Java Database ConectivityEs una API que permet realitzar opeacions sobre Bases de Dades des del llenguatje de programació Java usant SQL.

Database - Base de Dades

Pág. 89 de 92

Page 78: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Una Base de Dades (BD) és una colecció de dades emmagatzemades de fàcil accès. Les Bases de dades relacionals (BDR) és un model de Bases de Dades on la informació s’estructura en relacions vistes de manera simple com taules composades de registres (files) i de camps (columnes).

ÍndexUn índex es una carácterística de les Bases de Dades que permet ràpid accés a les files o registres d’una Taula o fitxer. Els índexs són creats usant un o més columnes d’una Taula.

VistaUna vista d’una Base de Dades és el resultat d’un consulta SQL de zero, una o varies taules. Les vistes tenen la mateixa estructura que una Taula: files (resgistres) i columnes (camps).

ODBC – Open DataBase ConnectityEs la API de Microsoft per a conectivitat a Bases de Dades. Escrit en llenguatge C. La ideia es proporcionar una interfac única d’acess a la Base de Dades.

XML – eXtensible Markup LanguageEs un metallenguatge d’etiquetes desenvolupat per la World Wide Web Consortium (W3C). Es una simplificació i adaptació del SGML.

Serialització (“marshalling”)Es un procés de codificació d’un objecte a una sèrie de bytes o format legible com XML per a ser transmès d’un lloc a un altre o guardat.

URL - Uniform Resource Locator (localizador uniforme de recurso). Es una secuencia de caracteres, de acuerdo a un formato estándar, que se usa para nombrar recursos, como documentos e imágenes en Internet, por su localización. Format general: protocolo://máquina/directorio/fichero o bé protocolo://usuario:contraseña@máquina:puerto/directorio/ficheroExemple: http://es.Wikipedia.org/

Pág. 90 de 92

Page 79: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Apèndix 2 Breu Manual Usuari

Aquest capítol està destinat a explicar sinteticament el funcioament de l’aplicació. I es que no deixa de ser molt intuitiva i per tant solament es dona algunes pantalles que es consideren ilustratives.

AP-2 Pantalla Inicial El punt de partida de l’aplicació es la clase JDBCDatabaseMetaData del paquet JDBCDatabaseMetaData. Aquí conté el condi que posa en marxa el software i en conseqüència apareix la pantalla inicial.

JDBC DatabaseMetaData

La pantalla está dividia en varis apartats:

Part MenúMostra les opcions de menú d’acces a certes operatives tal com veure drivers, gestionar les conexions (testejarles i conectar), visualitzar l’ajuda HTML….

Part Barra d’EinesEns serveix per anar directament a operatives tal com veure drivers, gestionar conexions (testejarles i conectar) i desconectar conexió Base de Dades actual.

Part Arbre d’objectesEns mostra informació sobre nom conexió activa amb el seu Arbre d’objectes de la Base de Dades. L’arbre es construeix de forma dinàmica segons el que es demani.

Pág. 91 de 92

Page 80: JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...

Els nodes principals de la conexió son: Info Sessió, Arquitectura i Catàlegs. Al desplegar els catàlegs ens trobem que cada catàleg trobarem nodes internes sobre Taules, Vistes, Indexs i Procediments Emmagatzemats.

Part Sentencies SQLEs lloc per introduir qualsevol sentència SQL vàlida. Podem introduir SELECT, UPDATE, DELETE, CREATE...

Part ResultatsMostra els resultats de les consultes que es fagin activant la informació asiciada als nodes de l’Arbre d’Objectes o bé els resultats de les Sentencies SQL introduides.

JDBC DatabaseMetaData: Crèdits

Pág. 92 de 92