Títol: Volum: Alumne:

advertisement
Títol: JDBC DatabaseMetaData
Volum: 1/1
Alumne: Joan Costa Canal
Director/Ponent: Lluís Solano Albajes
Departament: LSI
Data: 08-07-2007
Pág. 1 de 94
Pág. 3 de 94
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 94
Í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 94
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 94
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 projecte
El 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 drivers
Caldrà 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...
Pág. 11 de 94
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
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 mercat
Convé 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
Pág. 12 de 94
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.
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:
Pág. 13 de 94



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.
1.4 Justifiació del projecte
Convé 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
Pág. 14 de 94
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”.
IDE Eclipse
Entorn 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://www306.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.ht
ml
S’ha baixat la versió Universial (Multi-Byte Unicode). Interface aplicació inclou espanyol.
Microsoft SQL Server 2005 Express Edition SP2
Es pot trovar a: http://www.microsoft.com/downloads/details.aspx?familyid=31711D5D725C-4AFA-9D65-E4465CDFF1E7&displaylang=es. Interface en Espanyol. Publicació:
28-feb-2007.
Versions lliures
Pág. 15 de 94

MySQL v5.0.41
Es 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.
Controlador JDBC de Microsoft SQL Server 2005 v1.1.1501.101 (Publicació: 02-feb2007)
Es pot trovar a:
http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=6d483869816a-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=6053C6F882C8-479C-B25B-9ACA13141C9E&displaylang=es. Interface en Espanyol. Publicació:
17-feb-2007.
MySQL GUI Tools Bundle for 5.0 r12
Eina 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
Pág. 16 de 94
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:






Especificació de Requeriments
Es dona informació del que fa l’aplicaicó (funcionalitats) i requeriments no funcionals
(elements necessaris per l’aplicació).
Conceptes sobre Base de Dades i Java JDBC
Es 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’ús
Es 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)
Proves
Es pretèn donar algunes proves ilustratives del funcionament de l’aplicació
Apèndixs
Esta format per un resum d’acrònims/definicions i per un breu manual de l’aplicació.
Pág. 17 de 94
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 requeriments
Per 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)





Pág. 19 de 94
Definicions








Bases de dades relacionals
La 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 SQL
Ordres-Comandes en SQL que interaccionen amb una BD (consultes, actualitzacions....)
Taula
Conjunt de dades relacionades vista com una representació en camps (columnes) i
registres (files)
Vista
Consulta 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ànees
Clau 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 Emmagatzemats
Rutines 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 drivers
Caldrà 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.
Pág. 20 de 94



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
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ífics
Una 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 SGBDR
Ha 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
Pág. 21 de 94

