Enrera
Mòdul 7
Iniciació a la programació en Java
  Pràctica
1
2
3
4
5
   
Exercicis
Exercicis
 
 
  JDBC. Accés a bases de dades

 

  Els motors de dades SQL
   

Una de les necessitats més evidents dels sistemes informàtics és l'enregistrament sistemàtic i estructurat d'informació. Bancs, instituts, hospitals, aeroports, empreses de qualsevol dedicació, tothom necessita consultar, modificar i enregistrar informació en ordres de magnitud que van d'uns centenars de registres a molts milions.

Al mercat existeixen bàsicament dues aproximacions tècniques a les bases de dades. Les bases de dades d'escriptori com el vell DBase o FoxPro, pensades per treballar principalment en entorns locals o en xarxes amb mínima concurrència, i els motors de dades client/servidor dissenyats específicament per al treball en xarxa (Oracle, mySQL, SQL server, Interbase, etc) i preparats per a suportar una gran càrrega de treball concurrent.

Més del 50% de les aplicacions informàtiques del món accedeixen a bases de dades client/servidor. Per això, qualsevol fabricant de llenguatges de programació sap que una part important de l'èxit del seu producte radica a fer fàcil la relació entre els programes i les dades.

Des d'aquest punt de vista, Microsoft fou una empresa capdavantera en aquest tipus de tecnologies i ja fa temps va crear les tecnologies ODBC, les quals fan possible que aplicacions de molt diferent naturalesa interactuïn amb dades provinents de qualsevol tipus de motor que disposi del seu driver ODBC.

   
  Els drivers JDBC
   
 

Java disposa del seu equivalent ODBC: els drivers JDBC (Java Data Base Connectivity). Aquests són programes intermediaris entre el motor de dades i l'aplicació Java. El programador de Java fa crides al servidor de dades a través d'un conjunt de classes que utilitzen l'estàndard SQL. El driver JDBC corresponent s'encarrega de connectar amb les llibreries del servidor de dades i traduir les demandes que ha fet el programador Java a un codi que el motor pugui entendre.

L'interès del procés està en l'estandardització: el programador pot fer programes pràcticament idèntics -o molt similars- per a motors de dades diferents, només ha de canviar la crida al driver corresponent. Aquest principi és més cert en la mesura que més s'aproxima el motor de dades a l'estàndard ANSI-SQL.

En aquesta pràctica aprendrem a fer connexions amb bases de dades per tal d'obtenir i actualitzar informacions que després es reflectiran en els nostres programes. Ho farem aprofitant l'únic driver JDBC que porta per defecte el SDK de Java de Sun Microsystems: el driver JDBC-ODBC, que permet, en entorns MS Windows, la connexió amb qualsevol font de dades ODBC. Treballarem sobre bases de dades Access per la seva enorme difusió. Tot allò que fem en Access pot adaptar-se però, a motors de dades més adequats a la pressió de concurrència que podem tenir si creem una aplicació client/servidor (com, per exemple, una web dinàmica al servidor del nostre centre): Oracle, DB2 o SQL-Server, per a citar alguns motors de pagament, o Interbase/Firebird i MySQL entre els gratuïts, però que poden fer la feina amb una qualitat comparable als de pagament.

Per consultar bases de dades s'han de tenir nocions mínimes del llenguatge SQL. Si teniu una mica d'experiència amb Access, serà més que suficient per a seguir les pràctiques. Si no és així, intenteu interpretar el significat de les crides que us posem com a exemple. Serà suficient per a entendre els processos. A la pràctica següent estudiarem una mica de llenguatge SQL.

Anem, en primer lloc, anem a preparar la nostra màquina per tal de connectar Access amb Java.

   
  Configurar la base de dades:
 

 

Com explicàvem unes línies més amunt, el SDK de Java porta, per defecte, el driver JDBC-ODBC. No cal instal·lar res per poder connectar amb fonts de dades ODBC. Sí que hem de crear, però, la font de dades ODBC que descrigui d'una manera adequada la nostra base de dades.

La base de dades que us proposem, l'heu de descarregar d'algun dels enllaços següents: baixeu-la, descomprimiu-la i deixeu-la, si és possible, en aquest directori c:/biblioteca. Disposeu de dues versions de la base de dades, una per a Access 97 i una altra per a Access 2000. Trieu la que s'adapti millor al vostre sistema. Després de la descompressió, l'arbre de carpetes ha de ser com aquest:

Les passes per a la creació de la font ODBC són els següents:

  • Obriu el Tauler de control de Windows i piqueu sobre "Font de Dades ODBC 32 bits". A Windows 2000 està a "Tauler de Control | Eines administratives | Orígens de dades ODBC". Dels tres DSN que hi ha presents (d'Usuari, del sistema i d'Arxiu), triarem l'opció "DSN de sistema":



  • Picarem sobre el botó "Afegir" i de la llista triem l'opció "Driver de Microsoft Access (*.mdb):



  • Piquem sobre "Finalitzar" i passem a descriure la nostre font de dades. Picant sobre "Seleccionar" i navegant pel nostre disc dur, localitzem la nostra base de dades c:/biblioteca/dades/llibres.mdb:



  • Acceptem la configuració del driver i tornem a acceptar a la fitxa de gestió de drivers i ja tenim la font de dades descrita. Ja es pot utilitzar en un programa Java.
