JDBC DatabaseMetaData (Memòria) - Portal UPCommons: Pàgina ...
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 837 views

 

Statistics

Views

Total Views
837
Views on SlideShare
837
Embed Views
0

Actions

Likes
0
Downloads
9
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft Word

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • 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 83
  • Pág. 2 de 83
  • 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. 3 de 83
  • Í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. 4 de 83
  • 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. 5 de 83
  • 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. 6 de 83
  • 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. 7 de 83
  • 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. 8 de 83
  •  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. 9 de 83
  • 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://www-306.ibm.com/software/data/db2/express/. Documentació útil de DB2 (manual online: Centre d’informació de la Base de Dades IBM DB2 per a Linux/Unix/Windows. Es pot trovar a: http://publib.boulder.ibm.com/infocenter/db2luw/v9//index.jsp .  Oracle Database 10g Release 2 Express Edition for Microsoft Windows IEs pot trovar a: http://www.oracle.com/technology/software/products/database/xe/htdocs/102xewinsoft.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=31711D5D-725C-4AFA-9D65-E4465CDFF1E7&displaylang=es. Interface en Espanyol. Publicació: 28-feb-2007. Versions lliures Pág. 10 de 83
  •  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- feb-2007) Es pot trovar a: http://www.microsoft.com/downloads/details.aspx? displaylang=es&FamilyID=6d483869-816a-44cb-9787-a866235efc7c Es de Tipus 4 que implementa JDBC 3.0. Tots son drivers de Tipus 4. Una forma que Java els reconeixi es posar l’arxiu .jar de cada driver a la carpeta C:Archivos de programaJavajre1.6.0_01libext . Hi ha entre d’altres (els noms en si no importen):  sqljdbc.jar per a Microsoft SQL Server 2005.  mysql-connector-java-5.0.6-bin.jar per a MySQL.  ojdbc14.jar per a Oracle 10g  db2jcc.jar per a IBM DB2. Eines adicionals lliures  Oracle SQL Developer v1.1 Patch 3 (v1.1.3.27.66) (Revisió: Maig 9, 2007) Es pot trovar a: http://www.oracle.com/technology/products/database/sql_developer/index.html Eina gràfica per a desenvolupament Bases de Dades. Es pot visualitzar els objectes de la Base de Dades, ejecutar sentències SQL, editar/debugar sentències PL/SQ. Instalació: Descomprimir en un directori destí i executar sqldeveloper.exe. Cal indicarli lloc on està instalat el JDK. Nota: Segons documentació requereix jdk 1.5 però s’ha executat sota jdk 1.6u1.  Microsoft SQL Server Management Studio Express SP2 Eina d’administració de la BD. Es pot trovar a: http://www.microsoft.com/downloads/details.aspx? familyid=6053C6F8-82C8-479C-B25B-9ACA13141C9E&displaylang=es. Interface en Espanyol. Publicació: 17-feb-2007.  MySQL GUI Tools Bundle for 5.0 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. 11 de 83
  • 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. 12 de 83
  • 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. 13 de 83
  • 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. 14 de 83
  • • 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. 15 de 83
  • (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. 16 de 83
  • 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. 17 de 83
  • 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 Objectes XML 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. 18 de 83
  • 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. 19 de 83
  • 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. 20 de 83
  • 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. 21 de 83
  • 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 Any Comentaris SQL-87 SQL-86 | SQL-1 1986 SQL-89 1989 SQL2 SQL-92 1992 SQL3 SQL-1999 1999 Al 1999, s’introdueix expressións regulars, consultes recursives, SQL:2003 2003 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. 22 de 83
  • 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. 23 de 83
  • 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. 24 de 83
  •  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. 25 de 83
  • • 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. 26 de 83
  • La API JDBC proporciona interfaces i clases per accedir i processar dades usualment d’una BD relacional. Paquets importants: Package Descripció java.sql Defineix la API JDBC javax.sql Es extensió extandard JDBC. Proporciona funcionalitat d’un fons de dades (objecte DataSource) i agrupació de conexions (connection pooling). Package java.sql Una descripció segons la funcioanlitat es: Per a fer conexions a Bases de Dades usant 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 Tipus Descripció DatabaseMetadata interface Informació respecte a una Base de Dades. ResultSetMetaData interface Objecte que s’usa per aconseguir informació respecte als tipus i propietats de les columnes d’un ResultSet. ParameterMetaData interface Objecte que s’usa per aconseguir informació sobre els tipus i característiques dels paràmetres d’un objecte PreparedStatement. Pág. 27 de 83
  • Control Exceptions Objecte Tipus Descripció BatchUpateException clase Excepció que indica errors durant una operació d’actualització en batch. DataTruncation clase Excepció quan es trunca (DataTruncation) per acomodar una dada. En lectures es dona avís (warning) i en escripures es llença excepció. SQLException clase Excepció que dona informació sobre varis errors d’access a la BD. SQLWarning clase Avisos sobre accesos a BD. Package javax.sql Es una extenció de JDBC. Ofereix funcionalitats noves resumides en les quatre categories següents:  Interface DataSourse: Per a treballar amb el servei de noms JNDI (Java Naming and Directory Interface) que permet establir conexions amb una font de dades.  Pooling de conexions: Mecanisme que permet reutilitzar les conexions en lloc de crear una nova conexió cada vegada que es necessiti. La gestió d’un pool es fa en general transparent a l’usuari.  Transaccions distribuides: Mecanisme que permet utilitzar en una mateixa transacció diferentes servidors de Bases de Dades.  Interface RowSet: Component de JavaBean. Es un conenidor per un conjunt de files. Al heredar de ResultSet te la funcionalitat d’aquesta. 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. 28 de 83
  •  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. 29 de 83
  • 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. 30 de 83
  • 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. 31 de 83
  • Vista segons JDBC de la estructura interna d’una BD (Font: http://jguru.com/faq/view.jsp?EID=1183) 3.2.5 Metadatos Per parlar de Metadatos, la API Java usa el terme MetaData ja que Java es sensible a minúscules- majúscules, però en aquí usem metadata (es escriure ja el programa o bé és explicar concepte). Les dades i els metadatos són punts molt importants en aplicacions empresarials. Usem Metadatos per donarnos “dades sobre dades”. En aquest sentit, es pot veure com els tipus de dades i descripció del que conté les dades. Així per exemple, donat un resultat d’una consulta d’una Base de Dades podrem saber analitzant el resultat (seus metadatos) quantes columnes té, tipus dades… del resultat (la informació està implícita en el resultat). I JDBC treballa amb les dades i els metadatos d’una Base de Dades. Cada Base de Dades té moltíssims metadatos i per complicar-ho més cada Base de Dades té els seus i precisament JDBC el que fa es mapejar-los amb l’us d’una API comuna. Ja s’encarreguen els drivers de complir aquesta API comuna ja que han d’implementar-la si volen ser compatibles amb la norma que imposa l’especificacio JDBC Java. La programació JDBC i la programació JDBC Metadata es diferencien en què la primera estem solament interessats en resultats de consultes però en canvi en Metadata voldriem la descripció de tals consultes (data sobre data). En general amb JDBC metadata podrem trobar resposta per exemple als metadatos d’una conexió a una Base de Dades i en concret a per exemple:  Quina llista de taules o vistes están disponibles?  Quins són els noms i els tipus de columnes en cada taula o vista?  Quins són els camps clau d’una Taula?  Quins són els camps clau forànis que usa una Taula (si els té) (integritat referencial) ?  Quina es la signatura d’un stored procedure? Quins camps d’entrada i sortida té? 3.2.6 Interfaces sobre metadatos sobre Bases de Dades Ara veurem algunes interfaces sobre metadatos sobre la Bases de Dades que estem conectats. Disposem de tres interfaces importants molt útils:  Interface DatabaseMetaData Informació sobre la Base de Dades que ens hem conectat Pág. 32 de 83
  •  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. 33 de 83
  •  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. 34 de 83
  • 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. TABLE_SCHEM String => Nom esquema 2. 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úscules- majúscules com Oracle). Cada descripció de la taula té les columnes: 1. TABLE_CAT String => Nom catàleg Taula catalog (pot ser nul) 2. TABLE_SCHEM String => Nom esquema Taula (pot ser nul) 3. TABLE_NAME String => Nom Taula 4. TABLE_TYPE String => Tipus Taula. Valors típics de te tipus de taula són: "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM". 5. REMARKS String => Comentaris que deixa el gestor sobre la Taula. 6. TYPE_CAT String => El tipus de catàleg (pot ser nul) Pág. 35 de 83
  • 7. TYPE_SCHEM String => El tipus d’esquemaa (pot ser nul) 8. TYPE_NAME String => El tipus de nom (pot ser nul) 9. SELF_REFERENCING_COL_NAME String => El nom que es designa a la columna "identifier" d’un tipus de taula (pot ser nul). 10. REF_GENERATION String => especifica quins valors a SELF_REFERENCING_COL_NAME són creats. Valors són: "SYSTEM", "USER", "DERIVED". (pot ser nul) Els resultats són ordenats per TABLE_TYPE, TABLE_SCHEM i TABLE_NAME. Nota: Algunes dbVendors no retornen la informació de totes les taules. Aconseguir els camps d’una Taula de la Bases de Dades Disposem del mètode getColumns el qual ens dona les columnes de la Taula o Taules especificades. Mètode getColumns -> public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException Retorna la descripció de les columnes disponibles d’una taula en el catàleg especificat i d’acord amb els patrons esquema, nom taula i nom columna. Per exemple: Es vol totes les taules que comencin per ‘T%’ i que les columnes comencin per ‘ID%’ Cada descripció de la columna té els camps: 1. TABLE_CAT String => Nom catàleg taula (pot ser nul) 2. TABLE_SCHEM String => Nom esquema taula (pot ser null) 3. TABLE_NAME String => nom taula 4. COLUMN_NAME String => nom columna 5. DATA_TYPE int => Tipus SQL descrita a java.sql.Types 6. TYPE_NAME String => Font de Dades depenent del tipus de nom, per a UDT el tipus de nom es complert qualificat. 7. COLUMN_SIZE int => Tamany de la columna. Per caracters o tipus tipus de dada és el màxim númer ode caràcters, per númerics o tipus decimals, representa la precisió. 8. BUFFER_LENGTH – No usat. 9. DECIMAL_DIGITS int => El numero de dígits fraccionats (decimals). 10. NUM_PREC_RADIX int => Base (típicamet sol ser 10 or 2) 11. NULLABLE int => si els NULL són permesos. Valors possibles: - columnNoNulls – no pot tenir valors NULL - columnNullable – permet valors NULL - columnNullableUnknown – Es desconeix si permet o no valors NULL 12. REMARKS String => Comentari que descriu la columna (pot ser nul) 13. COLUMN_DEF String => Valor per defecte (pot ser nul) 14. SQL_DATA_TYPE int => No usat 15. SQL_DATETIME_SUB int => No usat 16. CHAR_OCTET_LENGTH int => per cada tipus de caràcter el máxim número de bytes en el camp. 17. ORDINAL_POSITION int => index del camp a la taula (es comença per 1) 18. IS_NULLABLE String => "NO" significa que el camp no permet valors NULL, "YES" permet el camp valors NULL. Un valor buit significa que es desconeix. Nota: Igual a columna 11. 19. SCOPE_CATLOG String => catàleg de la taula que està com a atribut referencia (null si DATA_TYPE no és REF) 20. SCOPE_SCHEMA String => schema de la taula que està a un atribut de refeencia (null si DATA_TYPE no és REF) 21. SCOPE_TABLE String => nom taula que està a un atribut de referència o tipus REF generat per l’usuariull si DATA_TYPE no és REF) 22. SOURCE_DATA_TYPE short => el tipus de font d’un tipus distinct o tipus REF generat per l’usuari , Tipus SQL a java.sql.Types (null si DATA_TYPE no és DISTINCT o REF generat per l’usuari) Pág. 36 de 83
  • 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. TABLE_CAT String => Nom catàleg taula (pot ser nul) 2. TABLE_SCHEM String => Nom esquema Taula (pot ser nul) 3. TABLE_NAME String => Nom Taula 4. COLUMN_NAME String => Nom Columna 5. GRANTOR String => grantor d’acéss (pot ser nulll): ID d’autorització de l’usuari que ha otorgat el privilegi. 6. GRANTEE String => grantee d’accés: ID d’autorització de l’usuari a qui se li ha otorgat el privilegi. 7. PRIVILEGE String => name of access (SELECT, INSERT, UPDATE, REFRENCES, ...) 8. IS_GRANTABLE String => "YES" si es permet a GRANTEE otorgar aquest privilegi a altres usuaris;; "NO" si no; null si es desconeix. Els resultats estan ordenats per COLUMN_NAME i PRIVILEGE. Mètode getTablePrivileges -> public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) throws SQLException Retorna la descripció de l’accès o permisos de cada Taula disponible en el Catàleg. Cada privilegi d’una taula s’aplica a un o més camps de la taula però en cap cas es erroni assumir que s’apliquen a tots els camps (pot ser veritat solament en algunes Bases de Dades). Cada descripció de privilegi té la informació següent: 1. TABLE_CAT String => Nom catàleg taula (pot ser nul) 2. TABLE_SCHEM String => Nom esquema Taula (pot ser nul) 3. TABLE_NAME String => Nom Taula 4. GRANTOR String => grantor d’acéss (pot ser nulll): ID d’autorització de l’usuari que ha otorgat el privilegi. 5. GRANTEE String => grantee d’accés: ID d’autorització de l’usuari a qui se li ha otorgat el privilegi. 6. PRIVILEGE String => name of access (SELECT, INSERT, UPDATE, REFRENCES, ...) 7. IS_GRANTABLE String => "YES" si es permet a GRANTEE otorgar aquest privilegi a altres usuaris;; "NO" si no; null si es desconeix. Els resultats estan ordenats per TABLE_SCHEM, TABLE_NAME i PRIVILEGE.. Aconseguir les claus primaries d’una 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. 37 de 83
  • Retorna una descripció dels camps que forma la clau primaria d’una Taula. Cada columna de la clau primaria disposa de la informació: 1. TABLE_CAT String => Nom catàleg taula (pot ser nul) 2. TABLE_SCHEM String => Nom esquema taula (pot ser nul) 3. TABLE_NAME String => Nom Taula 4. COLUMN_NAME String => Nom Columna 5. KEY_SEQ short => Número seqüència dins la clau primaria. 6. PK_NAME String => Nom de la clau primaria (pot ser nul) Els resultats están ordenats per COLUMN_NAME. Aconseguir informació Integritat Referencial (claus forànees) Una clau forànea (FK) és un camp o més camps d’una Taula que són usats com a clau primària d’una altre Taula. Disposem dels mètodes getImportedKeys (claus importades), getExportedKey (claus exportades) i getCrossReference (claus creuades). Font: http://help.sap.com/saphelp_nw2004s/helpdata/en/cf/21ea77446011d189700000e8322d00/content.htm Mètode getExportedKeys -> public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException Donada una Taula, retorna una descripció dels camps de clau forànea que formen la clau primaria de la Taula (les claus forànees exportades per una Taula). Cada camp de clau forànea té la següent informació: 1. PKTABLE_CAT String => Nom catàleg clau primaria taula (pot ser nul) 2. PKTABLE_SCHEM String => Nom esquema clau primaria taula (pot ser nul) 3. PKTABLE_NAME String => Nom clau primaria taula 4. PKCOLUMN_NAME String => Nom columna clau primaria 5. 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. 38 de 83
  • c. importedKeySetNull – Canviar la clau importada a NULL si la clau primaria ha estat canviat. d. importedKeySetDefault – Canviar la clau importada a valors per defecte si la clau primària ha estat canviada. e. importedKeyRestrict – el mateix que importedKeyNoAction (per compatibilitat ODBC 2.x) 11. DELETE_RULE short => Que passa en la clau forànea quan la clau primaria es borrada. a. importedKeyNoAction – No permetre supressió sobre clau primaria si ha estat importada b. importedKeyCascade – suprimir files que importen una clau suprimida c. importedKeySetNull – canviar clau importada a NULL si la clau primària ha estat suprimida. d. importedKeyRestrict – el mateix que importedKeyNoAction (per a compatibilitat ODBC 2.x) e. importedKeySetDefault – canviar clau importat a valor per defecte si la clau primaria ha estat suprimida. 12. FK_NAME String => Nom clau forànea (pot ser nul) 13. PK_NAME String => Nom clau primària (pot ser nul) 14. DEFERRABILITY short => can pot l’evaluació de condicions (constraint) de clau forànea ser aplaçat fins 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. PKTABLE_CAT String => Nom catàleg clau primaria que está essent importat (pot ser nul) 2. PKTABLE_SCHEM String => Nom esquema clau primaria que está essent importat (pot ser nul) 3. PKTABLE_NAME String => Nom taula clau primaria primaria que està essent importat. 4. PKCOLUMN_NAME String => Nom columna clau primaria que esta essent importat. 5. FKTABLE_CAT String => Nom catàleg clau forànea (pot ser nul) 6. FKTABLE_SCHEM String => Nom esquema clau forànea (pot ser nul) 7. FKTABLE_NAME String => Nom taula clau forànea 8. FKCOLUMN_NAME String => Nom columna clau forànea 9. KEY_SEQ short => Número seqüència dins la clau forànea 10. UPDATE_RULE short => Que passa a una clau forànea quan la clau primaria canvia: a. importedNoAction – No permetre canviar la clau primaria si ha estat importada b. importedKeyCascade – Canviar clau importada quan la clau primaria canvia c. importedKeySetNull – Canviar clau importada a NULL si la clau primaria ha estat canviada d. importedKeySetDefault – canviar clau importada a valors per defecte si la clau primaria ha estat canviada e. importedKeyRestrict – el mateix que importedKeyNoAction (per a compatibilitat amb ODBC 2.x) 11. DELETE_RULE short => Que passa a una clau forànea quan la clau primaria es suprimida: a. importedKeyNoAction – No permetre suprimir la clau primaria si ha estat importada b. importedKeyCascade – suprimir les files que importen la clau suprimirda c. importedKeySetNull – canviar la clau importada a NULL si la clau primaria ha estat suprimida d. importedKeyRestrict – el mateix que importedKeyNoAction (per compatibilitat amb ODBC 2.x) e. importedKeySetDefault – canviar clau importada a valor per defecte si la clau primaria ha estat suprimida 12. FK_NAME String => Nom clau forànea (pot ser null) 13. PK_NAME String => Nom clau primària (pot ser null) 14. DEFERRABILITY short => pot l’evaluació de condicions (constraint) de clau forànea ser aplaçat fins commit a. importedKeyInitiallyDeferred - veure SQL92 per una definició b. importedKeyInitiallyImmediate - veure SQL92 per una definició Pág. 39 de 83
  • c. importedKeyNotDeferrable - veure SQL92 per una definició Els resultats estan ordenats per PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME, and KEY_SEQ. Mètode getCrossReference  ResultSet getCrossReference(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException Retorna una descripció dels camps de clau foranea d’una taula de clau forànea que referencia camps de clau primaria d’una taula de clau primaria (descriu com una taula importa altres claus). Generalment retorna simple clau fornaea/clau primaria ja que moltes taules importen una clau forànea solament des de una taula. Cada camp clau forànea té la descripció: 1. PKTABLE_CAT String => Nom catàleg clau primaria (pot ser nul) 2. PKTABLE_SCHEM String => Nom esquema clau primaria (pot ser nul) 3. PKTABLE_NAME String => Nom taula clau primaria primariay que està essent importat. 4. PKCOLUMN_NAME String => Nom columna clau primaria que esta essent importat. 5. FKTABLE_CAT String => Nom catàleg clau forànea (pot ser nul) 6. FKTABLE_SCHEM String => Nom esquema clau forànea (pot ser nul) 7. FKTABLE_NAME String => Nom taula clau forànea 8. FKCOLUMN_NAME String => Nom columna clau forànea 9. KEY_SEQ short => Número seqüència dins la clau forànea 10. UPDATE_RULE short => Que passa a una clau forànea quan la clau primaria canvia: a. importedNoAction – No permetre canviar la clau primaria si ha estat importada b. importedKeyCascade – Canviar clau importada quan la clau primaria canvia c. importedKeySetNull – Canviar clau importada a NULL si la clau primaria ha estat canviada d. importedKeySetDefault – canviar clau importada a valors per defecte si la clau primaria ha estat canviada e. importedKeyRestrict – el mateix que importedKeyNoAction (per a compatibilitat amb ODBC 2.x) 11. DELETE_RULE short => Que passa a una clau forànea quan la clau primaria es suprimida: a. importedKeyNoAction – No permetre suprimir la clau primaria si ha estat importada b. importedKeyCascade – suprimir les files que importen la clau suprimirda c. importedKeySetNull – canviar la clau importada a NULL si la clau primaria ha estat suprimida d. importedKeyRestrict – el mateix que importedKeyNoAction (per compatibilitat amb ODBC 2.x) e. importedKeySetDefault – canviar clau importada a valor per defecte si la clau primaria ha estat suprimida 12. FK_NAME String => Nom clau forànea (pot ser null) 13. PK_NAME String => Nom clau primària (pot ser null) 14. DEFERRABILITY short => pot l’evaluació de condicions (constraint) de clau forànea ser aplaçat fins 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, Pág. 40 de 83
  • boolean unique, boolean approximate) throws SQLException Retorna una descripció dels índexs I estadístiques d’una Taula donada. Cada descripció de camp índex té la següent informació: 1. TABLE_CAT String => Nom catàleg taula (pot ser nul) 2. TABLE_SCHEM String => Nom esquema taula (pot ser nul) 3. TABLE_NAME String => Nom taula 4. NON_UNIQUE boolean => True: Si pot ser que els valors índex no siguin únics (non-unique). False: quan TYPE és tableIndexStatistic 5. INDEX_QUALIFIER String => Nom catàleg index (pot ser nul); null when TYPE is tableIndexStatistic 6. INDEX_NAME String => nom índex, nul quan TYPE és tableIndexStatistic 7. TYPE short => index type: a. tableIndexStatistic - this identifies table statistics that are returned in conjuction with a table's index descriptions b. tableIndexClustered - this is a clustered index c. tableIndexHashed - this is a hashed index d. tableIndexOther - this is some other style of index 8. ORDINAL_POSITION short => column sequence number within index; zero when TYPE is tableIndexStatistic 9. COLUMN_NAME String => column name; null when TYPE is tableIndexStatistic 10. ASC_OR_DESC String => column sort sequence, "A" => ascending, "D" => descending, may be null if sort sequence is not supported; null when TYPE is tableIndexStatistic 11. CARDINALITY int => When TYPE is tableIndexStatistic, then this is the number of rows in the table; otherwise, it is the number of unique values in the index. 12. PAGES int => When TYPE is tableIndexStatisic then this is the number of pages used for the table, otherwise it is the number of pages used for the current index. 13. FILTER_CONDITION String => Filter condition, if any. (may be null) Els resultats són ordenats per NON_UNIQUE, TYPE, INDEX_NAME, and ORDINAL_POSITION. Aconseguir informació procediments emmagatzemats (stored procedures) Els stored procedures són procediments (i funcions) emmagatzemats a la Base de Dades. Disposem dels mètodes getProcedures y getProcedureColumns. Mètode getProcedures -> public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException Retorna la descripció dels procediments emmagatzemats disponibles en un catàleg. Solament la descripció d’un procediment es correspoen aamb l’esquema i Cada procediment té la seguent informació: 1. PROCEDURE_CAT String => Nom catàleg procediment (pot ser nul) 2. PROCEDURE_SCHEM String => Nom esquema procediment (pot ser nul) 3. PROCEDURE_NAME String => Nom procediment 4. Reservat per ús futur 5. Reservat per ús futur 6. Reservat per ús futur 7. REMARKS String => Comentaris sobre el procediment 8. PROCEDURE_TYPE short => Tipus de procediment: a. procedureResultUnknown – Pot retornar un resultat b. procedureNoResult – No retorna un resultat c. procedureReturnsResult – Retorna un resultat Els resultats són ordenats per PROCEDURE_SCHEM i PROCEDURE_NAME. Pág. 41 de 83
  • Mètode getProcedureColumns -> ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException Retorna una descripció dels stored procedures que hi ha en el catàleg passat amb els camps de resultat. Es pot especificar patró de búsqueda amb esquema, nom procediment i nom columnes (exemple: començin per ‘C%’). Cada fila del ResultSet és una descrició d’una parámete o camp del procediment amb la informació següent: 1. PROCEDURE_CAT String => Nom catàleg procediment (pot ser nul) 2. PROCEDURE_SCHEM String => Nom esquema procediment (pot ser nul) 3. PROCEDURE_NAME String => Nom procediment 4. COLUMN_NAME String => nom columna/parámetre 5. COLUMN_TYPE Short => Tipus de columna/parametre: a. procedureColumnUnknown – no es coneix b. procedureColumnIn - IN parametre entrada c. procedureColumnInOut - INOUT parametre entrada/sortida d. procedureColumnOut - OUT parametre sortida e. procedureColumnReturn – procediment retorna valor f. procedureColumnResult – columnes resultats en ResultSet 6. DATA_TYPE int => SQL tipus desde java.sql.Types 7. TYPE_NAME String => SQL nom de tipus per a tipus UDT el tipus de nom es completament qualificat 8. PRECISION int => precisió 9. LENGTH int => longitud en bytes de les dades 10. SCALE short => scala 11. RADIX short => base 12. NULLABLE short => pot contindre NULL. a. procedureNoNulls – no es permeten valors NULL b. procedureNullable – es permet valors NULL c. procedureNullableUnknown – es desconeix la nulabilitat 13. REMARKS String => Comentaris extres que descriuen el parametre/columna 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. 42 de 83
  • 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. 43 de 83
  • 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. 44 de 83
  • 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. 45 de 83
  • 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. 46 de 83
  • 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. 47 de 83
  • 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. 48 de 83
  • 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. 49 de 83
  • 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. 50 de 83
  • 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. 51 de 83
  • 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 programaMicrosoft Office 2003OFFICE11SAMPLESneptuno.mdb</entry> </properties> Si s’analitza amb cura es veu que les Key’s són els dbVendors (els sistemes gestors de Base de Dades) i com a valor tenen dos camps separats per la barra on a la part esquerra barra hi ha nom driver o cadena driver i a la part dreta de la barra hi figura el format de la cadena conexió (URL). 5.2.2 Arxiu de conexions JDBC Aquest es un arxiu de diferents conexions a Bases de Dades i es nutreix de l’arxiu de drivers. Les key’s o claus són nom de conexió (text lliure) donat i els valors es composa dels elements (separats per |) on cada element segueix patró tipus element = valor. Pág. 52 de 83
  •  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</entry> <entry key="oracle HR">description=Conexió Oracle HR|dbVendor=oracle| url=jdbc:oracle:thin:@localhost:1521:xe|user=HR|password=admin</entry> <entry key="oracle system">description=Conexió Oracle system|dbVendor=oracle| url=jdbc:oracle:thin:@localhost:1521:xe|user=system|password=admin</entry> <entry key="sqlserver">description=SQL Server|dbVendor=sqlserver| url=jdbc:sqlserver://localhost:1433;databaseName=master|user=sa| password=sys46670458</entry> <entry key="db2 JCC">description=Conexió DB2|dbVendor=db2| url=jdbc:db2://localhost:50000/sample|user=db2admin|password=admin</entry> <entry key="MSAccess JCC">description=Conexió ODBC|dbVendor=odbcmaccess| url=jdbc:odbc:C:Archivos de programaMicrosoft Office 2003OFFICE11SAMPLESneptuno.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. 53 de 83
  • 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 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). Pág. 54 de 83
  •  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. Clase JDBCDrivers Pág. 55 de 83
  • 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; } } -------- -------- } 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 Pág. 56 de 83
  • 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)); 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 Pág. 57 de 83
  • 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 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) Pág. 58 de 83
  • 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) 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 ---- Pág. 59 de 83
  • → 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ó. Nom comuns dels controladors per a diferents SGBDR provats dbVendor Nom comú del Controlador DB2 com.ibm.db2.jcc.DB2Driver. MySQL com.mysql.jdbc.Driver 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 2005 Exemple: “jdbc:sqlserver://localhost:1433:databaseName=master” Oracle “jdbc.oracle: Exemple: “jdbc:oracle:thin:@localhost:1521:xe” Oracle “jdbc.oracle: Pág. 60 de 83
  • 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. 61 de 83
  • 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. 62 de 83
  • 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. 63 de 83
  • 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. 64 de 83
  • <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. 65 de 83
  • <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,END- EXEC1,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> Pág. 66 de 83
  • <supportsOuterJoins>true</supportsOuterJoins> <MaxColumnsInSelect>4096</MaxColumnsInSelect> <MaxColumnsInGroupBy>0</MaxColumnsInGroupBy> ----RESULTAT INCONGRUENT </FeaturesInformation> Oracle <FeaturesInformation> <ShemaTerm>schema</ShemaTerm> <CatalogTerm /> ----IE7 falla per buits <ProcedureTerm>procedure</ProcedureTerm> <SQLKeyords>ACCESS, ADD, ALTER, AUDIT, CLUSTER, COLUMN, COMMENT, COMPRESS, CONNECT, DATE, DROP, EXCLUSIVE, FILE, IDENTIFIED, IMMEDIATE, INCREMENT, INDEX, INITIAL, INTERSECT, LEVEL, LOCK, LONG, MAXEXTENTS, MINUS, MODE, NOAUDIT, NOCOMPRESS, NOWAIT, NUMBER, OFFLINE, ONLINE, PCTFREE, PRIOR, all_PL_SQL_reserved_ words</SQLKeyords> <NumericFunctions>ABS,ACOS,ASIN,ATAN,ATAN2,CEILING,COS,EXP,FLOOR,LOG,LOG10,MOD,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()) { Pág. 67 de 83
  • // Obtenir: database-specific type name String typeName = rs.getString("TYPE_NAME"); // Obtenir mapeig: database-specific type -> java.sql.Types type short dataType = rs.getShort("DATA_TYPE"); String jdbcTypeName = getJdbcTypeName(dataType); sb.append("n<type vendorTypeName="" + typeName + "" " + "data_type="" + dataType + "" " + "jdbcTypeName="" + jdbcTypeName + "" />"); } sb.append("n</AvailableSQLTypes>"); return sb.toString(); } static Map map; // Convertim java.sql.Types a jdbc types // Retorna el nom del tipus JDBC Type (null si no es reconeix) // NOTA: S’usa tècnica 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" /> Pág. 68 de 83
  • <type vendorTypeName="nvarchar" data_type="12" jdbcTypeName="VARCHAR" /> <type vendorTypeName="sysname" data_type="12" jdbcTypeName="VARCHAR" /> <type vendorTypeName="nchar" data_type="1" jdbcTypeName="CHAR" /> <type vendorTypeName="bit" data_type="-7" jdbcTypeName="BIT" /> <type vendorTypeName="tinyint" data_type="-6" jdbcTypeName="TINYINT" /> <type vendorTypeName="tinyint identity" data_type="-6" jdbcTypeName="TINYINT" /> <type vendorTypeName="bigint" data_type="-5" jdbcTypeName="BIGINT" /> <type vendorTypeName="bigint identity" data_type="-5" jdbcTypeName="BIGINT" /> <type vendorTypeName="image" data_type="-4" jdbcTypeName="LONGVARBINARY" /> <type vendorTypeName="varbinary" data_type="-3" jdbcTypeName="VARBINARY" /> <type vendorTypeName="binary" data_type="-2" jdbcTypeName="BINARY" /> <type vendorTypeName="timestamp" data_type="-2" jdbcTypeName="BINARY" /> <type vendorTypeName="text" data_type="-1" jdbcTypeName="LONGVARCHAR" /> <type vendorTypeName="char" data_type="1" jdbcTypeName="CHAR" /> <type vendorTypeName="numeric" data_type="2" jdbcTypeName="NUMERIC" /> <type vendorTypeName="numeric() identity" data_type="2" jdbcTypeName="NUMERIC" /> <type vendorTypeName="decimal" data_type="3" jdbcTypeName="DECIMAL" /> <type vendorTypeName="money" data_type="3" jdbcTypeName="DECIMAL" /> <type vendorTypeName="smallmoney" data_type="3" jdbcTypeName="DECIMAL" /> <type vendorTypeName="decimal() identity" data_type="3" jdbcTypeName="DECIMAL" /> <type vendorTypeName="int" data_type="4" jdbcTypeName="INTEGER" /> <type vendorTypeName="int identity" data_type="4" jdbcTypeName="INTEGER" /> <type vendorTypeName="smallint" data_type="5" jdbcTypeName="SMALLINT" /> <type vendorTypeName="smallint identity" data_type="5" jdbcTypeName="SMALLINT" /> <type vendorTypeName="float" data_type="6" jdbcTypeName="FLOAT" /> <type vendorTypeName="real" data_type="7" jdbcTypeName="REAL" /> <type vendorTypeName="varchar" data_type="12" jdbcTypeName="VARCHAR" /> <type vendorTypeName="datetime" data_type="93" jdbcTypeName="TIMESTAMP" /> <type vendorTypeName="smalldatetime" data_type="93" jdbcTypeName="TIMESTAMP" /> </AvailableSQLTypes> Oracle <AvailableSQLTypes> <type vendorTypeName="INTERVALDS" data_type="-104" jdbcTypeName="null" /> <type vendorTypeName="INTERVALYM" data_type="-103" jdbcTypeName="null" /> <type vendorTypeName="TIMESTAMP WITH LOCAL TIME ZONE" data_type="-102" jdbcTypeName="null" /> <type vendorTypeName="TIMESTAMP WITH TIME ZONE" data_type="-101" jdbcTypeName="null" /> <type vendorTypeName="NUMBER" data_type="-7" jdbcTypeName="BIT" /> <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. 69 de 83
  • 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. 70 de 83
  • 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> Pág. 71 de 83
  • </column> <column name=”address”> <type>varchar</type> <size>100</size> <nullable>true</nullable> <position>4</position> </column> </columns> </Table> </Catalog> </AvailableUserViews> 6.2.2.9 Aconseguir les claus primaries d’una Taula Per aconseguir les claus primàries d’una Taula usarem getTablePrimaryKeysAsXML el qual usa getPrimaryKeys. MySQL Per exemple, la descripció que ens dona MySQL de TABLE1 del catàleg WORLD és: +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | varchar(10) | | PRI | | | | name | varchar(20) | | PRI | | | | age | int(11) | YES | | NULL | | | address | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ 4 rows in set (0.02 sec) i la sortida XML és: <AvailableTablePrimaryKeys> <Catalog Name=”WORLD”> <Table=”TABLE1”> <column name=”ID” keySeq=”1” /> <column name=”name” keySeq=”2” /> </Table> </Catalog> </ AvailableTablePrimaryKeys> 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. 72 de 83
  • Pág. 73 de 83
  • 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. 74 de 83
  •  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 Producte Preu Notes Sistema Operatiu Windows XP Home Edition 80 € OEM inclós en portàtil IDE Eclipse SDK v3.3 Gratuït Java JDK 6 Update 2 Gratuït Inclou JDBC Bases de Dades MySQL v5.0.41 Gratuït Oracle Database 10g Release 2 Gratuït Express Edition Microsoft SQL Server 2005 Gratuït Express Edition DB2 Express-C v9.1.2 Gratuït Express Edition Microsoft Access 2003 (Neptuno.mdb) 50 € * Conectors Propis de cada gestor Base de Dades Gratuït Processador de Microsoft Word 2003 50 € * Textes Fulla de càcul Microsoft Excel 2003 50 € * * Microsoft Office 2003 conté els productes Word i Access 2003 Son preus estimats Pràcticament tot el que s’ha usat es gratuït. Solament cal un cost petit pel Sistema Operatiu i Microsoft Office 2003. Una alternativa totalment gratüita es sota Linux. 7.2.3 Costos Recursos Humans El càlcul dels preus de cada Tipus de Professional involucrats en un projecte pot variar sustancialment d’una empresa a una altre. No hi ha un estàndard. Tot i això podem trobar un preu mínim / mitjà amb els següents valors: Preu/Hora Tipus de professional Unitats (Brut) Analista 1 35,00 €/h Programador 1 25,00 €/h Cap de Projecte 1 50,00 €/h Pág. 75 de 83
  • 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ó). Hores Professional Cost Treballades Analista 90 h. 3.150,00 €/h Programador 90 h. 2.250,00 € Total: 1 5.400,00 € Notar que l’Analista serà l’encarregat de l’anàlisi, disseny, especificació i documentació, mentres que el programador serà l’encarregat de la implementació i proves oportunes. 7.2.4 Cost Total La suma dels costos ens proporcionarà informació del cost total del projecte. Hores Professional Cost Treballades Analista 90 h. 3.150,00 €/h Programador 90 h. 2.250,00 € Total: 1 5.400,00 € Nota: Hi ha costos que entrarien en la categoria d’altres (conexió a internet i altres). No s’han considerat. Pág. 76 de 83
  • 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. 77 de 83
  • 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. 78 de 83
  • 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. 79 de 83
  • 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 Traducció 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 Tecnologia Web, Llenguatges de marques Abrev. Nom Traducció WWW World Wide Web XML eXtensible Markup Language Llenguatge de marques extès SGML Standard Generalized Markup Language Llenguatge de marcatge generalitzat HTML HyperText Markup Language Llenguatge de marques hipertextuals xHTML eXtensible Hypertext Markup Language Llenguatge extés de marcatge d’hipertexte 1.2 Definicions JavaSE - JDK (Java Development Kit) Entorn de Desenvolupament en Java que inclou el JRE (Java Runtime Environment)). Inclou utilitats command-line de desenvolupament. A juny’07, la versió actual es jdk 1.6u1. Ja s’està treballant per la versió 7. Es pot trovar a URL: http://java.sun.com/javase/ JDBC Java Database Conectivity Es una API que permet realitzar opeacions sobre Bases de Dades des del llenguatje de programació Java usant SQL. Pág. 80 de 83
  • 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. 81 de 83
  • 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. 82 de 83
  •  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. 83 de 83