(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 SGBDR
Ha 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
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 Dades
Ha 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 Dades
Hauria 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 Dades
Hauria 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.
Pág. 22 de 94


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 Dades
Ha 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.
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.
Pág. 23 de 94
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.
Document
XML
Objectes
Java
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
Pág. 24 de 94
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. 25 de 94
3
Conceptes sobre Bases de Dades i Java
JDBC
Aquest 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 Dades
Es 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
Pág. 27 de 94
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:


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
Pág. 28 de 94
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
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 SQL
Al 1992 apareix SQL-92 (SQL2), al 1999 apareix SQL:1999 (SQL3)
Revisions ANSI SQL
Alias
Nom
SQL-87
SQL-86 | SQL-1
SQL-89
SQL2
SQL-92
SQL3
SQL-1999
SQL:2003
Any
1986
1989
1992
1999
2003
Comentaris
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 …
Pág. 29 de 94
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,
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)
Pág. 30 de 94
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
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:
Pág. 31 de 94


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
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 driver
Permet 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.
Pág. 32 de 94



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 driver
Escrit 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.
Tipus 1: Pont JDBC-ODBC
Tipus 2: Java Binari
Tipus 4: Java Protocol / Natiu
Tipus 3: Java Protocol independent
3.2.3 API JDBC
Pág. 33 de 94
La API JDBC proporciona interfaces i clases per accedir i processar dades usualment d’una BD
relacional.
Paquets importants:
Package
java.sql
javax.sql
Descripció
Defineix la API JDBC
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 DriverManager
Objecte
Tipus
Descripció
DriverManager
clase
Per a fer una conexió a un driver
SQLPermission
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 Dades
Objecte
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)
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 Java
Objecte
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 DATE
Ref
interface
Per a representar/Mapejar el Tipus de dades SQL REF
Struct
Interface
Per a representar/Mapejar el Tipus de dades SQL STRUCT
Time
Clase
Per a representar/Mapejar el Tipus de dades SQL TIME
Timestamp
Clase
Per a representar/Mapejar el Tipus de dades SQL TIMESTAMP
Types
Clase
Constants per als Tipus de dades SQL.
Informació Metadata
Objecte
DatabaseMetadata
ResultSetMetaData
Tipus
interface
interface
ParameterMetaData
interface
Descripció
Informació respecte a una Base de Dades.
Objecte que s’usa per aconseguir informació respecte als tipus i
propietats de les columnes d’un ResultSet.
Objecte que s’usa per aconseguir informació sobre els tipus i
característiques dels paràmetres d’un objecte PreparedStatement.
Pág. 34 de 94
Control Exceptions
Objecte
BatchUpateException
DataTruncation
SQLException
SQLWarning
Tipus
clase
clase
clase
clase
Descripció
Excepció que indica errors durant una operació d’actualització en batch.
Excepció quan es trunca (DataTruncation) per acomodar una dada. En
lectures es dona avís (warning) i en escripures es llença excepció.
Excepció que dona informació sobre varis errors d’access a la BD.
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.
Interfaces
Objecte
Descripció
ConnectionEventListener
Listener events relatius a un PoolConnection.
ConnectionPoolDataSource Representa una font de dades gestionant els pools de conexions
DataSource
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.
RowSetInternal
RowSetListener
Representa Oient RowSet
RowSetMetaData
Representa els Metadatos d’un RowSet
RowSetReader
RowSetWriter
XAConnection
Per a transaccions distribuides.
XADataSource
Clases
Objecte
Descripció
ConnectionEvent Representa un event de ConnectionEventListener.
RosSetEvent
Representa un event generat per RowSet.
java.sql i javax.sql
L’ú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:
Pág. 35 de 94



Statement (Sentència) creada amb createStatement,
Permetrà executar sentències SQL sense paràmetres.
PreparedStatement (sentències preparades o precompilades) creades amb
preparedStatement
Permetrà 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 1
Us 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);
ResultSet srs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");
Exemple 2
Veiem 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 3
Pág. 36 de 94
Donada 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);
Font: JDBC 3.0 Specification (Sun) October 2001
Pág. 37 de 94
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. 38 de 94
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úsculesmajú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
Pág. 39 de 94


Interface ResulsetMetaData
Informació sobre columnes d’un ResultSet.
Interface ParameterMetaData
Informació 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 conn
DatabaseMetaData 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)
Pág. 40 de 94