Sun no aconsella la utilització del driver JDBC-ODBC per programes en producció. Es tracta, més aviat, d'una utilitat per a programació i aprenentatge de Java i bases de dades. Si necessiteu treballar amb Access via Java, seria millor utilitzar un driver específic JDBC. Aproximadament una dotzena de fabricants disposen d'aquest tipus de producte. Els podeu consultar a http://industry.java.sun.com/products/jdbc/drivers.
   
  Connectar amb la base de dades:
 

La utilització de les classes JDBC és idèntica a la resta de programació Java. Crearem instàncies de les classes que estan en els paquets java.sql i javax.sql i, si ens interessa, les manipularem amb els mecanismes convencionals d'herència.

Els mecanismes de connexió dels drivers JDBC són fàcils i, com gairebé tot en Java, independents de plataforma. Per tal d'aconseguir una connexió amb una base de dades, senzillament hem de crear un objecte connexió seguint aquesta fórmula:

String urlDades = "jdbc:odbc:biblioteca";
String usuari = "";
String clau = "";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection connexio = DriverManager.getConnection(urlDades,
                                                  usuari,
                                                  clau);
Statement pregunta = connexio.createStatement();
ResultSet resposta = pregunta.executeQuery("select * from usuaris");
  • Les cadenes urlDades, usuari i clau descriuen la Url de la base de dades, el nom d'usuari i la contrasenya d'accés a la base de dades. Si una base de dades no està protegida per contrassenya, les podem crear en blanc. La url de les dades correspon a la descripció de la font de dades JDBC-ODBC. Observeu que posem al final el nom "biblioteca", que és el que li hem assignat a la font de dades ODBC quan l'hem creada a la secció anterior.
  • Seguidament carreguem el controlador JDBC amb Class.forname("sun.jdbc.odbc.JdbcOdbcDriver"). Cada fabricant de bases de dades té el seu.
  • Després creem un objecte java.sql.Connection, que és el que conté la informació de la connexió amb la base de dades. Aquest objecte es crea des del gestor de drivers en passar-li la ubicació de la base de dades, el nom d'usuari i la contrassenya: Connection connexio = DriverManager.getConnection(urlDades,usuari,clau).
  • Quan ja tenim una connexió de dades, ja podem demanar-li la informació. Ho fem creant consultes o preguntes (Statement pregunta = connexio.createStatement()) i cedint el seu resultat als objectes resposta (ResultSet resposta = pregunta.executeQuery("select * from usuaris"). Aquesta darrera cadena conté el codi SQL mitjançant el qual li demanem al servidor Access això: "selecciona i retorna tots els camps i registres de la taula usuaris". Els objectes resposta ResultSet representen una matriu de dades ordenades en forma de registres i camps, als quals podem recórrer per extreure'n la informació.

Ara escriurem un programa que es connectarà amb la base de dades Acces llibres.mdb i ens llistarà les dades de la taula d'usuaris:

   
  Un programa de java amb accés a dades:
   
Escriviu, compileu i executeu el següent programa:
   
 
import java.sql.*;

public class Connectar {

    public static void main(String[] args) {
        String urlDades = "jdbc:odbc:biblioteca";
        String usuari = "";
        String clau = "";
        Connection connexio=null;
        Statement pregunta=null;
        ResultSet resposta=null;

            try {
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            }catch(ClassNotFoundException e) {
                System.out.println(e.getMessage());
            }
            try {
                connexio=DriverManager.getConnection(urlDades,
                                                     usuari,
                                                     clau);
                pregunta =connexio.createStatement();
                resposta =pregunta.executeQuery(
                                           "select * from usuaris");
                System.out.println("Usuaris de la biblioteca");
                System.out.println("------------------------");
                    while (resposta.next()) {
                        System.out.println(resposta.getString("id")+
                                           " "+
                                           resposta.getString("nom")+
                                           " "+
                                           resposta.getString(
                                                         "cognom1"));
                    }
                pregunta.close();
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            } finally {
                    try {
                        connexio.close();
                    } catch(SQLException e) {
                        System.out.println(e.getMessage());
                    }
            }
    }
}

   
  Estudiem una mica en detall el que hem fet:
  • Importem el paquet java.sql.*. És el paquet del SDK que conté les classes Connection, Statement i ResultSet per a la gestió de dades.

  • Introduïm la seqüència de connexió amb les dades, registrant el driver JDBC i obtenint la connexió.

  • Quan ja tenim la connexió, llencem la pregunta Statement i, llavors, el motor de dades ens retorna la resposta ResultSet.

  • L'objecte ResultSet conté una matriu de dades, amb un registre per a cada registre de la taula que Access ens ha retornat. Podem navegar a través d'un ResultSet amb els mètodes first(), last(), o next(). El que fem en aquest cas és fer una lectura seqüencial de ResultSet des del primer registre fins al darrer amb un cicle while (resposta.next()).

    Per a cada pas del
    cicle, fem una sortida a consola amb els camps id, nom i cognom1 de l'usuari de la biblioteca.

  • Finalment, tanquem Statement -que ens tanca automàticamentl ResultSet, i tanquem la connexió amb la base de dades: pregunta.close() i connexio.close().

  • Tot està estrictament protegit per possibles excepcions: ClassNotFoundException per si no està disponible el driver JDBC del motor de dades i SQLException per les excepcions que es produeixin en el nostre diàleg amb la base de dades.
   
 
Amunt