Evidenta Elevilor din Ciclul Inferior al Liceului

Cuprins

Argumentare

Într-o unitate școlară este foarte importantă existența unei baze de date, nu numai a profesorilor, ci și a elevilor. O bază de date amplă, complexă ușurează mult munca secretarei și a diriginților.

O bază de date al unui liceu trebuie să conțină atât date personale ale elevilor, cât și evidența datelor despre registrul și numărul matricol, limbile studiate în anii anteriori, religie etc.

Când un elev se înscrie în clasa a IX-a a unui liceu, se trec în fișa lui nu numai datele personale (data nașterii, CNP, adresa, numele părinților, numărul CI), cât și religia pe care o are, limba studiată în școala generală, ca fiind limba avansată. Acest lucru este important din punctul de vedere al realizării grupelor de elevi, în funcție de limbile studiate. Fiecare elev are dreptul de a frecventa ora de cult, conform religiei proprie.

Prin această aplicație, realizată în Oracle, se poate crea schema proiectului, ansamblul de tabele cu legăturile lor, tabele de date cu câmpurile potrivite, interfața ei cu mediul de programare NetBeans și rapoartele aplicației realizate cu mediul de programare iReport. Se va vizualiza aplicația prin mediul de programare NetBeans și cu ajutorul rapoartelor iReport toate variantele de selectări posibile privind evidența elevilor din ciclul inferior al liceului.

1. Introducere

Oracle este un sistem de gestiune a bazelor de date complet relațional, extins, cu facilități din tehnologia orientată obiect (OO). Sistemul Oracle este realizat de firma Oracle Corporation care a fost înființată în anul 1977 în SUA – California și acum este cel mai mare furnizor de software de gestiunea datelor. Acesta este operațional pe toată gama de calculatoare (micro, mini, mainframe) sub diverse sisteme de operare.

Prima versiune de SGBD Oracle a fost realizată la sfârșitul anilor '70 respectând teoria relațională. În cadrul sistemului a fost implementat de la început limbajul relațional SQL pe care l-a dezvoltat ulterior față de versiunea standard rezultând SQL*Plus.

Începând cu versiunea 5.0 SGBD Oracle are următoarele facilități suplimentare: funcționează în arhitectura client/server; are limbaj procedural propriu PL/SQL; are precompilatoare ca interfață cu limbajele universale.

În iunie 1997 s-a lansat SGBD Oracle versiunea 8.0, inclusiv în România, care a marcat o nouă generație de baze de date Oracle deoarece inițiază trecerea de la arhitectura client/server la arhitectura NC (Network Computing), are o mare deschidere, are optimizări performante și pune accent mai mare pe analiză (modelare-funcționalitate) față de programare (codificare).

În noiembrie 1998 s-a lansat SGBD Oracle 8i ca sistem de baze de date pe Internet. Această versiune are următoarele caracteristici:

• Este reproiectat arhitectural în mod fundamental și se încadrează în tendința de trecere de la arhitectura client/server la arhitectura NC;

• Permite dezvoltarea unei baze de date de orice dimensiune, în mod centralizat sau distribuit;

• Are facilități de salvare/restaurare automate și inteligente;

• Permite partiționarea integrală pentru tabele și indecși;

• Are mesagerie integrală, prin comunicarea între aplicații și procesare offline (chiar dacă aplicațiile nu sunt conectate);

• Prelucrarea paralelă pentru: replicare, cereri de regăsire, actualizare;

• Oferă facilități din tehnologia OO, prin care se permite definirea

și utilizarea de obiecte mari și complexe;

• Optimizează cererile de regăsire prin reutilizarea comenzilor SQL identice lansate de utilizatori diferiți și prin realizarea unui plan de execuție a instrucțiunilor SQL;

• Are un grad de securitate sporit prin: server de criptare, control trafic rețea, niveluri de parolare etc.;

• Permite lucrul cu depozite de date (Data Warehouse) care conțin date multidimensionale (cu tehnologia OLAP);

• Conține foarte multe produse ceea ce-l face să fie o platformă pentru baze de date: servere (Oracle 8, Application, Security, Internet Commerce etc), instrumente (Designer, Developer, Express, WebDB etc), aplicații (Financials, Projects, Market Manager, Manufacturing etc);

• Este primul SGBD pentru Internet cu server Java inclus;

• Reduce drastic costurilor pentru realizarea unei aplicații(de cca 10 ori față de versiunea anterioară);

• Este o platformă multiplă permițând lucrul pe orice calculator, orice sistem de operare, orice aplicație, orice utilizator;

• Are instrumente diverse pentru dezvoltarea aplicațiilor: bazate pe modelare (Designer, Developer, Application Server), bazate pe componente (Java), bazate pe HTML (browsere, editoare Web) și XML, prin programare: proceduri stocate (PL/SQL, Java), obiecte standard, obiecte ODBC, obiecte JDBC, fraze SQL etc., tip internet (WebDB);

• Oferă servicii multiple de Internet (Web, E_mail, e_bussines, etc) integrate cu servicii Intranet.

Ulterior a fost lansat sistemul Oracle 9i care a marcat trecerea la o nouă generație de servicii internet. El este mai mult decât un suport pentru baze de date deoarece oferă o infrastructură completă de software pentru afaceri electronice (e-business) și rulează pe o varietate de sisteme de calcul și de operare: SUN-SOLARIS, HP-UX, IBM-AIX, PC_WINDOWS, XX-LINUX. Componenta Oracle WebDB a evoluat în Oracle Portal.

Oracle 9i DATABASE are față de versiunea anterioară asigură o protecție ridicată și automatizată iar costul administrării bazei de date scade în mod drastic.

Oracle 9i REAL APPLICATION CLUSTERS (RAC) se bazează pe o nouă arhitectură de BD numită îmbinare ascunsă (Cache Fusion). Aceasta este o nouă generație de tehnologie de clustere. Conform acestei arhitecturi la adăugarea unui calculator înr-o rețea cu BD Oracle, clusterele se adaptează automat la noile resurse, fără să fie necesară redistribuirea datelor sau rescrierea aplicației. Posibilitatea apariției unei erori la o configurație cu 12 calculatoare sub Oracle 9i RAC este foarte mică, esimată ca durată în timp la cca 100.000 de ani.

În Oracle 9i APPLICATION SERVER se pot creea și utiliza aplicații Web care sunt foarte rapide și permit integrarea serviciilor de Internet.

Oracle 9i DEVELOPER SUITE este un mediu complet pentru dezvoltarea aplicațiilor tip afaceri electronice (e-business) și tip Web. El se bazează pe tehnologiile Java și XML și permite personalizarea (Oracle Personalization).

În anul 2003 a fost lansată versiunea Oracle 10g care adaugă noi facilități sistemului Oracle 9i.

Oracle Database 10g este proiectat pentru a fi implementat eficient pe orice sistem de la micile servere blade până la cele SMP de dimensiuni mari și clustere de orice dimensiune. El include capabilități de management automatizate pentru simplificarea activităților și eficientizarea costurilor. Abilitatea unică a Oracle Database 10g de gestiune a tuturor datelor de la informațiile obișnuite de afaceri până la documente XML și informațiile spațiale/locale îl fac alegerea ideală pentru prelucrarea tranzacțiilor online și aplicațiile de suport decizional și management al conținutului.

2006 a marcat un an de realizări importante pentru Oracle Database 10g. Versiunea gratuită oferită de Oracle – Oracle Database 10g Express Edition – a devenit general disponibilă în martie 2006 și oferă dezvoltatorilor de aplicații, administratorilor de baze de date și studenților libertatea de a dezvolta și utiliza la alegere aplicații pe platformele proprii. Oracle și-a reconsolidat promisiunea de a oferi o paletă largă de interfețe de programare care vin în sprijinul necesităților diferitelor comunități de dezvoltatori prin introducerea mai multor instrumente de dezvoltare pentru aplicații Oracle Database pe platforma web și Microsoft .NET Framework.

Oracle Database Express Edition (prescurtat Oracle XE) este în esență o aplicație din familia serverelor de baze de date.

Sesizând însă dificultățile realizării interfeței utilizator-server dintr-o aplicație, firma Oracle Co. furnizează împreună cu serverul și aplicația destinată dezvoltării unei interfețe sub forma unui ansamblu de pagini .html denumit Oracle Application Express.

De altfel la fel procedează și alte companii, care dezvoltă servere pentru baze de date.

În cele ce urmează voi folosi ca server de baze de date Oracle XE,

soluție gratuită oferită de Oracle Co., iar pentru realizarea interfeței voi face apel la limbajul Java și iReport pentru realizarea diferitelor rapoarte.

Aplicațiile astfel construite prezintă trei avantaje majore:

software-ul necesar este gratuit.

aplicația astfel realizată poate fi folosită pe diferite platforme: Windows, Linux, Unix, Solaris etc.

decuplează partea aplicației destinată stocării datelor (server de b.d.) de partea care le accesează (interfața).

1.1. Arhitectura sistemului Oracle

Componentele care formează arhitectura de bază Oracle (vezi fig.) sunt dispuse într-o configurație client/server. Aceste componente sunt plasate pe calculatoare diferite într-o rețea asigurând funcționalități specifice, astfel: serverul asigură memorarea și manipularea datelor, precum și administrarea bazei de date, iar clientul asigură interfața cu utilizatorul și lansează aplicația care accesează datele din baza de date.

Figura 1. Arhitectura Oracle

Arhitectura Oracle se încadrează în tendințele actuale și anume este structurată pe trei niveluri: nucleul, interfețele și instrumentele de întreținere.

Nucleul Oracle conține componentele care dau tipul relațional pentru SGBD Oracle: limbajul relațional de regăsire SQL și limbajul procedural propriu PL/SQL.

Sistemul Oracle creează și întreține automat dicționarul de date. Acesta face parte din baza de date Oracle și conține un set de tabele și viziuni (vederi) accesibile utilizatorilor doar în consultare. Dicționarul conține informații de tipul: numele utilizatorilor autorizați, drepturile de acces, numele obiectelor din baza de date, structurile de date, spațiul ocupat de date, chei de acces etc.

Interfețele sunt componentele care permit dezvoltarea aplicațiilor cu BD, astfel:

• DEVELOPER SUITE este componenta destinată dezvoltatorilor (programatorilor) de aplicații. Conține generatoarele FORMS (meniuri și videoformate), REPORTS (rapoarte și grafice), JDEVELOPER;

• DESIGNER este componentă destinată analiștilor/proiectanților de aplicații. Oferă elemente de CASE pentru proiectarea aplicațiilor cu BD;

• PRO*C este componenta destinată programatorilor în limbajele de programare universale (FORTRAN, COBOL, Pascal, C, ADA, PL1);

• DATAWAREHOUSE BUILDER este destinat analizei datelor multidimensionale, folosind tehnologia de tip OLAP (On Line Analitical Processing);

• ORACLE APPLICATIONS permite dezvoltarea unor aplicații de întreprindere (Financials, Manufacturing, Projects etc.);

Instrumentele sunt componente destinate întreținerii și bunei funcționări a unei BD Oracle. ENTERPRISE MANAGER CONSOLE conține mai multe utilitare destinate administratorului BD (deschidere/închidere BD, autorizarea accesului, refacerea BD, conversii de date, etc.).

1.2. Oracle Server

Oracle Server (OS) permite managementul informațiilor organizate în baze de date, astfel încât se asigură accesul mai multor utilizatori în mod concurențial la același date, oferind facilități de prevenire a accesului

neautorizat și de restaurare a datelor după producerea unor erori.

OS are următoarele facilități:

• Client/server permite ca prelucrările să fi împărțite între serverul de baze de date și programele de aplicație ale utilizatorilor aflate pe stațiile conectate la server;

• Suportă lucrul cu baze de date foarte mari;

• Permite utilizarea concurențială a bazelor de date;

• Oferă securitate sporită și integritatea datelor;

• Permite lucrul distribuit;

• Conferă portabilitate aplicațiilor;

• Permite ca mai multe tipuri de calculatoare și sisteme de operare să coexiste pe aceeași rețea.

Oracle Server este un sistem relațional-obiectual de management a bazelor de date, care permite o abordare deschisă, integrată și cuprinzătoare a managementului informațiilor.

OS constă dintr-un cuplu format dintr-o bază de date și o instanță Oracle:

