Java si baze de date

JDBC – o interfata standard la baze de date.

Pito Peter si Stelian Vultur

Cuvântul de ordine al zilelor noastre în informatica este, fara îndoiala, "Java". Despre baze de date s-a scris mult si se vor mai scrie înca multe. Atât Java, cât si bazele de date sunt domenii importante ale informaticii. În acest articol încercam sa aratam cum am putea sa combinam Java si bazele de date.

JDBC (Java DataBase Connectivity) este o interfata standard SQL de acces la baze de date. Acesta ne furnizeaza un acces uniform la baze de date relationale. JDBC este constituit dintr-un set de clase si interfete scrise în Java, furnizând un API standard pentru proiectantii de aplicatii baze de date. Acest lucru face posibila scrierea aplicatiilor de baze de date folosind un API Java pur.

Folosind JDBC este usor sa transmitem secvente SQL catre baze de date relationale. Cu alte cuvinte, nu este necesar sa scriem un program pentru a accesa o baza de date Oracle, alt program pentru a accesa o baza de date Sybase si asa mai departe. Este de ajuns sa scriem un singur program folosind API-ul JDBC si acesta va fi capabil sa trimita secvente SQL bazei de date dorite. Bineînteles, scriind codul sursa în Java, ne este asigurata portabilitatea programului. Deci, iata doua motive puternice care fac combinatia Java - JDBC demna de luat în seama. Scrii un program o data si acesta ruleaza peste tot.

Fiind robust, sigur, usor de folosit, usor de înteles, Java este un excelent limbaj pentru a dezvolta aplicatii de baze de date. Tot ceea ce-i lipseste este modalitatea prin care aplicatiile Java pot comunica cu bazele de date. Aici vine însa JDBC-ul care ofera acest mecanism.

Ce face JDBC-ul? În linii mari JDBC face trei lucruri:

Nivel jos si nivel înalt

JDBC-ul este o interfata "low-level", adica este folosit pentru a executa direct comenzi SQL. El lucreaza foarte bine în aceasta postura si este mai usor de folosit decât alte API-uri pentru conexiunea bazelor de date, dar totodata a fost proiectat astfel încât sa fie baza pe care sa poti construi interfete si unelte de nivel mai ridicat. Pâna la ora actuala exista doua tipuri mai importante de API-uri JDBC:

  1. Un preprocesor SQL încapsulat pentru Java. SGBD-urile relationale implementeaza SQL, un limbaj specific folosit cu bazele de date. JDBC necesita ca secventele SQL sa fie trimise metodelor Java sub forma de siruri de caractere. Un preprocesor SQL încapsulat permite folosirea secventelor mixte SQL direct din Java. De exemplu, o variabila Java poate fi folosita într-o secventa SQL pentru a primi sau furniza valori SQL. Preprocesorul Java încapsulat transforma apoi aceasta mixtura Java/SQL în apeluri JDBC.
  2. O mapare directa a tabelelor bazei de date relationale în clase Java. În aceasta mapare, fiecare articol al tabelei devine o instanta a unei clase si fiecare câmp corespunde unui atribut al instantei respective. În acest fel se poate opera direct cu obiecte Java.

JDBC si ODBC

În acest moment, ODBC-ul Microsoft-ului este probabil cea mai folosita interfata pentru a accesa baze de date relationale, oferind posibilitatea de a utiliza aproape orice fel de baza de date, de pe aproape orice platforma. Întrebarea care apare imediat: de ce nu utilizam pur si simplu ODBC din Javat Raspunsul este ca se poate folosi ODBC în Java, dar cel mai bine este sa utilizam JDBC sub forma combinatiei JDBC-ODBC, care va fi implementata în scurt timp. O alta întrebare apare: de ce avem nevoie de JDBC? Iata câteva raspunsuri:

  1. ODBC nu este potrivit pentru a fi utilizat direct din Java pentru ca foloseste o interfata C, iar apelurile din Java catre codul nativ C pot provoca unele probleme, ca de exemplu cele legate de portabilitate si securitate.
  2. O transpunere literala a codului sursa C al ODBC-ului în Java nu este de dorit pentru ca, de exemplu, Java nu are pointeri, în timp ce sursa ODBC-ului se foloseste foarte mult de ei, inclusiv de cunoscutul pointer "void *". Însa JDBC-ul poate fi vazut ca o traducere a ODBC-ului într-o interfata orientata obiect.
  3. ODBC este mai greu de învatat, deoarece amesteca laolalta constructiile simple cu cele avansate si are optiuni complexe chiar si pentru interogari simple. În schimb, JDBC-ul a fost proiectat astfel încât sa nu complice lucrurile simple, dar sa ofere si tehnici avansate acolo unde este nevoie de ele.
  4. Folosirea JDBC-ului ofera o solutie pura Java. Codul este în acest caz portabil si ofera securitate pe toate platformele, de la calculatoarele de retea la mainframe-uri.