boolean supportsTableCorrelationNames
boolean supportsPositionedDelete
boolean supportsFullOuterJoins --- Indica si se soporta Ourter Joins complerts
boolean supportsStoredProcedures --- Indica si se soporta Procediments emmagatrzemats
boolean supportsMixedCaseQuotedIdentifiers


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
Pág. 41 de 94
java.sql.DatabaseMetaData. Es pot trovar a
http://java.sun.com/j2se/1.5.0/docs/api/java/sql/DatabaseMetaData.html.
>>> Catalegs, Esquemes
Disposem dels mètodes getShemas y getCatalogs.
Mètode getShemas
-> public ResultSet getSchemas() throws SQLException
Retorna els esquemes disponibles a la Base de Dades.
La informació en columnes que ens dona es:
1.
2.
TABLE_SCHEM String => Nom esquema
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 Taules
Disposem 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 Dades
Disposem 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úsculesmajúscules com Oracle).
Cada descripció de la taula té les columnes:
1.
2.
3.
4.
5.
6.
TABLE_CAT String => Nom catàleg Taula catalog (pot ser nul)
TABLE_SCHEM String => Nom esquema Taula (pot ser nul)
TABLE_NAME String => Nom Taula
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".
REMARKS String => Comentaris que deixa el gestor sobre la Taula.
TYPE_CAT String => El tipus de catàleg (pot ser nul)
Pág. 42 de 94
7.
8.
9.
TYPE_SCHEM String => El tipus d’esquemaa (pot ser nul)
TYPE_NAME String => El tipus de nom (pot ser nul)
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
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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
TABLE_CAT String => Nom catàleg taula (pot ser nul)
TABLE_SCHEM String => Nom esquema taula (pot ser null)
TABLE_NAME String => nom taula
COLUMN_NAME String => nom columna
DATA_TYPE int => Tipus SQL descrita a java.sql.Types
TYPE_NAME String => Font de Dades depenent del tipus de nom, per a UDT el tipus de nom es complert
qualificat.
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ó.
BUFFER_LENGTH – No usat.
DECIMAL_DIGITS int => El numero de dígits fraccionats (decimals).
NUM_PREC_RADIX int => Base (típicamet sol ser 10 or 2)
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
REMARKS String => Comentari que descriu la columna (pot ser nul)
COLUMN_DEF String => Valor per defecte (pot ser nul)
SQL_DATA_TYPE int => No usat
SQL_DATETIME_SUB int => No usat
CHAR_OCTET_LENGTH int => per cada tipus de caràcter el máxim número de bytes en el camp.
ORDINAL_POSITION int => index del camp a la taula (es comença per 1)
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.
SCOPE_CATLOG String => catàleg de la taula que està com a atribut referencia (null si DATA_TYPE no
és REF)
SCOPE_SCHEMA String => schema de la taula que està a un atribut de refeencia (null si DATA_TYPE no
és REF)
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)
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)
Pág. 43 de 94
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 Dades
Disposem 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:
1.
2.
3.
4.
5.
6.
7.
8.
TABLE_CAT String => Nom catàleg taula (pot ser nul)
TABLE_SCHEM String => Nom esquema Taula (pot ser nul)
TABLE_NAME String => Nom Taula
COLUMN_NAME String => Nom Columna
GRANTOR String => grantor d’acéss (pot ser nulll): ID d’autorització de l’usuari que ha otorgat el privilegi.
GRANTEE String => grantee d’accés: ID d’autorització de l’usuari a qui se li ha otorgat el privilegi.
PRIVILEGE String => name of access (SELECT, INSERT, UPDATE, REFRENCES, ...)
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.
2.
3.
4.
5.
6.
7.
TABLE_CAT String => Nom catàleg taula (pot ser nul)
TABLE_SCHEM String => Nom esquema Taula (pot ser nul)
TABLE_NAME String => Nom Taula
GRANTOR String => grantor d’acéss (pot ser nulll): ID d’autorització de l’usuari que ha otorgat el privilegi.
GRANTEE String => grantee d’accés: ID d’autorització de l’usuari a qui se li ha otorgat el privilegi.
PRIVILEGE String => name of access (SELECT, INSERT, UPDATE, REFRENCES, ...)
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 Taula
Disposem 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
Pág. 44 de 94
Retorna una descripció dels camps que forma la clau primaria d’una Taula.
Cada columna de la clau primaria disposa de la informació:
1.
2.
3.
4.
5.
6.
TABLE_CAT String => Nom catàleg taula (pot ser nul)
TABLE_SCHEM String => Nom esquema taula (pot ser nul)
TABLE_NAME String => Nom Taula
COLUMN_NAME String => Nom Columna
KEY_SEQ short => Número seqüència dins la clau primaria.
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).
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.
2.
3.
4.
5.
PKTABLE_CAT String => Nom catàleg clau primaria taula (pot ser nul)
PKTABLE_SCHEM String => Nom esquema clau primaria taula (pot ser nul)
PKTABLE_NAME String => Nom clau primaria taula
PKCOLUMN_NAME String => Nom columna clau primaria
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
Pág. 45 de 94
c.
d.
11.
12.
13.
14.
importedKeySetNull – Canviar la clau importada a NULL si la clau primaria ha estat canviat.
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)
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.
FK_NAME String => Nom clau forànea (pot ser nul)
PK_NAME String => Nom clau primària (pot ser nul)
DEFERRABILITY short => can pot l’evaluació de condicions (constraint) de clau forànea ser aplaçat fins
commit
a. 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
 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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