A. O bază de date Oracle este o colecție unitară de date, având o structură logică și una fizică, putând avea două stări: open (accesibilă) și close (inaccesibilă).

1) Structura logică ale unei baze de date este formată din tabelele spațiu (tablespaces), schema de obiectelor bazei de date, blocurile de date, extensiile și segmentele.

Tabelele spațiu sunt unitățile logice de memorie în care este împărțită o bază de date și pot fi tabele spațiu de sistem și tabele spațiu de utilizator. Din punct de vedere al accesibilității aceste pot fi on line și off line.

Fișierele de date sunt structurile de memorie specifice unui sistem de operare pe care rezidă tabelele spațiu ale unei baze de date.

Schema este o colecție de obiecte, iar schema de obiecte este o structură logică ce se referă direct la datele unei baze de date(tabele, vederi, secvențe, proceduri memorate, sinonime, indecși, clustere și link-uri de bază de date).

Blocurile de date, extensiile și segmentele sunt elemente de control eficient al spațiului de memorie externă pe disc aferent unei baze de date.

Blocul de date este unitatea de memorie cea mai mică manipulată de SGBD Oracle, iar mărimea acestuia măsurată în bytes se definește la momentul creerii bazei de date.

Extensia este format din mai multe blocuri de date contigue.

Segmentul este format din mai multe extensii. Segmentele pot fi: segmente de date (pentru memorarea datelor unei tabele), segmente de indecși, segmente roollback (folosite pentru memorarea informațiilor necesare pentru recuperarea datelor unei baze de date sau anularea unei tranzacții) și segmente temporare (folosite pentru prelucrarea instrucțiunilor SQL).

2) Structura fizică este definită de un set de fișiere specifice sistemului de operare pe care rezidă SGBD Oracle, folosite pentru memorarea structurilor logice ale bazei de date și pentru păstrarea unor informații tehnice de control. Aceste fișiere sunt: fișiere de date (Data files), fișiere Redo log (Redo Log files) și fișiere de control (Control files).

Fișierele de date (Data files) conțin datele unei baze de date, sub forma structurilor logice ale acesteia (tabele, vederi, secvențe, proceduri memorate, sinonime, indecși, clustere și link-uri de bază de date). Fișierele de date au următoarele caracteristici: un fișier de date poate aparține unei singure baze de date, pot fi extinse automat în anumite momente specifice ale funcționării bazei de date, unul sau mai multe fișiere de date pot memora o tabelă spațiu.

Fișierele Redo Log (Redo Log files) sunt folosite pentru memorarea tuturor schimbărilor de date produse asupra unei baze de date, astfel încât dacă se întâmplă o cădere de curent să se prevină distrugerea datelor bazei de date. Se pot folosi simultan mai multe fișiere de acest fel care să rezide pe discuri diferite.

Fișierele de control (Control files) sunt folosite pentru memorarea informațiilor necesare pentru controlul structurii fizice a unei baze de date (numele bazei de date, numele și locațiile fișierelor de date, data creerii bazei de date etc).

B. Instanța Oracle (Oracle instance) este combinația logică dintre structurile de memorie internă (SGA – system global area, PGA – program global area) și procesele Oracle de bază activate la momentul pornirii unei baze de date.

1) SGA este o regiune partajabilă de memorie care conține datele și informațiile necesare unei instanțe Oracle și conține:

• Database Buffer Cache (conține blocurile de date cele mai recent utilizate pentru a reduce utilizarea discului);

• Redo Log Buffer (conține datele despre blocurile modificate);

• Shared Pool (pentru prelucrarea instrucțiunilor SQL);

• Cursorii (Statement Handles or Cursores) folosiți pentru manipularea instrucțiunilor unui limbaj gazdă folosind facilitatea Oracle Call Interface.

2) PGA este zona de memorie care conține datele și informațiile de control ale unui proces server.

3) Procesul este un mecanism al sistemului de operare care poate executa o serie de pași (instrucțiuni). Este cunoscut și sub numele de job sau task. Procesul are propria sa zonă de memorie în care se execută. Un server Oracle are două tipuri de procese: procese utilizator și procese Oracle.

Procesul utilizator (user proces) este creat și menținut pentru a executa codul de program aferent unui anumit limbaj (C++) sau un produs Oracle (Oracle tool), SQL*Forms, Sql*Graphics etc.

Procesul Oracle este apelat de către un alt proces pentru a executa funcția cerută de către acesta. Procesele Oracle sunt Procese server și procese background.

Procesele server (Server Processes) sunt utilizate de Oracle pentru a prelucra cererile proceselor utilizator. Oracle poate fi configurat astfel încât să permită unul sau mai multe procese utilizator. Din acest punct de vedere avem servere dedicate care au un singur proces utilizator și servere multi prelucrare (multi-threaded server configuration). Pe anumite sisteme procesele utilizator și procesele server sunt separate, iar în altele sunt combinate într-unul singur. Dacă folosim sistemul multi prelucrare sau dacă procesele utilizator și procesele server se află pe mașini diferite atunci aceste procese trebuie să fie separate. Sistemul client/server separă procesele utilizator de către procesele server și le execută pe mașini diferite.

Procesele background (Background processes) sunt create pentru fiecare instanță Oracle pentru a executa asincron anumite funcții. Acestea sunt:

• Database Writer (DBWR) scrie datele modificate în baza de date;

• Log Writer (LGWR) scrie înregistrările redo log pe disc;

• Checkpoint (CKPT) scrie înregistrările checkpoint la timpul potrivit ;

• System Monitor (SMON) execută recuperarea unei instanțe la momentul pornirii, colectează spațiul liber etc;

• Process Monitor (PMON) recuperează procesele utilizator dacă acestea cad accidental;

• Archiver (ARCH) copiază în mod online fișierele Redo Log în fișiere de arhivă atunci când acestea se umplu cu datei;

• Recoverer (RECO) rezolvă tranzacțiile suspendate în sistemul cu baze de date distribuite;

• Dispacher (Dnnn) folosit în sistemul multithreaded;

• Lock (LCKn) blocheză procesele în sistemul Parallel server.

Legătura dintre procesele utilizator și procesele Oracle este prezentată în figura.

Figura2. Legătura dintre procesele utilizator și procesele Oracle

Interfața program este mecanismul de comunicare dintre un proces utilizator și un proces server. Este metoda standard de comunicare între o aplicație sau un instrument Oracle și Oracle Server.

Oracle Database Express Edition este un server de baze de date

relaționale. Într-o bază de date relațională datele sunt păstrate în fișiere de

date. Un fișier conține articole având fiecare aceeași structură, definită la crearea sa. Figura 3

Structura articolelor unui fișier de date este definită la crearea sa, prin precizarea câmpurilor pe care le va conține.

Un câmp se caracterizează prin nume, tipul informației conținute,

lungime și numărul de zecimale (pentru câmpuri numerice).

Datorită faptului că formatul articolului este fix, frecvent se foloseste pentru fișier o reprezentare tabelară și chiar se folosește pentru fișierele de date denumirea de "tabele".

Figura 4

Un server Oracle XE operează cu o singură bază de date.

Administratorul bazei de date crează conturi ale utilizatorilor cărora le atribuie drepturile necesare operării în interiorul bazei Oracle XE. Un astfel de utilizator devine astfel proprietarul unui subdomeniu inclus în baza Oracle XE denumit de către autorii aplicației "schemă" (engl. schema). După înregistrarea contului, beneficiarul acestuia poate realiza infrastructura pe care se va baza aplicația sa: tabele, interogări, vederi, proceduri, etc. Domeniile diferiților utilizatori sunt în principiu complet separate, un utilizator având însă posibilitatea de a da și altor utilizatori drepturi de acces la componentele domeniului său.

Dimensiunea bazei de date administrate de Oracle XE este limitată la

4 GO (4 gigaocteți).

Un utilizator poate accesa un server Oracle XE de pe calculatorul pe care acesta este instalat sau prin rețea (rețea locală sau Internet).

2. Oracle XE. Operații elementare

2.1. Instalarea serverului Oracle XE pe calculator meu funcționând sub Windows XP

Pentru instalare am demarat o sesiune de lucru, folosind un cont de utilizator, care are drepturi de administrare și am descărcat kitul pentru Oracle Database XE, versiunea pentru Windows, de la adresa:

http://www.oracle.com/technology/products/database/xe

Pentru demararea instalării am selectat OracleXE.exe. Instalarea decurge apoi în mai multi pasi, astfel:

Figura 5

În fereastra Licence Agreement am selectat I accept și apoi Next.

In fereastra Choose Destination Location am indicat unde se va instala aplicația. Locația implicită este C:

Figura 6

În fereastra Specify Database Passwords am introdus parola ORACLE pentru conturile SYSTEM și SYS.

Figura 7

O ultimă fereastră afișează o recapitulare a opțiunilor introduse. Se

apasă Install pentru a se realiza instalarea.

Figura 8

2.2. Pornirea serverului Oracle XE

După instalare și după repornirea calculatorului, serverul Oracle XE va fi în mod normal pornit manual folosind comanda (Start -> Programs ->Oracle database 10g Express Edition -> Start Database).

Figura 9

Tot aceeasi cale va fi folosită pentru a afișa fereastra Aplication Express Login:

(Start -> Programs ->Oracle database 10g Express Edition -> Go To Database Home Page).

Această fereastră va fi punctul de plecare în activitățile de administrare a serverului.

Contul utilizatorului SYSTEM are drept de administrare, poate sa creeze o serie de utilizatori.

Figura 10

2.3. Crearea utilizatorului JUDIT

În urma instalării serverului Oracle XE există trei utilizatori ai serverului, respectiv SYS și SYSTEM cu drept de administrare și HR (parola hr), utilizator obisnuit. Utilizatorul HR a fost creat pentru a se putea testa aplicațiile incluse în documentația serverului.

Pentru crearea unui nou utilizator se recomandă conectarea folosind contul SYSTEM.

Figura 11

Un utilizator este identificat prin nume (Username:), parolă (Password:) și are un ansamblu de drepturi. Utilizatorul creat se numește JUDIT și are toate drepturile (am selectat Check All), dar nu are drepturi de administrare a serverului (nu se selectează caseta DBA – DataBase Administrator).

Figura 12

După crearea noului utilizator, lista de utilizatori arată ca în figură.

Figura 13

După crearea noului utilizator se observa că numele utilizatorului apare cu majuscule.

2.4. Crearea unui ansamblu de tabele

Pentru păstrarea informațiilor, modelul relațional presupune folosirea unui ansamblu de tabele, fiecare conținând informații de o anumită natură. Între tabele există legături realizate prin perechi de valori ale unor câmpuri.

Figura 14

Pe schema alăturată este vizualizată ansamblul de tabele necesare creării bazei de date necesare evidenței elevilor dintr-un liceu, ciclul inferior.

2.4.1. Cheia primară, cheie străină:

Când un tabel posedă un câmp care are rolul de a diferenția articolele, câmpul va fi declarat ca fiind cheie primară, iar serverul de baze de date va verifica unicitatea valorilor adăugate. Concret, la fiecare adăugare a unui nou articol serverul de baze de date va verifica dacă valoarea cheii din noul articol nu apare într-o înregistrare deja prezentă. Dacă aceeasi valoare mai apare, adăugarea este refuzată. Un tabel poate avea o singură cheie primară.

Dacă într-una alt tabel mai există însă un câmp, acesta primește valori din coloana cu aceași nume din tabelul corespondent, deci primește valori ale cheii primare dintr-un tabel correspondent, el poartă numele de cheie străină, deoarece valorile sunt ale unei chei primare, dar din alt tabel.

De exemplu, în tabelul CLASA fiecărei clase, existente în liceu, i se înregistrează numele CLASA, profilului clasei numele PROFIL și un identificator unic, COD_CLASA care va fi cheie primară, corespondentul ei fiind cheie străină COD_CLASA în tabelul ELEVI.

Figura 15

2.5. Crearea tabelelor

2.5.1. Crearea tabelelor cu cheie primară

În meniul Object Browser selectez Create / Table:

Figura 16

Crearea unui tabel, ex. CLASA se realizează în mai mulți pași, astfel:

se introduce numele tabelului și se definesc coloanele acestuia. Tabelul CLASA are coloanele:

COD_CLASA – NUMBER (4, 0)

