IPRO - PC Magazine Romania, Noiembrie 2003
SOLUȚII PENTRU PROGRAMATORII ȘI DESIGNERII WEB
Tehnologia Java Servlets: lucrul cu bazele de date prin paghetele JDBC
Mircea Scărlătescu
Cei ce spun că în zilele noastre informația reprezintă
puterea s-ar putea să aibă dreptate. Internetul zilelor noastre se bazează 100%
pe baze de date. Aproape toată informația disponibilă pe situri este preluată
din baze de date, acolo unde este stocată și prelucrată.
Toate limbajele de scripting web sunt dotate cu funcții de lucru cu bazele de date, iar un limbaj ca Java nu putea să facă excepție de la regulă; JSP și Servlets sunt două tehnologii ce pot foarte bine să integreze lucrul cu date preluate de la servere specializate în bazele de date.
JDBC este cuvântul magic al programatorilor Java atunci când vine vorba despre baze de date. Prescurtare de la JavaDataBaseConectivity, această serie de clase Java specializate în interogări ale bazelor de date sunt astfel concepute pentru a oferi atât o realizare rapidă și facilă a aplicațiilor dar și în spiritul Java, anume acela de portabilitate.
Orice aplicație ce va folosi JDBC, și aici intră și categoria paginilor JSP și Servleturilor va folosi o serie de funcții incluse în clasele JDBC, indiferent de ce server de baze de date apelează, iar legătura directă cu serverul va fi facută printr-un driver JDBC, specific pentru fiecare server în parte. Așa se face că la portarea unei aplicații pe o altă platformă, și din punctul de vedere al JDBC, singura schimbare ce trebuie efectuată este cea a driverului, sursele programului nesuferind modificări. Simplu, nu? :)
Realizam în numărul trecut o aplicație care prelua de la utilizator o serie de date, pe care apoi un servlet le afișa ca răspuns către client. Ceea ce ne propunem acum este ca acele date pe care un utilizator le introduce să fie memorate într-o bază de date. Și ca să menținem aspectul ´OpenSource´ al tutorialului nostru, vom alege ca server de baze de date MySQL (pe platformă Mandrake 9.1), foarte folosit în tehnologia paginilor web. Nu vom da aici detalii despre instalare, acest proces fiind foarte facil, mai ales cu ajutorul interfețelor grafice ale sistemelor Linux. Să realizăm un tabel în baza de date PCMagazine cu următorul script SQL
CREATE TABLE `useres` (
`id` INT( 10 ) NOT NULL ,
`nume` VARCHAR( 100 ) NOT NULL ,
`prenume` VARCHAR( 100 ) NOT NULL ,
`an` INT( 10 ) NOT NULL ,
`luna` INT( 10 ) NOT NULL ,
`zi` INT( 10 ) NOT NULL ,
`adresa` VARCHAR( 100 ) NOT NULL ,
`oras` VARCHAR( 100 ) NOT NULL ,
`telefon` VARCHAR( 100 ) NOT NULL ,
`email` VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( `id` )
);
Dacă ar fi să introducem printr-o comandă SQL în acest tabel o înregistrare, iată cum ar arăta aceasta:
INSERT INTO `useres` ( `nume` , `prenume` , `an` , `luna` , `zi` , `adresa` , `oras` , `telefon` , `email` )
VALUES (´Scarlatescu´, ´Mircea´, ´1980´, ´8´, ´16´, ´Adresa din Ploiesti´, ´Ploiesti´, ´0744 xxx xxx´, ´[email protected]´
);
Să vedem acum cum procedăm pentru a introduce în baza de date o înregistrare din servletul pe care l-am realizat luna trecută. Primul pas este acela de a adăuga linia
import java.sql.*;
pentru a preciza că vom lucra și cu clase JDBC.
Odată ce am realizat acest lucru, pentru a conecta aplicația noastră la serverul MySQL vom inițializa driverul MyJDBC
Connection conn = DriverManager.getConnection ("jdbc:mysql://mysql.cs.nott.ac.uk/?user= " + user + "&password=" + password );
Această linie declară că JDBC va lucra cu un server MySQL și că toate operațiile se vor realiza prin intermediul variabilei conn, care joacă rolul de legătură între aplicația noastră și baza de date. Aici este locul unde trebuie să se schimbe declarația driverului în cazul în care am dori să portăm această aplicație pe un alt server de baze de date; user și password sunt date ce permit accesul la baza de date, și sunt stabilite de către administratorul serverului MySQL. La instalare, se stabilesc implicit userul root și parola vidă.
Pentru a efectua o instrucțiune MySQL trebuie să instanțiem un obiect de tipul Statement:
Statement stmt = conn.createStatement ();
Prin intermediul acestui obiect realizăm orice instrucțiune SQL cu JDBC, iar în cazul nostru dorim să introducem o înregistrare, deci vom utiliza INSERT, așa cum s-a precizat mai sus. Vom realiza o instrucțiune SQL mai întâi în cel mai simplu mod posibil
Inițializăm un string care va stoca instrucțiunea noastră:
String query="INSERT INTO users (nume, prenume, an, luna, zi, adresa,
oras, telefon, email) VALUES (´" + cerere.getParameter("nume")
+ "´, ´" + cerere.getParameter("prenume") +
"´, " + cerere.getParameter("an") + ", "
+ cerere.getParameter("luna") + ", " + cerere.getParameter("zi")
+ ", ´" + cerere.getParameter("adresa") + "´,
´" + cerere.getParameter("oras") + "´, ´"
+ cerere.getParameter("telefon") + "´, ´" +
cerere.getParameter("email") + "´,)";
Pentru a realiza efectiv introducerea în baza de date scriem următoarea instrucțiune
ResultSet rset = stmt.executeQuery (query);
Această modalitate este o primă (primitivă?) variantă de a realiza tema noastră de astăzi. Metoda executeQuery poate fi utilizată pentru execuția oricărui tip de instrucțiune SQL, iar rest este un obiect care va conține rezultatul interogării SQL. De fapt, executeQuery se utilizează doar pentru interogări de tip SELET, adică de aducere a datelor din baza de date.
JDBC pune la dispoziție o metodă profesionistă de a lucra cu introducerea în bazele de date, prin intermediul instrucțiunii de actualizare a tabelelor, după cum urmează:
stmt.executeUpdate(query);
Prin intermediul acestei metode, după cum probabil intuiți, se realizează ștergerea și inserarea înregistrărilor într-o bază de date, precum și modificarea unei înregistrări existente.
După efectuarea tuturor operațiilor cu baza de date, pentru eliberarea resurselor se scriu urmatoărele două instrucțiuni.
stmt.close();
con.close();
Mai trebuie să facem o precizare foarte importantă. Exemplul prezentat mai sus are un ´bug´, pe care puțini programtori îl observă la început: lipsa unor tranzacții SQL la lucrul cu baza de date. Pentru a explica mai bine despre ce este vorba, să considerăm un sistem bancar, în care o aplicație (web sau nu) accesează conturile unor persoane, adăugând sau extragând diferite sume din aceste conturi.
Implementat fără tranzacții sql, acest sistem va ajunge mai devreme sau mai târziu la situații în care aduce conturi bancare la cote negative (nu v-ar place să aveți în cont -200 USD, nu ? :) ) sau realizează operații matematice simple aparent gresite datorită accesului simultan la date.
Tranzacțiile stabilesc ordinea în care se efectuează operațiile, și de asemenea nu permit accesul simultan al mai multor clienti la aceleași date. Transacțiile sunt și un mecansim de a integra mai multe instrucțiuni, care devin definitive doar dacă sunt toate corecte (adică nu întorc erori), în cazul în care la una din instrucțiuni se generează o eroare, toate instrucțiunile se anulează.
Pot fi stabilite chiar și puncte de salvare pentru ca doar o parte din instrucțiuni să fie anulate la eroare, dar aici deja problema devine una a specialistilor ce lucreaza cu SQL si tranzacții iar noi ne vom referi la ea în numărul viitor.
Sperăm că v-ați făcut o idee despre ce înseamnă programarea JDBC, cu precizarea că vom reveni în episodul următor cu instrucțiuni din ce în ce mai complexe în ceea ce privește lucrul cu aceste clase.
Trebuie spus că orice programator Java care-și dorește o slujbă în domeniu trebuie să stăpânească foarte bine lucrul cu JDBC, având în vedere că atât aplicațiile stand-alone, dar și aplicațiile Web sunt alimentate prin acest sistem.
De asemenea, importanța Java pe piața platformelor de dezvoltare a făcut ca toate serverele importante de baze de date existente azi să aibă disponibile drivere JDBC, deci utilizarea acestui sistem pentru aplicațiile client este recomandabilă.
Mult succes în programarea Java!
Referințe web
|