Deci JDBC-ul este o interfata Java naturala catre facilitatile de baza din SQL. Însa JDBC-ul se bazeaza pe ODBC, astfel ca programatorii familiarizati cu ODBC vor gasi învatarea JDBC-ului foarte usoara.

Doua sau trei niveluri

În modelul cu doua niveluri (two-tier), un aplet sau o aplicatie Java lucreaza direct cu baza de date. În acest caz este necesar un driver JDBC care comunica cu SGBD-ul particular al bazei respective. Cererea SQL este trimisa bazei de date iar rezultatul este înapoiat utilizatorului, baza de date putându-se afla pe alta masina la care utilizatorul este conectat printr-o retea. Acest model este similar modelului client/server (vezi figura Modelul cu doua niveluri).

În modelul cu trei niveluri (three-tier), interogarile se trimit catre un nivel intermediar (numit si server de aplicatie), care retrimite cererea SQL catre serverul bazei de date. Acesta o prelucreaza si trimite rezultatul catre nivelul de mijloc, care îl transmite mai departe catre utilizator. În acest caz, utilizatorul poate utiliza un API de nivel înalt, mai simplu de folosit, care transpune cererile într-un nivel mai jos, înteles de serverul bazei de date (vezi figura Modelul cu trei niveluri).

Pâna acum nivelul de mijloc era scris în general în C sau C++, limbaje care ofera performante ridicate. Oricum, cu compilatoarele care traduc codul Java în cod specific masinii, a devenit practic sa se implementeze modelul cu trei nivele în Java. Acesta este un atu important, deoarece profita de calitatile Java în ceea ce priveste robustetea si securitatea.

Concordanta SQL

SQL-ul este un limbaj standard pentru accesarea bazelor de date relationale. Aproape toate SGBD-urile folosesc pentru functionalitatea de baza o forma de SQL, însa exista diferente de la un SGBD la altul în ceea ce priveste alinierea dialectului SQL specific la standardul limbajului, mai ales pentru facilitatile mai avansate. Pâna ce aceste probleme se vor rezolva, API-ul JDBC trebuie sa suporte SQL-ul asa cum este.

Sa vedem însa cum se descurca JDBC-ul cu aceasta problema a concordantei SQL.

O modalitate pe care API-ul JDBC ne-o ofera este ca ne permite sa trimitem orice secventa SQL unui anumit SGBD. Prin aceasta suntem liberi sa folosim la maxim posibilitatile SQL-ului, dar exista riscul ca SGBD-ul sa nu înteleaga sintaxa si sa returneze eroare.

O a doua posibilitate pe care JDBC-ul o ofera este de a folosi asa-numitele "clauze escape", în stilul clauzelor escape ODBC. Aceasta metoda rezolva o parte din divergentele datorate implementarii SQL-ului.

A treia posibilitate este recomandata pentru aplicatii complexe. JDBC-ul furnizeaza informatii despre SGBD prin interfata DatabaseMetaData, astfel încât aplicatiile se pot adapta în functie de necesitatile si posibilitatile fiecarui SGBD.

Produse JDBC

Sa vedem acum câteva produse JDBC. JavaSoft furnizeaza JDBC-ul cu trei componente, toate incluse în JDK:

JDBC driver manager este coloana vertebrala a arhitecturii JDBC. Este destul de mic si simplu; functia de baza este de a conecta aplicatia Java cu driverul JDBC potrivit. JDBC driver test ne încredinteaza ca driverul JDBC va rula programul nostru. În fine, combinatia JDBC-ODBC permite driverelor ODBC sa fie folosite ca drivere JDBC.

Practica...

În exemplul din caseta alaturata este prezentat un program Java care realizeaza o conexiune la un driver JDBC, caruia i se furnizeaza o secventa select si se afiseaza rezultatul (în acest caz, toate articolele tabelei).

Pito Peter si Stelian Vultur sunt studenti la Universitatea Petru Maior din Târgu-Mures si pot fi contactati la adresele ppito@agora.ro si svultur@uttgm.ro.

(C) Copyright Computer Press Agora