CATEDRA – VARCHAR2 (10)

PROFIL – VARCHAR2 (50)

Figura 17

se definește cheia primară:

Figura 18

se definesc cheile străine (dacă este cazul). Acestea vor servi la realizarea legăturilor între tabele. În tabelul CLASA nu există chei străine, deci se apasă butonul Next.

Figura 19

d) în ultimul pas (Constraints) nu se va introduce nimic și se va apăsa butonul Finish si apoi, în noul ecran, Create.

Figura 20

Figura 21

Se crează identic tabelele: LIMBAINCEP, LIMBAAVANS, RELIGIE.

Tabelul LIMBAINCEP:

Figura 22

Tabelul LIMBAAVANS:

Figura 23

Tabelul RELIGIE:

Figura 24

2.5.2. Crearea tabelelor cu cheie străină

În crearea tabelelor cu cheie străină se urmăresc aceleiași pași, cu excepția definirii cheilor străine.

Ex. crearea tabelului ELEVI se realizează în următorii pași:

se introduce numele tabelului și se definesc coloanele acestuia. Tabelul ELEVI are coloanele:

COD_ELEV – NUMBER (4,0)

NUME – VARCHAR2 (20)

PRENUME – VARCHAR2 (20)

COD_CLASA – NUMBER (4,0)

NUMETATA – VARCHAR2 (20)

NUMEMAMA – VARCHAR2 (20)

ADRESA – VARCHAR2 (40)

DATANASTERII – DATE

Figura 25

se definește cheia primară:

Figura 26

se definesc cheile străine:

Figura 27

Se realizează legătura între tabelele CLASA și ELEVI prin COD_CLASA. Apoi se apasă ADD.

Comportamentul serverului Oracle XE în momentul ștergerii unui articol din tabelul corespondent poate fi impus prin selectarea opțiunii următoare:- Cascade Delete – impune ștergerea articolelor din tabelul curent la ștergerea articolului corespondent din tabelul referit .

Figura 28

Se apasă Next.

în ultimul pas (Constraints) nu se va introduce nimic și se va apăsa butonul Finish și apoi, în noul ecran, Create. Rezultatul va fi:

Figura 29

Asemănător se vor crea și tabelele MATRICOL și BAZADATE:

Tabelul MATRICOL:

Figura 30

Tabelul BAZADATE: are mai multe chei străine, prin care se realizează legăturile cu tabelele ELEVI, LIMBAINCEP, LIMBAAVANS, RELIGIE, MATRICOL.

Figura 31

Rezultatul va fi:

Figura 32

2.6. Adăugarea datelor în tabelele

Se poate realiza prin selectarea DATA / INSERT ROW, apoi se introduc datele.

Figura 33

Articolele adăugate pot fi editate, dacă se selectează butonul EDIT.

Figura 34

3. ELEMENTELE DE BAZĂ ALE LIMBAJULUI SQL

3.1. Despre limbaj

În 1974 a fost lansat proiectul System/R de către firma IBM. Tot în acest an a apărut limbajul structurat de programare SEQUEL (Structured English as Query Language) autori fiind Chamberlin și Boyce.

În 1976 apare un nou limbaj SEQUEL 2 care a fost declarat limbajul de interogare al SGBD System/R. Denumirea limbajului este schimbată de Chamberlin în SQL (Structured Query Language) în anul 1980.

Ulterior limbajul a fost perfecționat fiind considerat cel mai răspândit limbaj de interogare a bazelor de date relaționale.

Institutul Național pentru Standarde în anul 1982 a lansat un proiect de lucru pentru standardizarea limbajelor de interogare care a fost finalizat în 1986 apărând standardul ANSI SQL-86. Acesta definește comenzile de bază ale SQL, dar nu conține partea de actualizare și acordarea drepturilor de acces la o bază de date.

Prin revizuire acest limbaj apare în 1989 SQL-1 ca fiind limbajul fundamental al SGBD ralaționale.

În 1992 apare versiunea SQL-2 care oferă noi facilități cum ar fi: joncțiune externă, implementarea restricției referențiale, modificarea schemei bazei de date, etc.

Cel mai recent standard este SQL-3 care a fost lansat în anul 1999, acesta este considerat un limbaj complet în vederea definirii și gestiunii obiectelor complexe. Se consideră că prin publicarea standardului propus în acest an a fost depășită bariera relaționalului, el fiind mult mai mult decât un instrument de consultare a bazelor de date.

3.2. Trăsături caracteristice SQL

SQL este prezentat în limba engleză. Folosește cuvintele Select, Insert, Delete ca părți ale setului de comenzi.

SQL este un limbaj neprocedural: specifică ce informații dorești, nu cum să le obții. Cu alte cuvinte SQL nu îți cere să specifici metoda de acces la date. Toate cererile SQL folosesc optimizarea cererilor – o parte a RDBMS – pentru a determina rapid remedierea datelor specificate. Aceste trăsături ușureaza obținerea rezultatelor dorite.

Procesarea SQL asupra înregistrărilor nu se poate face decât asupra unei singure înregistrări la un moment dat. Cea mai comună formă a unui set de înregistrări este un tabel.

SQL poate fi folosit de un șir de utilizatori incluzând DBA, programatori de aplicații, personal de management și multe alte tipuri de utilizatori.

SQL pune la dispoziție comenzi pentru o varietate de tascuri incluzând:

date interogate

inserarea, extragerea și ștergerea rândurilor într-un tabel.

crearea, modificarea și ștergerea obiectelor de tip bază de date

controlul accesului la baza de date și la obiectele de tip bază de date.

garantarea consistenței bazei de date

La început sistemele de management a bazei de date a utilizat un limbaj separat pentru fiecare categorie în parte. SQL le-a unificat pe toate acestea într-un singur limbaj.

3.3. Setul de comenzi SQL

Cele mai importante comenzi folosite în limbajul SQL sunt următoarele:

SELECT – este comanda cea mai utilizată; este folosită pentru obținerea datelor din bazele de date

INSERT, UPDATE, DELETE – aceste trei comenzi sunt utilizate pentru a introduce noi rânduri, pentru a schimba rândurile existente și ștergerea rândurilor nedorite din tabelele bazelor de date respective. (Ele sunt cunoscute în ansamblu ca DML sau comenzi ale limbajului de manipulare a datelor).

CREATE, ALTER, DROP – aceste trei comenzi sunt utilizate dinamic pentru a crea, utiliza și șterge orice structură de date, de exemplu tabele, expuneri, indecși. (Ele sunt cunoscute sub numele colectiv DDL sau comenzi ale limbajelor de definire a datelor).

GRANT, REVOKE – aceste două comenzi sunt utilizate pentru a da sau a lua drepturile de acces pentru bazele de date și structurile din Oracle.

3.3.1. Scrierea comenzilor SQL

Când scriem comenzi SQL, este important să ne reamintim câteva reguli simple pentru construirea unor declarații valide, care sunt și ușor de citit și de editat:

comenzile SQL pot fi pe una sau mai multe linii

clauzele sunt uzual plasate pe linii separate

tabelarea poate fi folosită

cuvintele de comandă nu pot fi separate pe mai multe linii

comenzile SQL nu sunt 'case sensitive'.

comandă SQL este introdusă la promptul SQL și liniile subsecvențelor sunt numărate

singura declarație poate fi considerată curentă cât timp ea este în buffer și poate fi rulată într-un număr de moduri :

plasând un punct și virgulă(;) la sfârșitul ultimei clauze

plasând un punct și virgulă / slash la ultima linie în buffer

plasând un slash(/) la promptul SQL

scriind un [RUN] (comanda SQL) la promptul SQL.

Pentru introducerea comenzilor SQL, serverul Oracle XE oferă două interfețe:

a) introducerea comenzilor SQL folosind interpretorul de comenzi

SQL *Plus executabil într-o fereastră de tip Command Prompt

Lansarea în execuție a interpretorului se realizează accesând Run SQL Command Line din grupul de comenzi Oracle Database 10g Express Edition

b) introducerea comenzilor SQL folosind interfața grafică:

Figura 35

După conectare se selectează SQL Commands / Enter Command.

Figura 36

Figura 37

Comenzile introduse în fereastra SQL Commands pot fi terminate prin ';' ca în MySQL de exemplu sau se poate chiar omite caracterul terminal. Astfel pentru suprimarea tabelului LIMBAINCEP se poate scrie:

drop table limbaincep;

sau pur și simplu drop table limbaincep efectul fiind acelasi.

Comenzile SQL pot fi memorate individual apăsând butonul Save:

Figura 38

Comenzile memorate pot fi reexecutate prin selectare cu mouse-ul (dublu clic):

Figura 39

3.4. Crearea tabelelor în Oracle XE

3.4.1. Comanda CREATE TABLE

Comanda CREATE TABLE servește la crearea unui nou tabel și la

descrierea câmpurilor acestuia. Ea are formatul general:

CREATE TABLE nume