PKTABLE_CAT String => Nom catàleg clau primaria que está essent importat (pot ser nul)
PKTABLE_SCHEM String => Nom esquema clau primaria que está essent importat (pot ser nul)
PKTABLE_NAME String => Nom taula clau primaria primaria que està essent importat.
PKCOLUMN_NAME String => Nom columna clau primaria que esta essent importat.
FKTABLE_CAT String => Nom catàleg clau forànea (pot ser nul)
FKTABLE_SCHEM String => Nom esquema clau forànea (pot ser nul)
FKTABLE_NAME String => Nom taula clau forànea
FKCOLUMN_NAME String => Nom columna clau forànea
KEY_SEQ short => Número seqüència dins la clau forànea
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)
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
FK_NAME String => Nom clau forànea (pot ser null)
PK_NAME String => Nom clau primària (pot ser null)
DEFERRABILITY short => pot l’evaluació de condicions (constraint) de clau forànea ser aplaçat fins
commit
a. importedKeyInitiallyDeferred - veure SQL92 per una definició
b. importedKeyInitiallyImmediate - veure SQL92 per una definició
Pág. 46 de 94
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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
PKTABLE_CAT String => Nom catàleg clau primaria (pot ser nul)
PKTABLE_SCHEM String => Nom esquema clau primaria (pot ser nul)
PKTABLE_NAME String => Nom taula clau primaria primariay que està essent importat.
PKCOLUMN_NAME String => Nom columna clau primaria que esta essent importat.
FKTABLE_CAT String => Nom catàleg clau forànea (pot ser nul)
FKTABLE_SCHEM String => Nom esquema clau forànea (pot ser nul)
FKTABLE_NAME String => Nom taula clau forànea
FKCOLUMN_NAME String => Nom columna clau forànea
KEY_SEQ short => Número seqüència dins la clau forànea
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)
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
FK_NAME String => Nom clau forànea (pot ser null)
PK_NAME String => Nom clau primària (pot ser null)
DEFERRABILITY short => pot l’evaluació de condicions (constraint) de clau forànea ser aplaçat fins
commit
a. 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 Taula
Un í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,
Pág. 47 de 94
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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TABLE_CAT String => Nom catàleg taula (pot ser nul)
TABLE_SCHEM String => Nom esquema taula (pot ser nul)
TABLE_NAME String => Nom taula
NON_UNIQUE boolean => True: Si pot ser que els valors índex no siguin únics (non-unique). False: quan
TYPE és tableIndexStatistic
INDEX_QUALIFIER String => Nom catàleg index (pot ser nul); null when TYPE is tableIndexStatistic
INDEX_NAME String => nom índex, nul quan TYPE és tableIndexStatistic
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
ORDINAL_POSITION short => column sequence number within index; zero when TYPE is
tableIndexStatistic
COLUMN_NAME String => column name; null when TYPE is tableIndexStatistic
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
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.
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.
FILTER_CONDITION String => Filter condition, if any. (may be null)
Els resultats són ordenats per NON_UNIQUE, TYPE, INDEX_NAME, and ORDINAL_POSITION.
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.
2.
3.
4.
5.
6.
7.
8.
PROCEDURE_CAT String => Nom catàleg procediment (pot ser nul)
PROCEDURE_SCHEM String => Nom esquema procediment (pot ser nul)
PROCEDURE_NAME String => Nom procediment
Reservat per ús futur
Reservat per ús futur
Reservat per ús futur
REMARKS String => Comentaris sobre el procediment
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.
Pág. 48 de 94
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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
PROCEDURE_CAT String => Nom catàleg procediment (pot ser nul)
PROCEDURE_SCHEM String => Nom esquema procediment (pot ser nul)
PROCEDURE_NAME String => Nom procediment
COLUMN_NAME String => nom columna/parámetre
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
DATA_TYPE int => SQL tipus desde java.sql.Types
TYPE_NAME String => SQL nom de tipus per a tipus UDT el tipus de nom es completament qualificat
PRECISION int => precisió
LENGTH int => longitud en bytes de les dades
SCALE short => scala
RADIX short => base
NULLABLE short => pot contindre NULL.
a. procedureNoNulls – no es permeten valors NULL
b. procedureNullable – es permet valors NULL
c. procedureNullableUnknown – es desconeix la nulabilitat
REMARKS String => Comentaris extres que descriuen el parametre/columna
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.
Pág. 49 de 94
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. 50 de 94
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. 51 de 94
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. 52 de 94
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).
Pág. 53 de 94
Font: http://www.ibm.com/developerworks/xml/library/x-bindcastor/
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. 54 de 94
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ó.
Veure drivers
Mantiendre Conexions
Veure Característiques BD
Veure Taules, Vistes, Indexs,
Stored Procedures
Usuari
Introduir Sentencies SQL
A continuació es descriu amb més detall els casos d’ús.
Pág. 55 de 94
CAS D’ÚS: Veure Drivers
Escenari 1 : Veure Drivers
Precondicions : 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 Drivers
Precondicions : 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 Conexions
Precondicions : 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 Conexions
Precondicions : 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 Dades
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 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 Dades
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 Table Types.
Pág. 56 de 94
CAS D’ÚS: Veure les Taules de la Bases de Dades
Escenari 1 : Veure Info Taules
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 Vistes
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 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. 57 de 94
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.
Pág. 59 de 94
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
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.xml
Contingut 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.
Pág. 60 de 94
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)
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.xml
Contingut 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</entr
y>
<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=admi
n</entry>
<entry key="sqlserver">description=SQL
Server|dbVendor=sqlserver|url=jdbc:sqlserver://localhost:1433;databaseName=master|user=s
a|password=sys46670458</entry>
<entry key="db2 JCC">description=Conexió
DB2|dbVendor=db2|url=jdbc:db2://localhost:50000/sample|user=db2admin|password=admin</ent
ry>
<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.
Pág. 61 de 94
5.4 Disseny de clases i paquets
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
Pág. 62 de 94
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).
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.xml
Aquí 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 JDBCDataBaseMetaData
Es 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 JDBCMainFrame
Aquesta 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.
Pág. 63 de 94
Clase JDBCDrivers
Aquesta clase es la responsable de presentar el dialeg dels Drivers o Conectors que s’usen per
conectarse al gestor Base de Dades.
Clase JDBCConexions
Aquesta 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).
Clase JDBCTreeNavigator
Aquesta 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 JDBCDatabaseConnection
Aquesta 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;
}
}
-------- --------
Pág. 64 de 94
}
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ó,
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));
Pág. 65 de 94
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
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
Pág. 66 de 94
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
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)
Pág. 67 de 94
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 JDBC
Es carrega el controlador usant el mètode forName de la clase Class del package
java.lang.
Forma: Class.forName(sDriver) on sDriver es el nom controlador. Excepcions:
ClassNotFoundException
Nota: La recent especificació JDBC 4 no caldrà (existirà un mecanisme automàtic).
2. Crear la conexió usant el controlador JDBC
S’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ó.
Pág. 68 de 94
Nom comuns dels controladors per a diferents SGBDR provats
dbVendor
Nom comú del Controlador
com.ibm.db2.jcc.DB2Driver.
DB2
com.mysql.jdbc.Driver
MySQL
SQL Server 2005 com.microsoft.sqlserver.jdbc.SQLServerDriver
Oracle
oracle.jdbc.driver.OracleDriver
MS Access
Sun.jdbc.odbc.JdbcOdbcDriver (Subministrat per Sun)
Nomenclatura URL segons diferents SGBDR provats
dbVendor
Exemples formats URL comuns
DB2
“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
Exemple: “jdbc:sqlserver://localhost:1433:databaseName=master”
2005
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;
}
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. 69 de 94
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 Conexions
S’ha provat les conexions a diferents gestors de Bases de Dades usant les cadenes driver i cadena de
conexió següents (son exemples):
DB2
sDriver = "com.ibm.db2.jcc.DB2Driver";
sURLConn = "jdbc:db2://localhost:50000/sample";
MySQL
sDriver = "com.mysql.jdbc.Driver";
sURLConn = "jdbc:mysql://localhost:3306/World";
SQL Server 2005
sDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
sURLConn = "jdbc:sqlserver://localhost:1433;databaseName=master";
Oracle
sDriver = "oracle.jdbc.driver.OracleDriver";
sURLConn = "jdbc:oracle:thin:@localhost:1521:xe";
MS Access
sDriver = "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.
Pág. 71 de 94
Font: Apress – JDBC Metadata, MySQL and Oracle Recipies. A Problem Solution [2006]
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;dat
abaseName=master;</URLInUse>
<userNameDB>sa</userNameDB>
</SessionInformation>
Pág. 72 de 94
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!
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>
Pág. 73 de 94
<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>
<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>
Pág. 74 de 94
<ShemaTerm>schema</ShemaTerm>
<CatalogTerm>null</CatalogTerm>
<ProcedureTerm>stored procedure</ProcedureTerm>
<SQLKeyords>AFTER,ALIAS,ALLOW,APPLICATION,ASSOCIATE,ASUTIME,AUDIT,AUX,AUXILIA
RY,BEFORE,BINARY,BUFFERPOOL,CACHE,CALL,CALLED,CAPTURE,CARDINALITY,CCSID,CLUSTE
R,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,DISALLO
W,DO,DSNHATTR,DSSIZE,DYNAMIC,EACH,EDITPROC,ELSEIF,ENCODING,ENDEXEC1,ERASE,EXCLUDING,EXIT,FENCED,FIELDPROC,FILE,FINAL,FREE,FUNCTION,GENERAL,GE
NERATED,GRAPHIC,HANDLER,HOLD,HOURS,IF,INCLUDING,INCREMENT,INDEX,INHERIT,INOU
T,INTEGRITY,ISOBID,ITERATE,JAR,JAVA,LABEL,LC_CTYPE,LEAVE,LINKTYPE,LOCALE,LOCATOR
,LOCATORS,LOCK,LOCKMAX,LOCKSIZE,LONG,LOOP,MAXVALUE,MICROSECOND,MICROSECOND
S,MINUTES,MINVALUE,MODE,MODIFIES,MONTHS,NEW,NEW_TABLE,NOCACHE,NOCYCLE,NODE
NAME,NODENUMBER,NOMAXVALUE,NOMINVALUE,NOORDER,NULLS,NUMPARTS,OBID,OLD,OL
D_TABLE,OPTIMIZATION,OPTIMIZE,OUT,OVERRIDING,PACKAGE,PARAMETER,PART,PARTITIO
N,PATH,PIECESIZE,PLAN,PRIQTY,PROGRAM,PSID,QUERYNO,READS,RECOVERY,REFERENCING,
RELEASE,RENAME,REPEAT,RESET,RESIGNAL,RESTART,RESULT,RESULT_SET_LOCATOR,RETUR
N,RETURNS,ROUTINE,ROW,RRN,RUN,SAVEPOINT,SCRATCHPAD,SECONDS,SECQTY,SECURITY,
SENSITIVE,SIGNAL,SIMPLE,SOURCE,SPECIFIC,SQLID,STANDARD,START,STATIC,STAY,STOGR
OUP,STORES,STYLE,SUBPAGES,SYNONYM,SYSFUN,SYSIBM,SYSPROC,SYSTEM,TABLESPACE,TR
IGGER,TYPE,UNDO,UNTIL,VALIDPROC,VARIABLE,VARIANT,VCAT,VOLUMES,WHILE,WLM,YEAR
S</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</NumericFunctio
ns>
<StringFunctions>ASCII,CHAR,CONCAT,DIFFERENCE,INSERT,LCASE,LEFT,LENGTH,LOCATE,LTR
IM,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,IDENTITYC
OL,IF,KILL,LINENO,LOAD,NOCHECK,NONCLUSTERED,OFF,OFFSETS,OPENDATASOURCE,OPENQ
UERY,OPENROWSET,OPENXML,OVER,PERCENT,PLAN,PRINT,PROC,RAISERROR,READTEXT,REC
ONFIGURE,REPLICATION,RESTORE,RETURN,ROWCOUNT,ROWGUIDCOL,RULE,SAVE,SETUSER,S
HUTDOWN,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,SOU
NDEX,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>
Pág. 75 de 94
<MaxColumnsInSelect>4096</MaxColumnsInSelect>
<MaxColumnsInGroupBy>0</MaxColumnsInGroupBy>
</FeaturesInformation>
----RESULTAT INCONGRUENT
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,P
I,POWER,ROUND,SIGN,SIN,SQRT,TAN,TRUNCATE</NumericFunctions>
<StringFunctions>ASCII,CHAR,CONCAT,LCASE,LENGTH,LTRIM,REPLACE,RTRIM,SOUNDEX,SUB
STRING,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>
<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
Pág. 76 de 94
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 Reflection
public static String getJdbcTypeName(int jdbcType) {
if (map == null) {
map = new HashMap();
// Aconseguim el camp a java.sql.Types
Field[] fields = java.sql.Types.class.getFields();
for (int i=0; i<fields.length; i++) {
try {
// Nom I valor del camp
String name = fields[i].getName();
Integer value = (Integer)fields[i].get(null);
// Afeim al map
map.put(value, name);
} catch (IllegalAccessException e) {
}
}
}
// Retornem el nom del JDBC type
return (String)map.get(new Integer(jdbcType));
}
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" />
Pág. 77 de 94
<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" />
<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>
Pág. 78 de 94
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
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
Pág. 79 de 94
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>
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>
Pág. 80 de 94
<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>
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. 81 de 94
Pág. 82 de 94
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:
Pág. 83 de 94