(nume_câmp tip_câmp [(mărime [,precizie])]

[NULL | NOT NULL]

[PRIMARY KEY | UNIQUE]

[,nume_câmp tip_câmp [(mărime [,precizie])]

[NULL | NOT NULL])

Exemplu pentru tabelul CLASA:

Figura 40

CREATE TABLE "CLASA"

( "COD_CLASA" NUMBER(4,0) NOT NULL ENABLE,

"CLASA" VARCHAR2(10) NOT NULL ENABLE,

"PROFIL" VARCHAR2(30) NOT NULL ENABLE,

CONSTRAINT "CLASA_PK" PRIMARY KEY ("COD_CLASA") ENABLE

)

/

Crearea tabelelor va fi realizată mai usor folosind interfața serverului Oracle XE.

3.4.2. Comanda DROP TABLE

Comanda DROP TABLE permite suprimarea unui tabel. Sintaxa comenzii este:

DROP TABLE Nume_tabel

Pentru a da comanda folosind interfața grafică se selectează succesiv Object Browser / Browse / Tables, se selectează apoi tabelul și se apasă butonul Drop: Figura 41

3.4.3. Comanda SELECT

Comanda SELECT creează o mulțime de selecție. Aceasta poate conține un articol, mai multe articole sau niciunul. Articolele din mulțimea de selecție conțin numai câmpurile indicate de programator. Din acest punct de vedere se poate considera că SELECT crează un subtabel conținând numai informațiile specificate. Câmpurile înregistrărilor mulțimii de selecție pot proveni dintr-un tabel sau din mai multe tabele legate.

Comanda SELECT are formatul general:

SELECT [DISTINCT] coloana1 [,coloana2]

FROM tabel_1[,tabel_2, …]

[WHERE condiții]

[GROUP BY listă-coloane]

[HAVING condiții]

[ORDER BY listă-coloane [ASC | DESC] ]

Dintre cele 5 clauze ale comenzii SELECT numai clauza FROM este

obligatorie. Fiecare dintre clauze are la rândul ei reguli si parametri pentru construcție, făcând din SELECT cea mai complexă comandă a limbajului SQL. În frazele SELECT șirurile de caractere se pun între caractere ' (apostrof).

Pentru construirea unei comenzi SELECT se poate folosi asistentul Query Builder.

Pentru a da comanda folosind interfața grafică se selectează succesiv SQL/QUERY BUILDER/CREATE.

Figura 42

Aplicația va afișa trei panouri:

– în stânga un panou conținând tabelele cuprinse în schema curentă :

Figura 43

– în centru un panou conținând tabelele selectate:

Figura 44

– în partea de jos un panou cuprinzând câmpurile selectate si alte

specificații: Figura 45

Selectarea dintr-un singur tabel:

Comanda SQL pentru această selectare va fi:

select "ELEVI"."NUME" as "NUME",

"ELEVI"."PRENUME" as "PRENUME",

"ELEVI"."NUMETATA" as "NUMETATA",

"ELEVI"."NUMEMAMA" as "NUMEMAMA",

"ELEVI"."ADRESA" as "ADRESA",

"ELEVI"."DATANASTERII" as

"DATANASTERII" from "ELEVI" "ELEVI" order by ELEVI.COD_ELEV ASC

Figura 46

Selectarea din mai multe tabele:

Principial o bază de date relațională presupune repartizarea datelor în mai multe tabele. Asa cum s-a văzut deja, acest mod de stocare permite eliminarea informațiilor redondante. Pentru a găsi articolele dintr-un tabel legate de o înregistrare din alt tabel trebuie însă indicată în frazele SELECT condiția de legătură dintre cele două tabele.

Figura 47

Comanda SQL pentru această selectare va fi:

select "ELEVI"."NUME" as "NUME",

"ELEVI"."PRENUME" as "PRENUME",

"CLASA"."CLASA" as "CLASA",

"CLASA"."PROFIL" as "PROFIL"

from "ELEVI" "ELEVI",

"CLASA" "CLASA"

where "CLASA"."COD_CLASA"="ELEVI"."COD_CLASA"

order by ELEVI.COD_ELEV ASC

3.4.4. Comanda INSERT

Comanda INSERT adaugă un rând într-un tabel existent.

Exemplu:

INSERT INTO Clasa (Cod_clasa,Clasa,Profil) VALUES(9,

'IX.E.','agroturism')

Lista de câmpuri de după numele tabelei poate fi omisă dacă toate câmpurile primesc valori, iar acestea sunt scrise în ordinea definită la creare (în care ele apar în capul de tabel). Dacă un câmp nu primește valoare, el va primi implicit valoarea NULL, dacă la creare, prin modul de declarare a câmpului, introducerea unei astfel de valori este autorizată.

3.4.5. Comanda DELETE

Comanda DELETE suprimă una sau mai multe înregistrări dintr-un fișier. Ca și în cazul comenzii SELECT, pentru definirea unui set de înregistrări, care vor fi șterse, se utilizează clauza WHERE.

Exemple:

DELETE FROM Elevi WHERE Cod_elev=7

DELETE FROM Clasa

Ultima comandă suprimă toate înregistrările din tabelul Clasa.

3.4.6. Comanda UPDATE

Comanda UPDATE permite modificarea unei înregistrări sau a unui set de înregistrări. Pentru precizarea setului de înregistrări afectate se folosește clauza WHERE.

4. Oracle JDBC. Generalități

Pentru scrierea aplicațiilor, care accesează serverul Oracle XE o soluție bună este limbajul Java. De altfel firma Oracle Co. pune la dispoziția utilizatorilor mediul JDeveloper care posedă multiple facilități în acest sens. În cele ce urmează se va folosi mediul de programare Netbeans.

JDBC (Java DataBase Connectivity) este o colecție de clase care permite unei aplicații client scrisă în Java să acceseze un server de baze de date relaționale.

Folosind aceste clase, o aplicație poate să se conecteze la serverul de baze de date, poate trimite comenzi SQL si poate prelucra rezultatele furnizate de server ca urmare a executării acțiunilor comandate. Spre deosebire de ODBC (Open DataBase Connectivity – colecție de proceduri scrise în C și dependente de sistemul de operare), colecția de clase conținute în JDBC este scrisă în Java, fiind astfel realizată independența față de sistemul de operare.

Fișierele sursă, care folosesc clase din JDBC, trebuie să includă pachetul java.sql. Pentru fiecare server de baze de date există implementări specifice ale JDBC.

Astfel în cazul accesării serverului Oracle XE proiectului aplicației client trebuie să i se adauge una dintre arhivele .jar. existente în directorul [ORACLE_HOME]\jdbc\lib.

Dacă instalarea serverului Oracle XE s-a făcut în C:, atunci [ORACLE_HOME] este:

În proiectul meu am fost folosit arhiva ojdbc14_g.jar.

Figura 48

4.1. Principalele clase din JDBC

Pentru realizarea unei aplicații, care accesează un server de baze de date JDBC, se definește o serie de clase, cele mai utilizate fiind Connection, Statement si ResultSet.

4.1.1. Clasa Connection

Pentru a accesa serverul Oracle XE, clasa principală a aplicațiilor care vor fi realizate va conține un obiect din clasa Connection. Crearea sa va fi sistematic realizată, folosind secvența de cod următoare:

try {

OracleDataSource ods = new OracleDataSource();

ods.setURL("jdbc:oracle:thin:Judit/Judit@localhost:1521/XE");

cnx = ods.getConnection();

System.out.println("Conectare Ok");

Statement comanda = cnx.createStatement();

ResultSet rezultat = comanda.executeQuery( "select * from religie");

while (rezultat.next()) {

System.out.println( rezultat.getString("religie"));

}

comanda.close();

} catch ( SQLException sqlException ) {

System.out.println("Conectare imposibila.");

System.exit( 1 );

}

initComponents();

Șirul de caractere subliniat conține schema (judit), parola (judit), IP-ul serverului pe care rulează Oracle XE (localhost) și portul pe care se va realiza conectarea (1521).

Înaintea încheierii aplicației este necesară închiderea conexiunii prin apelul metodei close() a acesteia:

cnx.close();

4.1.2. Clasa Statement

Pentru a trimite comenzi SQL individuale serverului de baze de date este necesară crearea unui obiect din clasa Statement. Crearea obiectului se realizează prin apelul metodei createStatement() a clasei Connection :

Statement stmt1 = cnx.createStatement() ;

sau

Statement stmt2 = cnx.createStatement(tip, acces) ;

Dacă va fi folosit pentru trimiterea de comenzi SQL select, obiectul stmt1 va permite crearea unor mulțimi de selecție care vor putea fi parcurse doar dinspre primul element spre ultimul, nu și în sens invers. Dacă se dorește crearea ulterioară a unor mulțimi de selecție care pot fi parcurse în ambele sensuri se va utiliza varianta metodei createStatement() cu doi parametri.

Primul parametru, tip, va avea una dintre valorile următoare:

ResultSet.TYPE_FORWARD_ONLY, care indică faptul că mulțimea de selecție creată ulterior va putea fi parcursă doar înainte.

ResultSet.TYPE_SCROLL_INSENSITIVE, care permite realizarea unei mulțimi de selecție care va putea fi parcursă în ambele sensuri dar nu va reflecta modificările operate de alți utilizatori pe tabelele folosite la interogare.

Al doilea parametru, acces, poate lua valorile:

ResultSet.CONCUR_READ_ONLY semnificând faptul că mulțimile de selecție care vor fi realizate nu vor putea fi folosite la actualizarea datelor din tabele (nu se vor putea folosi la trimiterea de comenzi update) sau

ResultSet.CONCUR_UPDATABLE care indică faptul că mulțimile de selecție realizate ulterior folosind stmt2 vor putea servi la actualizarea datelor din tabelele folosite la interogare (corectare, inserare de noi linii).

După crearea unui obiect din clasa Statement acesta va putea fi folosit pentru a apela metoda executeQuery() (pentru a trimite serverului comenzi SELECT) sau metoda executeUpdate() (pentru a trimite serverului comenzi CREATE, UPDATE, INSERT sau DELETE).

Metoda executeQuery() returnează o mulțime de selecție în timp ce metoda executeUpdate() returnează un număr întreg reprezentând numărul

înregistrărilor afectate de comanda SQL dată.

După încheierea folosirii sale, obiectul Statement trebuie suprimat prin apelul metodei close().

stmt.close();

În proiect am folosit apelul:

Statement comanda = cnx.createStatement();

4.1.3. Clasa ResultSet

Un obiect din clasa ResultSet conține o mulțime de selecție furnizată de serverul de baze de date ca urmare a executării unei comenzi de interogare (SELECT).

Pentru parcurgerea liniilor mulțimii de selecție un ResultSet integrează un cursor, care indică linia curentă a mulțimii. Inițial, după executarea interogării, cursorul este poziționat înaintea primei linii. Pentru a avansa pe o nouă linie se folosește metoda next(). Deoarece metoda next() returnează null la terminarea liniilor mulțimii de selecție, aceasta permite scrierea ușoară a unui ciclu de parcurgere a liniilor mulțimii de selecție.

try {

Statement stmt = cnx.createStatement();

ResultSet rezultat = stmt.executeQuery( "SELECT * FROM Elevi order by nume"

);

while ( rezultat.next() ) {

System.out.println( rezultat.getString("nume") );

}

stmt.close();

} catch (SQLException ex) {}

Un obiect din clasa ResultSet este inițializat prin executarea metodei

executeQuery() a clasei Statement. Dacă crearea s-a făcut ca mai sus, mulțimea de selecție poate fi parcursă doar înainte, apelând metoda .next().

Dacă mulțimea de selecție trebuie să fie parcursă în ambele sensuri se va folosi varianta cu parametri a metodei createStatement():

Statement stmt = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY );

După crearea unei mulțimi de selecție care poate fi parcursă în ambele sensuri, aceasta va putea fi parcursă folosind metodele:

first() pentru trecerea pe prima linie,

last() pentru trecere pe ultima linie,

next() pentru trecere pe următoarea linie sau

previous() pentru trecerea pe linia precedentă

absolute(nr) pentru plasarea cursorului pe linia nr a mulțimii de selecție.

Valoarea unui câmp al liniei curente din mulțimea de selecție se obține apelând una dintre metodele JDBC get*() din tabelul de mai jos. O metodă get*() poate avea ca argument fie un număr întreg care specifică a câta valoare trebuie extrasă, fie un șir de caractere, conținând numele câmpului. La specificarea numelui câmpului nu contează cu ce caractere este scris – litere mici sau majuscule. Preluarea valorilor câmpurilor liniei curente din mulțimea de selecție se realizează apelând metoda get*() adecvată, conform tabelului prezentat în continuare.

La scrierea metodelor get*() având argument numeric se va ține

cont de faptul că numerotarea câmpurilor liniei curente din mulțimea de selecție începe cu valoarea 1.

5. Mediul de programare Netbeans

Java este un limbaj de programare orientat pe obiecte asemănător limbajului C++. El a fost dezvoltat de firma Sun, prima semnalare a apariției sale datând din 1991. Limbajul a fost dezvoltat în cadrul unui proiect denumit Green, obiectivul acestuia fiind dezvoltarea unui limbaj pentru programarea echipamentelor electrice și electronice "inteligente" și comunicarea cu acestea. Punctul de pornire a fost limbajul C++, dar Java aduce acestuia un volum semnificativ de modificări, mai ales în sensul simplificării, creșterii rigurozității și a portabilității. Conducătorul proiectului, Green James Gosling, este considerat părintele limbajului Java. Noului limbaj i s-a dat la început numele Oak (engl. stejar) dar acesta a fost revendicat de o altă firmă și realizatorii l-au schimbat în Java, aluzie la sursa băuturii favorite a membrilor echipei – cafeaua.

Caracteristicile noului limbaj au intrat însă și în atenția firmelor preocupate de dezvoltarea Internetului. A realiza aplicații având un cod redus, ușor deci de transportat prin rețele și care pot fi rulate pe diferite tipuri de calculatoare și de sisteme de operare reprezenta o problemă dificilă. Dar nu și pentru echipa care a creat Java, care în 1994 a pus la punct o aplicație destinată navigării prin Internet (denumită HotJava) care integra suportul necesar executării în pagina de web a unor mici aplicații, denumite applet-uri. A mai trebuit un pic de sprijin din partea firmei Netscape, al cărui program de navigare în Internet era deja larg răspândit si

succesul imediat al limbajului Java a fost asigurat.

5.1. Tratarea programelor scrise în Java

Un program scris în limbajul Java este supus unei compilări în urma căreia se obține un cod intermediar (cod de octeți), care este apoi interpretat și executat de o aplicație specializată, care poate fi asimilată unui procesor virtual. Această aplicație poartă denumirea de "masină virtuală java" (eng. Java Virtual Machine, JVM denumită mai nou JRE – Java Runtime Environment). Codul rezultat în urma compilării poate fi transferat și apoi executat pe orice calculator, pe care există instalat JVM. Site-ul firmei Sun oferă spre descărcare, gratuit, aplicația JVM pentru toate sistemele de operare majore.

5.2. Netbeans si JDK – instalare și configurare

JDK (Java Development Kit) este un ansamblu de instrumente software destinat dezvoltării de aplicații în Java, oferit de firma Sun Microsystems. Pachetul poate fi descărcat de pe site-ul firmei:

http://java.sun.com/javase/downloads/index.jsp.

Site-ul firmei Sun oferă spre descărcare și versiuni de JRE (Java Runtime Environment, procesorul virtual Java necesar rulării aplicațiilor) dar, pentru dezvoltarea de aplicații cu NetBeans trebuie descărcat și instalat JDK. De altfel în kitul conținând JDK există și JRE. Mediul integrat de dezvoltare NetBeans poate fi descărcat de la adresa:

http://www.netbeans.info/downloads/index.php.

El se instalează în mod obligatoriu după instalarea JDK. Mediul face apel de altfel la instrumentele de dezvoltare de aplicații integrate în JDK.

6. Realizarea interfeței aplicației mele în Netbeans

La crearea unui nou proiect, NetBeans va crea automat un director în care va plasa componentele acestuia. D:\projekt oracle1\director

Pași necesari realizării unui proiect sunt următorii:

După pornirea mediului se selectează File / New project:

Figura 49

În fereastra New Project se selectează categoria (General) și tipul

proiectului (Java Application). Se apasă Next.

Figura 50

În noua ferestră se indică numele proiectului (Director), directorul în care va fi creat (C:\\elevi) și se deselectează caseta de validare Create Main Class, deoarece clasa principală va fi creată ulterior. Aplicația care trebuie realizată având interfață grafică, este mai simplu să se creeze ulterior o clasă, derivată din clasa Jframe, pe care mediul de programare o va creea ca principală (va conține main()).

Figura 51

Se va apăsa butonul Finish.

Se adaugă proiectului arhiva ojdbc14_g.jar:

Se selectează directorul Libraries click dreapta și se va apăsa Add Jar/Folder.

Figura 52

Pașii realizați asigură crearea pe disc a unei structuri de directoare care vor conține fișierele proiectului. Proiectul nu conține încă nici o clasă, în arborele acestuia figurând intrarea Source Packages cu o entitate, <default package>.

6.1. Crearea ferestrei principale

O aplicație care accesează un server de baze de date are caracteristicile unei aplicații Windovs obișnuite, respectiv afișează o fereastră principală, care conține o bară cu meniuri derulante, o bară cu instrumente pentru comenzi rapide și o zonă grafică de afișare.

Figura 53

Crearea interfeței aplicației va începe cu crearea unei clasei principale. În aplicațiile scrise în Java aceasta poartă numele proiectului și conține metoda statică main(). Clasa principală va fi declarată ca derivată din clasa JFrame. O instanță a clasei principale, creată în cadrul metodei statice main(), va putea atunci servi drept container principal al aplicației (Window frame în figură).

Pentru crearea acestei clase se procedează astfel: în meniul File se selectează New File :

Figura 54

Figura 55

În fereastra care se afișează se introduce numele noii clase. Fiind clasa principală a aplicației, ea va purta numele proiectului, Elevi. În fereastra New JFrame Form este bine să se indice de asemenea numele unui nou pachet, care va înlocui pachetul implicit și va conține fișierele sursă ale aplicației.

Figura 56

Figura 57

Pentru a da un titlu ferestrei se va modifica proprietatea title:

Figura 58

Prin demersuri oarecum asemănătoare vor fi adăugate ferestrele de dialog, care vor conține formularele și rapoartele necesare exploatării bazei de date Oracle XE.

Pentru a impune poziția în care se va afișa fereastra creată, se va selecta fereastra și în lista de proprietăți, tabul Events, se va selecta proprietatea windowActivated.

Mediul de dezvoltare va genera metoda formWindowActivated() care va fi modificată astfel:

În această etapă se poate testa aplicația precum și posibilitatea conectării la serverul Oracle XE. Pentru aceasta se va proceda astfel:

Se inserează la începutul fișierului elevi.java liniile:

import java.sql.*;

import oracle.jdbc.*;

import oracle.jdbc.pool.OracleDataSource;

Acestea vor fi inserate sistematic în toate fișierele aplicației în care se realizează accesarea serverului de baze de date.

Se adaugă clasei principale variabila cnx de tip Connection:

Figura 59

Se completează constructorului clasei Evidelevi:

public class extends javax.swing.JFrame {

/** Creates new form elevi */

public elevi() {

// Creez conexiunea cu serverul

try {

OracleDataSource ods = new OracleDataSource();

ods.setURL("jdbc:oracle:thin:judit/judit@localhost:1521/XE");

cnx = ods.getConnection();

System.out.println("Conectare Ok");

} catch ( SQLException sqlException ) {

System.out.println("Conectare imposibila.");

System.exit( 1 );

}

// Se continua cu initializarea controalelor

initComponents();

}

Liniile evidențiate realizează inițializarea variabilei cnx. Aceasta va fi folosită în continuare pentru accesul la baza de date. În continuare se poate lansa aplicația în execuție. Dacă nu sunt incidente legate de conectarea la serverul de baze de date, aplicația va afișa fereastra principală (goală!), iar în regiunea mediului de programare afectată consolei va apărea șirul de caractere "Conectare Ok".

Adaug constructorului clasei principale două obiecte, comanda, de tip Statement și rezultat, de tip ResultSet.

Figura 60

Adăugând codurile corespunzătoare vom obține:

try {

OracleDataSource ods = new OracleDataSource();

ods.setURL("jdbc:oracle:thin:Judit/Judit@localhost:1521/XE");

cnx = ods.getConnection();

System.out.println("Conectare Ok");

Statement comanda = cnx.createStatement();

ResultSet rezultat = comanda.executeQuery( "select * from religie");

while (rezultat.next()) {

System.out.println( rezultat.getString("religie"));

}

comanda.close();

} catch ( SQLException sqlException ) {

System.out.println("Conectare imposibila.");

System.exit( 1 );

}

initComponents();

}

Afișez în fereastra Output rezultatul:

Figura 61

6.2. Interfața aplicației. Meniu, submeniuri, controale

Accesul la datele conținute într-o bază de date se realizează prin formulare și rapoarte.

Formularele asigură următoarele funcții principale:

afișează date individuale;

permit modificarea datelor afisate;

permit suprimarea articolelor ;

permit adăugarea unui articol.

Rapoartele prezintă într-un format impus date conținute în baza de date. În unele cazuri formatul în care datele trebuie prezentate este definit prin lege. Aplicația trebuie să asigure afișarea pe ecran și imprimarea rapoartelor.

6.2.1. Controale Windows

Formularele prin care sunt accesate datele conținute într-o bază de date pot fi destinate realizării unei funcții elementare (afișare date, modificare, adăugare etc.) sau pot realiza o funcție complexă. Un formular destinat realizării unei funcții complexe conține un mare număr de controale Windows, în anumite stări ale aplicației putându-se pune chiar problema ascunderii unora dintre ele.

O aplicație care conține formulare simple, fiecare destinat realizării unei acțiuni elementare, poate pune probleme de operare dar practica programării recomandă această abordare deoarece atât depanarea cât și întreținerea aplicațiilor astfel concepute este mai simplă.

6.2.2. JMenuBar

Inițierea diferitelor acțiuni se realizează în principal folosind meniuri derulante și butoane. Meniurile derulante vor declanșa principalele funcții ale aplicației (afișarea formularelor și rapoartelor, salvarea bazei de date, oprirea aplicației), iar butoanele vor declanșa acțiuni în interiorul formularelor.

Pentru a defini meniul unei aplicații trebuie creată o bară de meniuri (obiect aparținând clasei JMenuBar), un ansamblu de meniuri derulante (obiecte de tip JMenu) și pentru fiecare meniu derulant, un ansamblu de opțiuni (obiecte aparținând clasei JMenuItem).

Pentru a realiza o aplicație, care accesează baza de date Oracle XE, schema Elevi, se va proceda astfel:

– se adaugă proiectului bara cu meniuri derulante:

Se va selecta cu mouse-ul JMenubar și se va realiza adăugarea sa printr-un clic cu mouse-ul în fereastra aplicației.

Î

Figura 62

În continuare se va edita conținutul barei cu meniuri, folosind reprezentarea arborescentă afișată prin selectarea tabului Inspector.

se modifică numele primului meniu derulant (proprietatea text):

Selectat modificarea proprietății text

Se adaugă meniului Fișier opțiunea Iesire: Efectul selectării acesteia va fi oprirea aplicației.

Figura 63

– Se adaugă barei cu meniuri un al doilea meniu derulant și se modifică proprietatea text a noului obiect din Menu în Formulare:

Rezultat:

Figura 64

Celui de-al doilea meniu derulant i se vor adăuga în timp mai multe intrări, fiecare având rolul de a declanșa afișarea unuia dintre formularele care vor fi realizate.

În același mod va fi adăugat aplicației un al treilea meniul derulant, Rapoarte, ale cărui intrări vor fi folosite pentru a declanșa afișarea rapoartelor și al patrulea meniu derulant, Help pentru ajutor.

Figura 65

Se adaugă meniului Formulare alte trei meniuri Parcurgere, Adăugare, Operații.

Figura 66

La rândul lor se adaugă fiecărei meniu submeniuri corespunzătoare tabelelor schemei elevi.

Parcurgerea tabelelor:

Figura 67

Adăugarea tabelelor:

Figura 68

Operații între tabele:

Figura 69

Pentru a creea metoda care trebuie executată la selectarea unei opțiuni dintr-un meniu derulant se va selecta opțiunea cu un dublu clic în fereastra Inspector:

Pentru opțiunea Iesire din primul meniu derulant se va adăuga o metodă care va conține închiderea conexiunii cu serverul și va apela metoda System.exit(0) a cărui efect este oprirea imediată a aplicației.

6.3. Parcurgerea tabelelor aplicației

6.3.1. Tabelul Clasa

Adaug aplicației un formular care permite navigarea în tabelul Clasa. Pentru navigare se vor folosi două butoane (Inainte respectiv Inapoi).

În NetBeans soluția rapidă pentru adăugarea unei ferestre de dialog constă în selectarea succesivă cu mouse-ul a butonului JDialog din fereastra Palette si a ferestrei principale (sau, mai general, fereastra aplicației în cadrul căreia se va afisa noua fereatră).

Figura 70

Pentru a edita fereastra de dialog se selectează cu un dublu clic în fereastra Inspector identificatorul acesteia:

Figura 71

Se adaugă ferestrei de dialog 2 controale de tip JLabel ale căror proprietate text se schimbă în Clasele din baza de date, Clasa, un control de tip JTextField ale cărui nume de variabilă va fi numeclasa și 3 controale

de tip JButton ale căror text se schimbă în Inapoi, Inainte și Iesire, ce vor permite parcurgerea tabelului Clasa înainte și înapoi, precum și ieșirea din formular.

Figura 72

Schimb numele controalelor JButton (clic dreapta pe control în fereastra Inspector -> Change Variable Name) astfel va fi clasaprec, clasaurm și iesire :

Figura 73

Adaug în evenimentul windowActivated ( în fereastra Inspector : Form Evidelevi ->Other Components -> clasa) metoda clasaWindowActivated pentru a rula un cod la deschiderea formularului:

– inițializarea celor două obiecte (rezultat și comanda);

– executarea unei comenzi SQL;

– afișarea rezultatului comenzii în controlul de tip textbox;

try {

comanda = cnx.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_UPDATABLE);

rezultat = comanda.executeQuery("SELECT * FROM clasa order by cod_clasa asc");

if (rezultat.next()) {

String nm = rezultat.getString("clasa");

numeclasa.setText(nm);

}

} catch ( SQLException sqlException ) {

System.out.println("Conectare imposibila.");

System.exit( 1 );

}

}

La închiderea ferestrei este necesară apelarea metodelor close() pentru obiectele rezultat și comanda. Pentru a adăuga aplicației o metodă care se apelează la închiderea formularului Clasa se procedează ca mai sus, evenimentul selectat fiind windowDeactivated:

try {

rezultat.close();

comanda.close();

} catch (SQLException ex) {

ex.printStackTrace();

}

}

Adaug intrării pclasa ( = parcurgere clasa) evenimentului actionPerformed codul:

clasa.setLocation(120,170);

clasa.setVisible(true);

clasa.pack();

}

Adaug codul necesar navigării printre înregistrările tabelului Clasa:

– pentru butonul clasaprec:

try {

if(!rezultat.isFirst())

{

clasaurm.setEnabled(true);

if (rezultat.previous())

{

String nm = rezultat.getString("clasa");

numeclasa.setText(nm);

}

} else {

clasaprec.setEnabled(false);

}

} catch (SQLException esq) {}

}

– pentru butonul clasaurm:

try {

if(!rezultat.isLast())

{

clasaprec.setEnabled(true);

if (rezultat.next())

{

String nm = rezultat.getString("clasa");

numeclasa.setText(nm);

}

} else {

clasaurm.setEnabled(false);

}

} catch (SQLException esq) {}

}

Adaug codul necesar închiderii formularului Clasa:

clasa.setVisible(false);

Rulez programul și va arăta:

Figura 74

În mod asemănător se va realiza parcurgerea următoarelor tabele:

6.3.2. Tabelul Limbaincep

Figura 75

Rulez programul și va arăta:

Figura 76

6.3.3. Tabelul Limbaavans

Figura 77

Rulez programul:

Figura 78

6.3.4. Tabelul Religie

Figura 79

Rulez programul:

Figura 80

6.3.5. Tabelul Elevi

Figura 81

Rulez programul:

Figura 82

6.3.6. Tabelul Matricol

Figura 83

Rulez programul:

Figura 84

6.3.7. Tabelul Bazadate

Figura 85

Rulez programul:

Figura 86

6.4. Adăugarea datelor în baza de date

6.4.1. Tabelul Clasa

Pentru adăugarea datelor in tabelul Clasa trebuie să introducem un obiect de tip sequence (secvență), necesar introducerii codului clasei.

Declararea în Oracle XE a unui obiect de tip sequence se realizează selectând Object Browser /Create / Sequence :

Figura 87

În noua fereastră se va defini numele obiectului (autoclasa), valoarea de start 1 și incremental 1.

Figura 88

Evidențierea funcționării noului obiect se poate realiza tastând o comandă SQL SELECT:

Figura 89

Pentru ca valoarea secvenței să fie corectă, aceasta se rulează până la

valoarea curentă. Funcția NEXTVAL incrementează secvența cu o unitate, iar funcția CURRVAL returnează valoarea curentă a acesteia.

Creez un formular pentru adăugarea claselor în baza de date, astfel:

selectez succesiv fereastra principală și controlul JDialog din fereastra Palette;

selectez cu dublu clic intrarea în arborele din fereastra Inspector identificatorul noii ferestre;

adaug cele trei controale de tip JLabel (pentru titlu și etichetele formularului), două controale de tip JTextField și cele două controale de tip JButton;

schimb textele corespunzătoare acestor controale;

schimb numele controalelor (clic dreapta pe control în fereastra Inspector -> Change Variable Name) astfel:

Figura 90

Adaug meniului aplicației clasa o nouă intrare în meniul Formulare, Adăugare – de tip JMenu, cu o opțiune, aclasa (JMenuItem).

Atașez opțiunii din meniu adâugate o funcție de tratare (actionPerformed) conținând secvența de cod:

adaugclasa.setLocation(120,170);

adaugclasa.setVisible(true);

adaugclasa.pack();

Deoarece în comanda SQL insert, care va fi construită în cadrul funcției apelate, la acționarea butonului Introducere șirurile de caractere sunt plasate între apostroafe, este convenabilă adăugarea în cadrul clasei principale a unei metode, care să returneze un șir format prin încardarea între apostroafe a șirului primit ca argument.

Metoda adăugată a fost denumită apostrof() și are următoarea definiție:

public String apostrof(String p)

{

String c = "'" + p + "'";

return c;

}

Codul necesar preluării conținuturilor din controale și apoi scrierii în baza de date este:

try {

String clasa, profil;

clasa= numeclasa1.getText();

profil= prof.getText();

String frazaSQL = "INSERT into clasa VALUES (autoclasa.NEXTVAL";

frazaSQL += "," + apostrof(clasa);

frazaSQL += "," + apostrof(profil)+ ")";

Statement stm = cnx.createStatement();

stm.executeUpdate(frazaSQL);

stm.close();

} catch (SQLException ex) {

ex.printStackTrace();

}

numeclasa1.setText("");

prof.setText("");

}

Adaug codul necesar închiderii formularului aclasa:

adaugclasa.setVisible(false);

Rulez programul:

Figura 91

Asemănător se procedează și la adăugarea datelor în tabelele Limbaincep, Limbaavans, Religie:

6.4.2. Tabelul Limbaincep

Figura 92

Rulez programul:

Figura 93

6.4.3. Tabelul Limbaavans

Figura 94

Rulez programul:

Figura 95

6.4.4. Tabelul Religie

Figura 96

Rulez programul:

Figura 97

În cazul adăugării datelor în tabelele Elevi, Matricol, Bazadate se procedează altfel, din cauza folosirii controalelor JComboBox.

6.4.5. Tabelul Elevi. Controlul JComboBox

Controlul de tip JComboBox permite selectarea unei valori dintr-o listă predefinită. Definirea listei se realizează de obicei în etapa de proiectare a aplicației, conținutul acesteia fiind accesibil prin intermediul proprietății model, Lista poate fi construită și editată și dinamic, în timpul execuției, folosind metodele:

În aplicațiile destinate realizării interfeței cu baze de date prezintă un mare interes popularea listei prin preluarea valorilor dintr-o mulțime de selecție (exemplu în adăugarea datelor în tabelul Elevi).

Pentru a însera o funcție de tratare a evenimentului produs la selectarea unui element folosind un control de tip JComboBox se procedează ca și în cazurile deja prezentate, respectiv se selectează controlul cu butonul drept al mouse-ului și în meniul contextual se selectează Events / Action:

Figura 98

Creez un formular pentru adăugarea elevilor în baza de date:

Figura 99

Adaug meniului aplicației evidelevi o nouă intrare în meniul Formulare, Adăugare – de tip JMenu, cu o optiune, aelev (JMenuItem).

Atașez opțiunii din meniu adâugate o funcție de tratare (actionPerformed) conținând secvența de cod:

adaugelev.setLocation(120,170);

adaugelev.setVisible(true);

adaugelev.pack();

Pentru a pregăti formularul în vederea culegerii de date trebuie populată lista controlului oszt. Pentru aceasta vor fi adăugate clasei principale două noi obiecte, adaug de tip Statement și rez_adaug de tip ResultSet.

public Statement adaug;

public ResultSet rez_adaug;

Noile variabile vor fi inițializate în metodele asociate evenimentelor windowActivated și windowDeactivated.

– adaugelev windowActivated:

try {

adaug = cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

rez_adaug = adaug.executeQuery ("SELECT * FROM clasa order by clasa");

oszt.removeAllItems();

while (rez_adaug.next()){

String nm = rez_adaug.getString("clasa");

oszt.addItem(nm);

}

} catch (SQLException sqlException){

System.out.println("Conectare imposibila.");

System.exit(1);

}

– adaugelev windowDeactivated:

try{

rez_adaug.close();

adaug.close();

} catch (SQLException ex){

ex.printStackTrace();

}

Metoda introd6ActionPerformed() apelată la apăsarea butonului Introducere este următoarea:

try {

String nume, prenume, tata, mama, adresa, nastere ;

nume = numeelev.getText();

prenume = prenumeelev.getText();

int poz = oszt.getSelectedIndex();

rez_adaug.absolute(poz+1);

codclasa = rez_adaug.getInt("cod_clasa");

tata = numetata.getText();

mama = numemama.getText();

adresa = adr.getText();

nastere=datanastere.getText();

String frazaSQL = "INSERT into elevi VALUES (autoelev.NEXTVAL";

frazaSQL += "," + apostrof(nume);

frazaSQL += "," + apostrof(prenume);

frazaSQL += "," + codclasa;

frazaSQL += "," + apostrof(tata);

frazaSQL += "," + apostrof(mama);

frazaSQL += "," + apostrof(adresa);

frazaSQL += "," + apostrof(nastere)+ ")";

Statement stm = cnx.createStatement();

System.out.println(frazaSQL);

stm.executeUpdate(frazaSQL);

stm.close();

numeelev.setText("");

prenumeelev.setText("");

numetata.setText("");

numemama.setText("");

adr.setText("");

datanastere.setText("");

} catch (SQLException ex) {

ex.printStackTrace();

}

Adaug codul necesar închiderii formularului:

adaugelev.setVisible(false);

Rulez programul:

Figura 100

6.4.6. Tabelul Matricol

Creez un formular pentru adăugarea unui număr matricol în baza de date:

Figura 101

Adaug meniului aplicației o nouă intrare în meniul Formulare, Adăugare – de tip JMenu, cu o optiune, amatricol (JMenuItem).

Atașez opțiunii din meniu adâugate o funcție de tratare (actionPerformed) conținând secvența de cod:

adaugmatricol.setLocation(120,170);

adaugmatricol.setVisible(true);

adaugmatricol.pack();

Pentru a pregăti formularul în vederea culegerii de date trebuie populată lista controalelor . Pentru aceasta vor fi adăugate clasei principale patru noi obiecte, avol și anume de tip Statement, rezvol și reznume de tip ResultSet.

public Statement avol;

public ResultSet rezvol;

public Statement anume;

public ResultSet reznume;

Noile variabile vor fi inițializate în metodele asociate evenimentelor windowActivated și windowDeactivated.

– adaugmatricolWindowActivated

try {

avol = cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

rezvol = avol.executeQuery ("SELECT * FROM matricol order by nr_matr");

vol.removeAllItems();

while (rezvol.next()){

String nm = rezvol.getString("volum");

vol.addItem(nm);

}

anume = cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

reznume = anume.executeQuery ("SELECT * FROM elevi order by cod_elev");

celev.removeAllItems();

while (reznume.next()){

String nm = reznume.getString("nume") +" "+ reznume.getString("prenume");

celev.addItem(nm);

}

} catch (SQLException sqlException){

System.out.println("Conectare imposibila.");

System.exit(1);

}

– adaugmatricolWindowDeactivated:

try{

rezvol.close();

avol.close();

reznume.close();

anume.close();

} catch (SQLException ex){

ex.printStackTrace();

}

Selectez codul pentru volum volActionPerformed:

try{

int linie = vol.getSelectedIndex();

if (linie>=0) {

rezvol.absolute(linie+1);

cvol = rezvol.getInt("volum");

}

} catch (SQLException ex) {

ex.printStackTrace();

}

Selectez codul elevului celevActionPerformed:

try{

int linie = celev.getSelectedIndex();

if (linie>=0) {

reznume.absolute(linie+1);

cnume = reznume.getInt("cod_elev");

}

} catch (SQLException ex) {

ex.printStackTrace();

}

Metoda introd7ActionPerformed() apelată la apăsarea butonului Introducere este următoarea:

try {

int poz = vol.getSelectedIndex();

rezvol.absolute(poz+1);

cvol = rezvol.getInt("volum");

int poz1 = celev.getSelectedIndex();

reznume.absolute(poz1+1);

cnume = reznume.getInt("cod_elev");

String frazaSQL = "INSERT into matricol VALUES (automatricol.NEXTVAL";

frazaSQL += "," + cvol;

frazaSQL += "," + cnume + ")";

Statement stm = cnx.createStatement();

System.out.println(frazaSQL);

stm.executeUpdate(frazaSQL);

stm.close();

} catch (SQLException ex) {

ex.printStackTrace();

}

Adaug codul necesar închiderii formularului:

adaugmatricol.setVisible(false);

Rulez programul:

Figura 102

6.4.7. Tabelul Bazadate

Creez un formular pentru adăugarea datelor în baza de date:

Figura 103

Adaug meniului aplicației o nouă intrare în meniul Formulare, Adăugare – de tip JMenu, cu o optiune, abaza (JMenuItem).

Atașez opțiunii din meniu adâugate o funcție de tratare (actionPerformed) conținând secvența de cod:

adaugbaza.setLocation(120,170);

adaugbaza.setVisible(true);

adaugbaza.pack();

Pentru a pregăti formularul în vederea culegerii de date trebuie populată lista controalelor . Pentru aceasta vor fi adăugate clasei principale zece noi obiecte: anume1, ali, ala, adrel, amat de tip Statement, reznume1, rezli, rezla, rezrel, rezmat de tip ResultSet.

public Statement anume1;

public ResultSet reznume1;

public Statement ali;

public ResultSet rezli;

public Statement ala;

public ResultSet rezla;

public Statement adrel;

public ResultSet rezrel;

public Statement amat;

public ResultSet rezmat;

Noile variabile vor fi inițializate în metodele asociate evenimentelor windowActivated și windowDeactivated.

– adaugbazaWindowActivated

try {

anume1 = cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

reznume1 = anume1.executeQuery ("SELECT * FROM elevi order by cod_elev");

celev1.removeAllItems();

while (reznume1.next()){

String nm = reznume1.getString("nume") +" "+ reznume1.getString("prenume");

celev1.addItem(nm);

}

ali = cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

rezli = ali.executeQuery ("SELECT * FROM limbaincep order by cod_li");

cli.removeAllItems();

while (rezli.next()){

String nm = rezli.getString("limba1");

cli.addItem(nm);

}

ala = cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

rezla = ala.executeQuery ("SELECT * FROM limbaavans order by cod_la");

cla.removeAllItems();

while (rezla.next()){

String nm = rezla.getString("limba2");

cla.addItem(nm);

}

adrel = cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

rezrel = adrel.executeQuery ("SELECT * FROM religie order by cod_rel");

crel.removeAllItems();

while (rezrel.next()){

String nm = rezrel.getString("religie");

crel.addItem(nm);

}

amat = cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

rezmat = amat.executeQuery ("SELECT * FROM matricol order by nr_matr");

cmat.removeAllItems();

while (rezmat.next()){

String nm = rezmat.getString("nr_matr");

cmat.addItem(nm);

}

} catch (SQLException sqlException){

System.out.println("Conectare imposibila.");

System.exit(1);

}

– adaugbazaWindowDeactivated

try{

reznume1.close();

anume1.close();

rezli.close();

ali.close();

rezla.close();

ala.close();

rezrel.close();

adrel.close();

rezmat.close();

amat.close();

} catch (SQLException ex){

ex.printStackTrace();

}

Selectez codul elevului celev1ActionPerformed:

try{

int linie = celev1.getSelectedIndex();

if (linie>=0) {

reznume1.absolute(linie+1);

codnume = reznume1.getInt("cod_elev");

}

} catch (SQLException ex) {

ex.printStackTrace();

}

Selectez codul limbii începatoare cliActionPerformed:

try{

int linie = cli.getSelectedIndex();

if (linie>=0) {

rezli.absolute(linie+1);

codli = rezli.getInt("cod_li");

}

} catch (SQLException ex) {

ex.printStackTrace();

}

Selectez codul limbii avansate claActionPerformed:

try{

int linie = cla.getSelectedIndex();

if (linie>=0) {

rezla.absolute(linie+1);

codla = rezla.getInt("cod_la");

}

} catch (SQLException ex) {

ex.printStackTrace();

}

Selectez codul religiei crelActionPerformed:

try{

int linie = crel.getSelectedIndex();

if (linie>=0) {

rezrel.absolute(linie+1);

codrel = rezrel.getInt("cod_rel");

}

} catch (SQLException ex) {

ex.printStackTrace();

}

Selectez codul numărului matricol cmatActionPerformed:

ry{

int linie = cmat.getSelectedIndex();

if (linie>=0) {

rezmat.absolute(linie+1);

codmat = rezmat.getInt("nr_matr");

}

} catch (SQLException ex) {

ex.printStackTrace();

}

Metoda introd8ActionPerformed() apelată la apăsarea butonului Introducere este următoarea:

try {

String frazaSQL = "INSERT into bazadate VALUES (autobaza.NEXTVAL";

frazaSQL += "," + codnume;

frazaSQL += "," + codli;

frazaSQL += "," + codla;

frazaSQL += "," + codrel;

frazaSQL += "," + codmat + ")";

Statement stm = cnx.createStatement();

System.out.println(frazaSQL);

stm.executeUpdate(frazaSQL);

stm.close();

} catch (SQLException ex) {

ex.printStackTrace();

}

Adaug codul necesar închiderii formularului:

adaugbaza.setVisible(false);

Rulez programul:

Figura 104

6.5. Crearea operațiilor în baza de date.Controlul JTable

Obiectele din clasa JTable sunt controale Windows destinate afișării datelor sub formă tabelară. Deoarece comanda SQL SELECT destinată interogării serverului de baze de date furnizează datele în formă tabelară, este evident că interfața grafică a aplicației va conține astfel de controale. Controlul de tip JTable este însă unul deosebit de complex. Pentru păstrarea claselor și a interfeșelor necesare construirii și utilizării acestor controale, în Swing există un un pachet special, javax.swing.table.

Ca și în cazul celorlalte controale Windows, JTable are la bază arhitectura MVC (Model – View – Controller).

View este componenta destinată afisării datelor si este integral implementată în clasa JTable, deci nu necesită atenție.

Model este practic un obiect care va conține datele de reprezentat. El va aparține unei clase a aplicației derivată din clasa AbstractTableModel. Constructorul acestei clase realizează memorarea într-un tablou bidimensional a datelor care vor fi conținute în tabel.

Controller este ansamblul de metode implementate pentru manipularea datelor conținute în tabel și tratarea evenimentelor utilizator. Metodele aparțin interfeței TableModel pe care clasa AbstractTableModel o implementează.

6.5.1. Formular pentru vizualizarea elevilor dintr-o clasă

Pentru funcționarea corectă a formularului trebuie să procedez astfel :

Adaug aplicației o nouă clasă, TbModel derivată din AbstractTableModel

Figura 105

Deoarece după adăugarea cuvintelor extends AbstractTableModel necesare indicării derivării, declarația clasei apare ca eronată, se selectează ca în cazurile deja întâlnite Fix Imports.

Figura 106

De data aceasta evidențierea declarației clasei ca eronată nu dispare. Aceasta deoarece clasa AbstractTableModel conține câteva metode abstracte, pe care orice clasă derivată trebuie în mod obligatoriu să le implementeze. Pentru evidențierea acestora mediul NetBeans oferă următoarea cale:

Se selectează în meniul aplicației Source / Override and Implements Methods (sau se apasă Ctrl + I) pentru a se afisa fereastra Override and Implement Methods.

În fereastra Override and Implement Methods se selectează caseta

Show Abstract methods Only și se selecteză cu Ctrl apăsat toate metodele afișate :

Se selectează Ok Figura 107

NetBeans adaugă clasei TbModel cele trei metode selectate. Acestea vor trebui ulterior editate. Odată cu adăugarea clasei TbModel s-a creat fișierul TbModel.java. Aici editez codul celor trei metode astfel:

public int getColumnCount() {

return colNume.length; }

public int getRowCount() {

return dateContinute.size();

}

public Object getValueAt(int linie, int col) {

// Preiau linia rowIndex

ArrayList rand_cautat = (ArrayList) dateContinute.get(linie);

return rand_cautat.get(col);

}

Adaug noii clase metoda getColumnName() :

public String getColumnName(int column) {

return colNume[column];

}

Editez constructorul clasei TbModel astfel încât să adauge în variabila dateContinute din clasa ArrayList datele primite în momentul apelării constructorului conținute într-un obiect din clasa ResultSet.

public class TbModel extends AbstractTableModel {

private String[]colNume={"nume","prenume"};

private ArrayList dateContinute;

/** Creates a new instance of TbModel */

public TbModel(ResultSet rezultat) {

dateContinute = new ArrayList();

try{

while(rezultat.next()){

ArrayList linie = new ArrayList();

String nume = rezultat.getString("nume");

String prenume = rezultat.getString("prenume");

linie.add(nume);

linie.add(prenume);

dateContinute.add(linie);

}

} catch(Exception e){

System.out.println("Exceptie in TbModel");

}

}

După realizarea acestor completări se poate începe construirea formularului eleviclasa.

Figura 108

Figura 109

După adăugarea controlului nelevi din clasa JTable se realizează adaptările necesare pentru a-i asocia obiectul care va deține datele (model), aparținând clasei TbModel definită anterior.

Se selectează controlul nelevi (JTable) și se apasă butonul din dreptul proprietății model:

Figura 110

În fereastra care se afișează se impun următoarele:

· numărul de linii care se va afișa,

· numărul de coloane,

· titlul fiecărei coloane și

· tipul de dată afișat în fiecare coloană.

Figura 111

Pentru afișarea formularului realizat se va adăuga meniului derulant Formulare o intrare suplimentară, metoda asociată selectării acesteia realizând afișarea ferestrei eleviclasa:

eleviclasa.setLocation(120,170);

eleviclasa.setVisible(true);

eleviclasa.pack();

La deschiderea formularului trebuie rulată o secvență de cod care populează controalele clasa2 (JComboBox) și nelevi (JTable):

– eleviclasaWindowActivated

try {

comanda =

cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY);

rezultat = comanda.executeQuery("SELECT * from clasa order by cod_clasa");

clasa2.removeAllItems();

while (rezultat.next()) {

String n = rezultat.getString("clasa");

clasa2.addItem(n);

}

rezultat.first();

int codclasa = rezultat.getInt("cod_clasa");

Statement clasa_stmt = null;

ResultSet rezultat = null;

try {

clasa_stmt = cnx.createStatement();

rezultat = clasa_stmt.executeQuery("SELECT elevi.nume, elevi.prenume FROM clasa, elevi WHERE clasa.cod_clasa = elevi.cod_clasa and clasa.cod_clasa=" + String.valueOf(codclasa));

nelevi.setModel(new TbModel(rezultat));

clasa_stmt.close();

TableColumn column = null;

column = nelevi.getColumnModel().getColumn(0);

column.setPreferredWidth(100);

} catch (SQLException ex) {

ex.printStackTrace();

}

} catch (SQLException ex) {

ex.printStackTrace();

}

– eleviclasaWindowDeactivated

try {

comanda.close();

} catch (SQLException ex) {

ex.printStackTrace();

}

Atașez o metodă de tratare a evenimentului produs la selectarea unei noi catedre în controlul clasa2 (JComboBox) . În această metodă se va prelua codul clasei selectat de utilizator și se va repopula controlul nelevi (JTable).

try {

int linie = clasa2.getSelectedIndex();

if (linie>=0){

rezultat.absolute(linie+1);

int codclasa = rezultat.getInt("cod_clasa");

Statement clasa_stmt = null;

ResultSet rezultat = null;

try {

clasa_stmt = cnx.createStatement();

rezultat = clasa_stmt.executeQuery("SELECT elevi.nume, elevi.prenume FROM clasa, elevi WHERE clasa.cod_clasa = elevi.cod_clasa and clasa.cod_clasa=" + String.valueOf(codclasa));

nelevi.setModel(new TbModel(rezultat));

clasa_stmt.close();

TableColumn column = null;

column = nelevi.getColumnModel().getColumn(0);

column.setPreferredWidth(100);

} catch (SQLException ex) {

ex.printStackTrace();

}

}

} catch (SQLException ex) {

ex.printStackTrace();

}

Metoda executată la apăsarea butonului Iesire:

eleviclasa.setVisible(false);

Rulez programul:

Figura 112

6.5.2. Formular pentru vizualizarea elevilor cu limba începătoare:

Figura 113

Rulez programul:

Figura 114

6.5.3. Formular pentru vizualizarea elevilor cu limba avansată:

Figura 115

Rulez programul:

Figura 116

6.5.4. Formular pentru vizualizarea elevilor cu religia:

Figura 117

Rulez programul:

Figura 118

6.5.5. Formular pentru vizualizarea datelor elevilor:

Figura 119

Figura 120

Rulez programul:

Figura 121

7. Realizarea rapoartelor aplicației

7.1. Elementele unui raport

Rapoartele prezintă într-un format impus date conținute în baza de date. În unele cazuri formatul în care datele trebuie prezentate datele este definit prin lege.

Aplicațiile care accesează servere de baze de date trebuie să asigure afișarea pe ecran a rapoartelor și imprimarea lor.

Un raport conține de regulă nouă regiuni dispuse în benzi, ca în figură. Lățimile benzilor sunt astfel stabilite încât să ocupe întreaga zonă utilă (imprimabilă) a paginii.

Titlul

Banda pentru titlu este prima dintr-un raport. Un raport conține numai o singură bandă pentru titlu. Aceasta poate fi dispusă pe o pagină separată.

Capul paginii

Banda pentru capul paginii apare la începutul fiecărei pagini a raportului. Dacă titlul raportului sau recapitularea apar pe pagini separate, acestea nu vor conține această regiune.

Capul coloanei

Informațiile dintr-un raport pot fi dispuse pe una sau mai multe coloane.

Detaliere

În cazul rapoartelor în care informația nu este grupată, în această regiune sunt afișate rânduri conținând date preluate din baza de date.