Costos Hardware
Costos derivats de la plataforma de desenvolupament del sistema.
Costos Software
Costos derivats
Costos Recursos Humans
Costos 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
Sistema Operatiu
IDE
Java
Bases de Dades
Conectors
Processador de
Textes
Fulla de càcul
Producte
Windows XP Home Edition
Eclipse SDK v3.3
JDK 6 Update 2
MySQL v5.0.41
Oracle Database 10g Release 2
Microsoft SQL Server 2005
DB2 Express-C v9.1.2
Microsoft Access 2003 (Neptuno.mdb)
Propis de cada gestor Base de Dades
Microsoft Word 2003
Preu
80 €
Gratuït
Gratuït
Gratuït
Gratuït
Gratuït
Gratuït
50 € *
Gratuït
50 € *
Notes
OEM inclós en portàtil
Inclou JDBC
Express Edition
Express Edition
Express Edition
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
Analista
Programador
Cap de Projecte
1
1
1
Preu/Hora
(Brut)
35,00 €/h
25,00 €/h
50,00 €/h
Pág. 84 de 94
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
Analista
Programador
Hores
Treballades
90 h.
90 h.
Total: 1
Cost
3.150,00 €/h
2.250,00 €
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
Analista
Programador
Hores
Treballades
90 h.
90 h.
Total: 1
Cost
3.150,00 €/h
2.250,00 €
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. 85 de 94
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 objectius
El 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 millores
Una 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ó).
Pág. 87 de 94
I una important avui dia és que es fes una versió via web. Aixó portaria una avantatge que no
caldria efectuar instalacions locals.
6.3 Objectius personals
L’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. 88 de 94
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. 89 de 94
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 Institute
URL
Uniform Resource Locator
Localitzador Uniforme de Recursos
Tecnologia Bases de Dades
Abrev.
Nom
JDBC
ODBC
Java Database Connectivity
Open DataBase Connectivity
RDBMS
SQL
Relational Data Base Management System
Structured Query Languaje
Traducció
Sistema Gestor de Bases de Dades Relacional
Llenguatge de Consulta Estructurat
Tecnologia Web, Llenguatges de marques
Abrev.
Nom
WWW
World Wide Web
eXtensible Markup Language
XML
SGML
HTML
xHTML
Standard Generalized Markup Language
HyperText Markup Language
eXtensible Hypertext Markup Language
Traducció
Llenguatge de marques extès
Llenguatge de marcatge generalitzat
Llenguatge de marques hipertextuals
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 Conectivity
Es una API que permet realitzar opeacions sobre Bases de Dades des del llenguatje de
programació Java usant SQL.
Pág. 91 de 94
Database - 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).
Í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.
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).
ODBC – Open DataBase Connectity
Es 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 Language
Es 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/fichero
Exemple: http://es.Wikipedia.org/
Pág. 92 de 94
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’Eines
Ens serveix per anar directament a operatives tal com veure drivers, gestionar conexions
(testejarles i conectar) i desconectar conexió Base de Dades actual.
Pág. 93 de 94



Part Arbre d’objectes
Ens 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.
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 SQL
Es lloc per introduir qualsevol sentència SQL vàlida. Podem introduir SELECT, UPDATE,
DELETE, CREATE...
Part Resultats
Mostra 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. 94 de 94
Download