În cazul rapoartelor în care informația apare organizată în grupuri, în această regiune vor alterna benzi conținând antetul grupului (Group Header), respectiv datele conținute în grup. După fiecare grup este posibilă afișarea unei benzi (Group Footer) conținând un rezumat legat de datele conținute în grupul respectiv.

Picior coloană

Banda care încheie coloana poate conține informații recapitulative, de regulă sume sau numărul de articole conținute în regiunea de detaliere.

Picior pagină

Toate paginile care conțin o bandă destinată capului paginii pot conține, în partea de jos, o bandă pentru informații recapitulative la nivel de pagină. Este posibilă includerea unei benzi distincte pentru ultima pagină a raportului (Last Page Footer).

Recapitulare

Banda pentru recapitulare (Summary) este adăugată la sfârsitul raportului, eventual pe o pagină distinctă.

Fundal

Fundalul raportului (Background) poate fi impus. De regulă acesta constă dintr-o imagine care va fi repetată pe toate paginile raportului.

7.2. Jasper Reports

Realizarea comodă a rapoartelor se poate face folosind o aplicație specializată. Există o multitudine de astfel de aplicații, mai interesantă fiind Jasper Reports, o soluție gratuită (open source) propusă de JasperSoft Corporation (fondată de românul Teodor Danciu).

Jasper Reports constă dintr-o colecție de clase Java care pot fi adăugate aplicațiilor scrise în acest limbaj. Jasper Reports oferă de altfel o mulțime de funții.

Astfel, pe lângă vizualizarea și imprimarea imediată a raportului, datele acestuia pot fi exportate într-o multitudine de formate: HTML, XML, XLS (Microsoft Excel), RTF (Microsoft Word), PDF sau reprezentate grafic.

Principial un ciclu de lucru pentru crearea unui raport folosind Jasper Reports constă din pașii următori:

1. Se crează un fișier de descriere a raportului în format XML, având extensia .jrxml;

2. Fișierul .jrxml este compilat pentru a-l aduce într-o formă accesibilă claselor Jasper Reports;

3. Se realizează interogarea sursei de date pentru aducerea datelor care vor fi conținute în raport;

4. Se vizualizează și se imprimă raportul.

Deoarece fișierul de descriere a raportului în format XML este relativ dificil de creat, mai ales pentru rapoarte având o grafică îngrijită și o structură nu tocmai banală, în practică se folosește o aplicație independentă, iReport. Autorul acesteia este Giulio Toffoli (Italia, 2002). Sesizând interesului cu care a fost primită soluția Jasper Reports de programatorii în Java, acesta a creat un mediu vizual destinat realizării rapoartelor, bazat pe JasperReports. Acesta permite crearea interactivă a

raportului dorit și salvarea fișierului în format .jrxml conținând descrierea acestuia.

7.3. Realizarea descrierii raportului cu iReport

iReports este un mediu vizual de editare a rapoartelor. Fereastra aplicației cuprinde mai multe panouri cu instrumente.

Figura 122

După descărcarea și instalarea aplicației iReport (http://ireport.sf.net/), aceasta trebuie configurată în vederea conectării la serverul Oracle XE. În principiu configurarea presupune două acțiuni:

– indicarea căii spre directorul conținând driverul jdbc necesar conectării și

– realizarea unei conexiuni cu serverul.

7.3.1. Indicarea căii spre biblioteca ojdbc14_g.jar

Ca și în cazul realizării unei aplicații Java care accesează serverul Oracle XE, și în iReports va fi indicată calea spre biblioteca ojdbc14_g.jar, conținând driverul jdbc și clasele necesare accesării serverului. Pentru aceasta se selectează Options /Classpath:

Figura 123

Figura 124

După revenirea în fereastra Classpath se selectează Save Classpath:

Figura 125

7.3.2. Realizarea unei conexiuni cu serverul Oracle XE

În continuare se va realiza o conexiune cu serverul Oracle XE. Pentru aceasta se va selecta în meniul aplicației Data / Connections/Data Sources:

Figura 126

Figura 127

Figura 128

Figura 129

Figura 130

Odată cu testarea conexiunii configurarea aplicației iReport în vederea realizării de rapoarte bazate pe tabelele și vederile din baza director este încheiată.

7.4. Realizarea raportului clasa

Creez un raport care să afișeze catedrele din baza de date.

Figura 131

Report wizard construiește un raport în cinci pași.

Pasul1: Se definește interogarea, care furnizează datele conținute în raport. Pentru aceasta, în prima fereastră care se afișează, se introduce interogarea sau se apasă butonul Design query pentru a genera fraza SQL, folosind un generator specializat.

Figura 132

Pentru raportul considerat comanda SELECT este:

SELECT

CLASA."CLASA" AS CLASA_CLASA,

ELEVI."NUME" AS ELEVI_NUME,

ELEVI."PRENUME" AS ELEVI_PRENUME,

ELEVI."NUMETATA" AS ELEVI_NUMETATA,

ELEVI."NUMEMAMA" AS ELEVI_NUMEMAMA,

ELEVI."ADRESA" AS ELEVI_ADRESA

FROM

"JUDIT"."CLASA" CLASA FULL OUTER JOIN "JUDIT"."ELEVI" ELEVI ON CLASA."COD_CLASA" = ELEVI."COD_CLASA"

ORDER BY

CLASA.COD_CLASA ASC,

ELEVI.COD_ELEV ASC

Pasul 2: Se selectează câmpurile care vor fi conținute în raport:

Figura 133

Figura 134

Pasul 3: În acest pas se poate indica gruparea înregistrărilor:

Figura 135

Pasul 4: În acest pas se impune aspectul raportului (pe coloane sau tabelar, respectiv modelul și dispunerea în pagină):

Figura 136

Pasul 5: În acest ultim pas, iReport confirmă realizarea raportului. După afișarea butonului Finish se obține practic descrierea raportului.

Figura 137

Figura 138

Pentru vizualizarea raportului generat se selectează în meniul aplicației Build /Execute (with active connection) sau se apasă butonul corespunzător de pe bara cu instrumente:

Figura 139

Figura 140

În continuare se pot edita elementele conținute în diferitele regiuni ale raportului. Pentru a edita un element conținut în raport, se va selecta elementul și apoi se vor accesa și eventual modifica proprietățile acestuia.

Obiectele conținute în raport pot fi editate selectându-le cu butonul drept al mouse-ului în fereastra aplicației sau în fereastra Document structure și accesând opțiunea Properties.

Tot folosind mouse-ul se pot modifica lățimile zonelor raportului sau se pot deplasa (rearanja) obiectele în cadrul zonelor sau pot fi deplasate dintr-o regiune într-alta.

7.4.1. Integrarea raportului clasa în aplicație

Pentru a integra raportul într-o aplicație scrisă în Java este necesar să se parcurgă pașii următori:

Se crează în directorul aplicației un subdirector denumit Rapoarte si se copiază în acest subdirector fisierul clasa1.jrxml creat de iReport;

Se adaugă în meniul derulant Rapoarte al aplicației o nouă intrare. Selectarea noii opțiuni va declanșa realizarea raportului și afișarea sa într-o fereastră similară cu cea folosită la vizualizare în iReport.

Figura 141

Figura 142

3. Se adaugă aplicației un ansamblu de arhive .jar:

commons-beanutils-1.7.jar,

commons-collections-2.1.jar,

commons-digester-1.7.jar,

commonslogging-1.0.2.jar,

jasperreports-2.0.1.jar,

jdt-compiler-3.1.1.jar.

Acestea sunt folosite și de iReport și se găsesc în directorul Program Files /JasperSoft/iReport-2.0.1/lib.

Metoda executată la selectarea opțiunii din meniu, adăugată pentru realizarea raportului, va conține declararea variabilei raport, care conține calea spre fișierul .jrxml generat de iReport și trei linii de cod, realizând o compilare a fișierului .jrxml (metoda compileReport), interogarea bazei de date pentru aducerea datelor în raport (metoda fillReport) și vizualizarea raportului într-o fereastră similară celei folosite de iReport (metoda viewReport).

– vizualizare1ActionPerformed:

String nume, prenume, numetata, numemama, adresa;

nume=getString("nume");

prenume=getString("prenume");

numetata=getString("numetata");

numemama=getString("numemama");

adresa=getString("adresa");

// TODO add your handling code here:

String raport = "D:/jutka/oracle/vizsga/elevi/Rapoarte/clasa1.jrxml"; // Fisier realizat de iReports

HashMap params = new HashMap();

params.put("nume", nume);

params.put("prenume",prenume);

params.put("numetata", numetata);

params.put("numemama", numemama);

params.put("adresa", adresa);

// Se poate face raportul

try {

JasperReport jasperReport = JasperCompileManager.compileReport(raport);

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, cnx);

JasperViewer.viewReport(jasperPrint, false);

} catch (JRException ex) {

ex.printStackTrace();

}

7.5. Realizarea rapoartelor conținând grupuri de articole

7.5.1. Realizarea raportului bazadate.jrxml

Rapoartele pot fi cu mult mai complexe decât cel realizat. Un exemplu în acest sens este raportul prezentat în continuare, în care se dorește selectarea datelor din baza de date, grupate pe clase. Pentru crearea unei prime forme a raportului se va face apel la iReport wizard.

Se realizează legăturile între tabele și se selectează câmpurile necesare raportului. Figura 143

Schimb imaginea ferestrei prin apăsarea butonului syntax.

Fraza SELECT pe care se va baza raportul este următoarea:

Figura 144

Se apasă OK și mă întorc la fraza sql și la query:

Figura 145

Se selectează câmpurile care vor fi conținute în raport:

Figura 146

Figura 147

În acest pas se poate indica gruparea înregistrărilor. Se va grupa dupa câmpul clasa_clasa.

Figura 148

În acest pas se impune aspectul raportului (pe coloane sau tabelar, respectiv modelul și dispunerea în pagină).

Figura 149

Dupa apăsarea butonului Finish voi avea raportul salvat bazadate.jrxml. Figura 150

Rezultat posibil, după editarea și rearanjarea elementelor raportului:

Figura 151

7.5.2. Realizarea raportului limbaincep.jrxml

Figura 152

Rezultat posibil, după editarea și rearanjarea elementelor raportului:

Figura 153

7.5.3. Realizarea raportului limbaavans.jrxml

Figura 154

Rezultat posibil, după editarea și rearanjarea elementelor raportului:

Figura 155

7.5.4. Realizarea raportului rel.jrxml:

Figura 156

Rezultat posibil, după editarea și rearanjarea elementelor raportului:

Figura 157

7.5.5. Realizarea raportului matricol.jrxml:

Figura 158

Rezultat posibil, după editarea și rearanjarea elementelor raportului:

Figura 159

7.6. Pregătirea aplicației pentru distribuție

În urma testării, aplicația trebuie pregătită astfel încât să poată fi lansată în execuție și fără utilizarea mediului de programare Netbeans. Pentru a realiza aceasta se va selecta opțiunea Build / Build Main Project. Mediul de programare va adăuga directorului aplicației un subdirector denumit dist care va conține o arhivă .jar executabilă. Pe lângă aceasta, directorul dist va mai conține subdirectorul lib. În acest subdirector mediul

Netbeans va copia toate bibliotecile adăugate proiectului în timpul realizării sale (în Libraries).

Figura 160

Dacă aplicația mai conține fișiere și în alte directoare, și este de regulă cazul fișierelor .jrxml care conțin descrierea rapoartelor, în dist vor trebui copiate și aceste directoare.

Lansarea în execuție fără Netbeans se realizează selectând arhiva executabilă cu butonul drept al mouse-ului și apoi Open With / Java Platform SE binary. Figura 161

8. Bibliografie

Prof. Univ. Dr. Ion Lungu: Baze de date Oracle limbajul SQL

Crearea și exploatarea bazelor de date relaționale. Suport de curs

2 Day DBA. Oracle Co.

2 Day Developer Guide. Oracle Co.

Programarea interfețelor grafice (Java Swing)

JasperReports for Java Developers

iReport – User manual

Crearea interfețelor utilizator. Suport de curs.

Programarea interfețelor grafice (Java Swing). O'Reilly.

1001 Java Tips

Introduction to Programming Using Java, Third Edition

Complemente de programare. Suport de curs.

www. studentie.ro/curs-Oracle

Similar Posts