Вы находитесь на странице: 1из 76

Universitatea Politehnica din Bucureti

Facultatea de tiine Aplicate


Specializarea Matematic i Informatic Aplicat
Aprobat, Decan:

Prof. Univ. Dr. Vasile Iftode

Proiect de diplom

Gestionarea resurselor umane i de


timp folosind programarea orientat
obiect i un SGBD

Coordonator tiinific:

Lect. Dr. Tiberiu Vasilache


Absolvent:

Olteanu A. Alexandru

Bucureti
2014

Olteanu Alexandru

Cuprins
Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1. Baze de date

1.1 Scurt istoric despre bazele de date. . . . . . . . . . . . . . . . . . . . . . . . . .

1.2 Teoria bazelor de date de tip relaional. . . . . . . . . . . . . . . . . . . . . . . .

1.2.1 Elemente de baz ale modelului relaional. . . . . . . . . . . . . . . . . . .

1.2.2 Restricii ale modelului relaional. . . . . . . . . . . . . . . . . . . . . . .

11

1.2.3 Procedeul de normalizare al relaiilor . . . . . . . . . . . . . . . . . . . . . 12


1.2.3.1 Prima form normal (NF1) . . . . . . . . . . . . . . . . . . . . . . .

12

1.2.3.2 A doua form normal (NF2) . . . . . . . . . . . . . . . . . . . . . .

13

1.2.3.3 A treia form normal (NF3) . . . . . . . . . . . . . . . . . . . . . .

13

1.2.3.4 Form normal Boyce-Codd(BCNF). . . . . . . . . . . . . . . . . . .

14

1.2.3.5 A patra form normal (NF4) . . . . . . . . . . . . . . . . . . . .

14

1.2.3.6 A cincea form normal (NF5) . . . . . . . . . . . . . . . . . . . . .

14

1.3 Sistem de gestiune al bazelor de date:PostgreSQL . . . . . . . . . . . . . . . . . . . 15


1.3.1 Manipularea bazelor de date. Limbajul SQL . . . . . . . . . . . . . . . . . . 15
1.3.1.1 Construirea i crearea relaiilor . . . . . . . . . . . . . . . . . . . . . . 17
1.3.1.2 Interogarea bazei de date . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.3.1.3 Popularea bazei de date . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3.1.4 tergerea valorilor din baza de date . . . . . . . . . . . . . . . . . . .

21

1.3.1.5 Actualizarea valorilor din baza de date . . . . . . . . . . . . . . . . . . 22


1.3.1.6 Subinterogri ale relaiilor . . . . . . . . . . . . . . . . . . . . . . . . . 22

Olteanu Alexandru

2. Programare orientat obiect. JAVA

24

2.1 Java noiuni indroductive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

2.2 Structura limbajului Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

2.2.1 Operatori i literali n Java. . . . . . . . . . . . . . . . . . . . . . . . . .

25

2.2.2 Declararea i iniializarea variabilelor. . . . . . . . . . . . . . . . . . . . .

27

2.2.3 Vectori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

2.2 Programare orientat obiect . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

2.3.1 Obiecte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

2.3.2 Clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

2.3.2.1 Clasa Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

2.3.3 Excepii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

2.3.4 Pachete standard n Java . . . . . . . . . . . . . . . . . . . . . . . . . .

33

2.3.5 Gestionarea i generarea interfeei grafice cu utilizatorul . . . . . . . . .

34

2.3.5.1 JPanel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

2.3.5.2 JLabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

2.3.5.2 JButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

2.3.5.3 JComboBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

2.3.5.4 JTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

2.3.6 Conexiunea la o baz de date (JDBC) . . . . . . . . . . . . . . . . . . . .

37

2.3.6.1 DAO (Data acces objet) . . . . . . . . . . . . . . . . . . . . . . . .

38

2.3.6.2 Interfee SQL n Java . . . . . . . . . . . . . . . . . . . . . . . . .

38

2.3.6.2.1 Interfaa Statement . . . . . . . . . . . . . . . . . . . . . . . . .

38

2.3.6.2.2 Interfaa PreparedStatement . . . . . . . . . . . . . . . . .

39

Olteanu Alexandru

2.3.6.2.3 Interfaa ResultSet . . . . . . . . . . . . . . . . . . . . . .


3 Aplicaia de asistena de ntocmire a orarului

40

41

3.1 Descrierea aplicaiei . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

3.2 Structura bazei de date . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

3.2.1 Prezentarea tabelelor . . . . . . . . . . . . . . . . . . . . . . . . . .

43

3.3 Programare Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

3.3.1 Pachetul DB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

3.3.2 Pachetul OrarDAO. . . . . . . . . . . . . . . . . . . . . . . . . . .

50

3.3.3 Pachetul UserInterface(UI) . . . . . . . . . . . . . . . . . . . . . .

53

3.4 Anexe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

3.4.1 Structura scriptului bazei de date. . . . . . . . . . . . . . . . . . .

58

3.4.2 Codul Java pentru pachetul DB. . . . . . . . . . . . . . . . . . . .

63

3.4.3 Codul Java pentru pachetul OrarDAO . . . . . . . . . . . . . . .

65

3.4.3 Codul Java pentru UI . . . . . . . . . . . . . . . . . . . . . . . . .

70

Bibliografie

76

Olteanu Alexandru

Introducere
Bazele de date au devenit n ultimii ani o parte indispensabil din viaa noastr
de zi cu zi i asta datorit dezvoltrii uriae a tehnologiei informaionale. n urma cu
civa ani datele de orice fel erau stocate fizic, n dosare i rafturi greu de gestionat. n
prezent tehnologia ieftin i cu o putere de calcul remarcabil, a condus la
implementarea bazelor de date pentru foarte multe activiti cotidiene i nu numai.
Sigurana datelor i uurina cu care sunt manipulate ntr-un sistem de gestiune sunt
principalele atuuri ale unei baze de date.

Nevoia de aplicaii care s prelucreze un volum mare de date, sigur i rapid


este n cretere. Astzi, aplicaiile de acest gen le putem ntlni la tot pasul, fie c
vorbim de o gestiune a resurselor umane pe diferite criterii ntr-o organizaie, fie de
gestiunea sistemelor bancare i a plilor online, fie de organizarea caledarului personal
pentru urmatorul an.

Scopul lucrrii este de a crea o aplicaie cu ajutorul programrii orientate pe


obiect i a unui sistem de gestiune al bazelor de date, care sa ofere asisten n generarea
i ntocmirea orarului. Publicul int este bine definit, acesta fiind format din
secretariatele facultailor care, pe baza planului de nvamnt, trebuie sa programeze
ore pentru fiecare formaiune de studiu, s aloce un interval orar i un loc de desfaurare
al cursurilor.

Olteanu Alexandru

Capitolul 1
Baze de date
1.1 Scurt istoric despre bazele de date
Conform unor afirmaii de la nceputul anilor 1960 prima oar un sistem de
baze de date a fost introdus n cadrul misiunilor de aselenizare Appolo gestionate de
Agenia Spaial American (N.A.S.A).
Nevoia de organizare a datelor, precum i de actualizare sau gsire a acestora
n timp real au condus ctre crearea unui sistem de gestiune. Aproximativ 20 de ani mai
trziu Edgar Frank Codd, un informatician de origine englez, a introdus noiunea de
model relaional al bazelor de date, fapt ce a stat la baza crerii bazelor de date
relaionale.
Baza de date reprezint o colecie de informaii partajate, aflate n dependen
reciproc logic, structurate ntr-un mod clar pentru a facilita operaiuni de manipulare,
cum ar fi tergerea, inserarea, actualizarea datelor sau generarea de rapoarte cu privire la
ntreaga baz de date. Sistemul de gestiune al bazelor de date (SGBD) este un sistem
software care permite utilizatorilor, pe de o parte crearea bazei de date i ntreinerea
acesteia, i pe de alt parte rspunde la cererile utilizatorilor legate de controlul i
monitorizarea bazei de date.

Bazele de date se clasific n funcie de:


Orientare:
- specializate;
- generalizate;
Distribuia biografic:
- locale;
- distribuite;
Modelul de date:
- ierarhice;
- relaionale;
- orientate pe obiect;
- relaie;

Olteanu Alexandru

Sistemul de gestiune al bazelor de date este format:

dintr-un limbaj ce faciliteaz definirea datelor n care utilizatorul sau


administratorul bazei denumete i descrie relaiile i entitile dintre acestea;

dintr-un limbaj structurat de interogare, numit Limbaj Structurat de Interogare


(SQL), specific pentru manipularea datelor, care are ca scop actualizarea, tergerea,
inserarea, modificarea i interogarea bazei de date.

1.2 Teoria bazelor de date de tip relaional


Conform informaticianului Codd, orice model de date este necesar s se bazeze
pe structurile, operatorii de manipulare i constrngerile de integritate.

Structurile de date: n modelul relaional datele sunt structurate n relaii de tip


bidimensional, iar elementele principale ale unei structuri relaionale sunt tuplurile,
atributele, domeniile, tabelele, chei primare sau de legatur.

Operatori de manipulare: Operatorii relaionali se bazeaz pe conceptul


algebrei relaionale, iar manipularea acestora se poate realiza utiliznd un limbaj de
manipulare (data manipulation language).

Constrngerile de integritate: Prin constrngerile de integritate nelegem


msuri luate pentru sigurana, stabilitatea i corectitudinea datelor, msuri interne care
nu sunt cunoscute de ctre utilizator.
Modelul relaional al bazei de date este unul simplu, fundamentat pe logica
matematic i teoria seturilor. Acest model a luat amploare n ultimii ani datorit unor
serii de avantaje.
- ofer oportunitatea utilizatorului printr-un sistem de gestiune sa apeleze ce date
dorete i nu cum anume poate ajunge la rezultat.
- informaiile sunt stocate ca valori.
- poate fi utilizat pentru manipularea de date complexe.

Olteanu Alexandru

1.2.1. Elemente de baz ale modelului relaional


Elementele de baz pentru definirea structurii de date sunt:
a) Domeniul: este o mulime de valori descris printr-un nume. Domeniul poate
fi definit prin natura caracteristicilor definitorii ale elementelor componente.

Exemplu:

Forme de nvamnt = {An, Grup, Subgrup}

Calificativ = {1,2,3,4,5,6,7,8,9,10}

Zilele sptmnii = {Luni, Mari, Miercuri, Joi, Vineri}

Fie domeniile D1, D2, D3, ... ,Dn. Definim produsul cartezian ca fiind

dar exist i posibilitatea ca n irul de domenii al produsului cartezian s regsim un


element de mai multe ori.
b) Relaie/Tabel: este subansamblul unui produs cartezian al unor domenii,
avnd asociat un nume, care caracterizeaz atributele ce aparin unei clase de entiti.
Un exemplu de tabel ar fi situaia carierei fotilor studeni ai unei faculti:

Tabela 1.2.1

Olteanu Alexandru

c) Atribut: este coloana unei relaii caracterizat printr-un nume.


Pentru tabela 1.1 putem da exemplu urmatoarele atribute:

Id_student: este codul cu care identificm un student. Acest cod este unic i nu
poate exista ntr-o tabel de dou ori;

NumeS: este numele studentului;

Anul_absolvirii;

Domeniu_Job: domeniul n care lucreaz n momentul ntocmirii tabelei;

Funcia_ocupat;
d) Tuplul: Elementele unei relaii sunt numite tupluri i sunt caracterizate ca
fiind liniile dintr-o tabel, dar fr s fie caracterizate printr-un nume. Numrul
tuplurilor i al atributelor dintr-o tabel nu are importan.
n tabela 1.1 identificm 3 tupluri, adic 3 elemente ale produsului cartezian.
Studeni = { ( 1, Mocanu Daniel, 2008, IT, manager), ( 2, Cornea Geanina, 2007,
Economie, consultant),( 3, tefnescu Drago, 2013, Inginerie Electric,
asistent) }
e) Cheia unei relaii: este o mulime minimal de atribute care ndeplinesc
rolul de indentificare a unui tuplu n mod unic. Cheile unei relaii pot fi de mai multe
tipuri:

Supercheie: este o coloan sau o mulime de coloane care identific n mod


unic un tuplu. Desigur c se prefer la o mulime ct mai mic de coloane care s
alctuiasc o supercheie.
De exemplu tabela Formaiuni_studiu, are coloanele Id, Denumire i
Id_parinte.
Formatiuni_studiu = {(1, I A, 0), (2, grupa 1311,1),(3,grupa 1312,1), (4,subgrupa
1311a,2) , (5,subgrupa 1311b,2) , (6,subgrupa 1312a,3) , (7,sungrupa 1312b,3)};
Combinaia de id si id_parinte poate fi supercheie deoarece determin n mod
unic tuplu. Desigur, n acest caz cel mai indicat ar fi s alegem doar id ca supercheie
deoarece este unic, incrementat consecutiv, pentru fiecare tuplu.

Cheie candidat: este o supercheie format dintr-o singur coloan care


determin n mod unic un tuplu. Aceast cheie mai poart i numele de cheie minimal.
Tabela Sli este format din Id i Denumire.
Sali = {(1,CB 106),(2,BN 113),(3,AN 2006)};

Olteanu Alexandru

10

Cheia candidat n acest caz este Id, deoarece determin n mod unic tuplu. De
acea poart numele i de cheie minimal.

Cheie primar: este o cheie candidat definit de cel care proiecteaz tabela, cu
scopul de a identifica i accesa cu uurin tuplurile. Domeniul cheii primare este
considerat i el ca fiind un domeniu primar.

Id
1.
2.
3.

Nume Profesor
Tudorache
Dumitru
Cazac

Prenume Profesor
Cristina
Ioana
Iulia

Departament
Matematic 1
Matematic 2
Fizic

Tabela 1.2.2

n cazul acesta, cheia primar este id-ul deoarece operaile de manipulare se


pot face mult mai accesibil apelnd id-ul. Fiind unic pentru fiecare tuplu nu exist riscul
de identificare gresit a unui profesor.

O cheie primar poate fi reprezentat dintr-o singur coloan i atunci ea se


numete cheie simpl. n cazul n care este alcatuit din mai multe coloane, poart
numele de cheie compus.
Un exemplu de cheie compus este tabela de Defalcare_ore:

Id
1

Id_formaiune
2

Id_profesor
25

Tip_or
C

Disciplin
Analiz numeric

Tabela Defalcare_ore
n tabela Defalcare_ore o cheie candidat dar nu cheie primar este format din
Id_formaiune, Tip_or i Disciplin, deoarece de exemplu anul 1 are doar 1 curs de
analiz numeric sau doar un seminar de analiz numeric pe smestru. Rezult c
aceast combinaie de coloane determin n mod unic un tuplu.

Cheie strin: este o cheie canditat care nu a fost definit de proiectant cu


scopul de a identifica i accesa tuplurile. Cheile strine accept valoarea nul cu condiia
ca proprietatea de unicitate s rmn viabil.

Olteanu Alexandru

11

Tabela 1.2.3

De exemplu, n tabela 1.2.1 putem indentifica cinci atribute, dar doar id-ul
determin n mod unic un tuplu, fiind cheie, pentru c:
- NumeS: mulimea de atribute n care identificm numele studentului nu poate fi cheie
ntr-o tabel, deoarece este posibil ca n tabela 1.1 s regsim n tupluri diferite acelai
nume.
- Anul_absolvirii: acest atribut nu este unic pentru c, n mod evident, ntr-o tabel de
acest tip, anul absolvirii coincide pentru toi studenii care au terminat n aceeai
promoie.
Din acest motiv nici un alt atribut nu este cheie n tabela 1.1 fiindc nu
identific n mod unic tabela.

1.2.2 Restricii ale modelului relaional


Restriciile de integritate sunt msuri luate pentru sigurana, stabilitatea i
corectitudinea datelor, msuri interne care nu sunt cunoscute de ctre utilizator i care
verific coerena n raport cu lumea real. Acestea se pot clasifica n dou categorii:
1) Restricii de integritate structurale:
-restricia de unicitate a cheii: reprezint restricia care constrnge ca o relaie
s nu permit egalitatea valorii atributului cheie pentru diferite tupluri.

Olteanu Alexandru

12

-restricia referenial: prevede c ntr-o relaie R care se refer la relaia P,


asocierea cheii externe trebuie s fie o cheie primar sau s i se atribuie valoarea nul,
adic neprecizat.
-restricia entitii: reprezint restricia care prevede c ntr-o relaie R cheia
primar a tuplurilor nu trebuie s aib valoarea null.
2) Restricii de integritate comportamentale: sunt restricii impuse facultativ de
utilizatorul sau administratorul bazei de date, i ele pot fi:
-restricii cu privire la domeniu: poate fi stabilit un interval de valori ntre care
atributele dintr-o relaie s se regseasc avnd atribuite valori din acesta.
-restricii temporale;

1.2.3 Procedeul de normalizare al relaiilor


Procedeul de normalizare al unor tabele presupune spargerea acestora n doua
sau mai multe tabele pentru a satisface anumite restricii, forma finala a tabelei purtnd
numele de forma normal(NF- normal form). n funcie de complexitatea seturilor de
reguli pe care le respect tabela poate fi ncadrat la o anumit form. O form
superioar verific setul de reguli ale tutror celor precedente ei.

Formele normale se refer n principiu la relaii, dar, putem spune ca o baz de


date este ntr-o NFi daca toate relaile care alctuiesc baza sunt n forma NFi.

1.2.3.1 Prima form normal (NF1)


O relaie este n forma normal unu dac:
- nu admite ca n componena ei sa existe 2 tupluri identice.
- nu admite valori multiple, fiecare cmp trebuie s fie atomic.
- nu admite valori nule ale cmpurilor.

Olteanu Alexandru

13

Tabela. 1.2.4
n tabela 1.2.4 exemplific anomaliile care ar trebui evitate pentru a putea
ajunge la NF1.
O reprezentare corect a acestei tabele, presupunnd ca fiecare student este
nscris la o singur facultate este:

1.2.3.2 A doua form normal (NF2)


Pentru ca o relaie sa fie in forma normal doi, trebuie sa respecte forma
normal unu i sa admita:
- ca orice atribut ne-prim (non-cheie) din relaie s fie dependent funcional de
atributul cheie.
O relaie R care are atributul cheie x i atributul ne-prim y al aceleiai relaie,
este NF2 dac orice valoare a atributului y in corespunde o valoare unica a atributului x.

1.2.3.3 A treia form normal (NF3)


O relaie este in forma normal trei, daca respect condiiile impuse de NF2 i
NF1 i n plus:
- Orice atribut ne-prim al unei relaii trebuie s depind direct(ne-tranzitiv) de
atributul cheie al relaiei respective.

Olteanu Alexandru

14

Daca n relaia A are atribute cu numele efilor de promoie al fiecarei facultai,


n anul 2014 i oraul din care fac parte, atunci atributul ora depinde n mod tranzitiv de
atributele supercheii, numele i facultatea.

1.2.3.4 Form normal Boyce-Codd(BCNF)


Forma normal BCNF impune orice atribut x de care sunt dependente alte
atribute trebuie sa fie o cheie candidat.

1.2.3.5 A patra form normal (NF4)


O relaie este n a patra forma normal dac respect forma normal 3 i
conine cel mult o dependena multivaloare.
ntr-o relaie de tip Orar cu atribute ca sala, ora, profesor, locaie, student i
anul de studiu putem exemplifica dependena multivaloare.
-

Cursul este inut de un profesor.

La o anumit or i locaie un profesorul se poate afla doar n acea sal de curs.

Studentul urmeaz cursul destinat anului su de studiu.

Studentul se poate afla la o anumit or i locaie doar la un curs.

Rezult ca exist o dependena multivaloare a cursului cu ora i locaia, adic


unui curs i se asociaz o sal i un interval orar care nu depind de alte informaii din
tabel.

1.2.3.6 A cincea form normal (NF5)


O relaie se afl in forma normal cinci dac respect toate formele normale
inferioare i n plus:
- candidaii cheie al relaiei trebuie sa genereze fiecare dependena jonciune.
A patra, a cincea i respectiv a asea form normal enun noiuni mai
generale, dar datorit seturilor complexe de reguli ce trebuiesc ndeplinite simultan de o
relaie, n practic sunt destul de greu de ntalnit.

Olteanu Alexandru

15

1.3 Sistem de gestiune al bazelor de date: PostgreSQL


PostgreSQL este un sistem open-source de gestionare a bazelor de date
compatibile cu limbajul standardizat de interogare SQL.Sistemul este disponibil n mod
gratuit, beneficiind de suport financiar i tehnic din partea mai multor companii, acestea
sponsoriznd dezvoltatorii sau oferind soluii hardware. Termenul open-source descrie
dezvoltarea sub licen liber permind, astfel, ca orice utilizator s poat accesa codul
surs.
Sesiunea Postgres folosete modelul server-client, fiind alcatuit din:

proces de supervizare de tip daemon (postmaster);

aplicaie pe care utilizatorul o folosete pentru utilizarea serviciilor SQL;

procesul postgres, format din unul sau mai multe servere backend.

1.3.1 Manipularea bazelor de date. Limbajul SQL


Tabelele stocate ntr-un sistem de gestiune cum este PostgreSQL, sunt entiti
logice asemntoare cu relaile reprezentate la Tabela 1.2.1 i Tabela 1.2.2.Grafic se
pstreaza i reprezentarea sub form de tabel, iar coloanele tabelului sunt cmpurile
relaiei iar linile corespund nregistrrilor.
Primul pas pentru crearea unei baze de date este definirea tabelelor i a
tipurilor de date utilizate n aceasta. n PostgreSQL se pot o list ntreaga de date, cum
ar fi:
- bytea: este un tip de dat ce stocheaz o valoare binar
- int8: stocheaz un numr ntreg ce se poate scrie pe 8 octei de memorie (un numar
ntreg ntre 0 i 255)

Sintax:

Olteanu Alexandru

16

- boolean: este o nregistrare logica, avnd doua posibilitai (true/ false);


- character[(n)]: un ir de caractere cu un numar fix de caractere n
- character varying [(m)]: un ir de caractere cu finit de caractere n;
- real: real cu precizie simpla;
- double precision: este un numar real cu precizie dubl, pana la 15 octei;
- integer: un numar ntreg, care are i semn;
- serial: autoincrementare cu valori stocate pe 4 octei;

Sintax:

bigserial: autoincrementare cu valori stocate pe 8 octei;

text: este un ir de caractere cu lungime variabil;

Relaiile dintr-un sistem de baze de date respect aceleai reguli de


normalizare. n proiectarea acestora, administratorul, de regula ine cont de regulile de
normalizare descrise la NF3.

Olteanu Alexandru

17

1.3.1.1 Construirea i crearea relaiilor


Relaiile sunt obiecte componente ale unei baze de date, astfel, pentru a costrui
tabele trebuie, n prealabil, s crem o baz de date. De regul orice sistem de gestiune
ofer doua modalitai de construire a unei noi baze de date:
fie printr-o interfa grafic prin care selectm Create Databases, i introducem
numele ce l va purta baza de date

- fie prin programare efectiva, cu ajutorul unui SQL de creare a bazei.


Exemplu:
drop database if exists db_name
create database db_name ;
Prima linie verific dac n sistemul de gestiune exist baza de date cu numele
db_nume i daca exist o va sterge. Apoi creaz baza de date cu numele db_name.
Pentru a crea i relaii n baza de date avem tot doua posibilitai. Prin tabul din
meniu care, prin apasarea lui, genereaz o nou relaie, noi fiind nevoii sa inserm
numele tabelei i numrul de atribute sau prin SQL. Un exemplu pentru SQL-ul de
creare al unei relaii este:

Olteanu Alexandru

18

Unde numele tabelei relaiei care va fi creat este scris n ghilimele i este
Programare_ore. Scriptul scris creaz i atributele relaiei, i stabilete totodat i tipul
datelor.
Tot n acest exemplu putem identifica i constrngeri ale sistemului de
gestiune. Atributul Id este declarat ca fiind primary key, adic nu permite nregistrri cu
valorea nula sau nregistrri duplicat i este declarat de ctre utilizator cu numele
pk_loc_timp. Atributele Id_loc_timp i Id_defalcare au constrngeri de tip foreign
key. Id_loc_timp este o referin la cheia primar din relaia Loc_timp, iar atributul
Id_defalcare este referin a cheii primare din relaia Defalcare_ore.
Duplicarea id-ului este asigurat de instruciunea SERIAL.
Atributele declarate ca integer sunt numere ntregi i nu admint valoarea nul.

Alte constrngarei n PostgreSQL sunt:

NOT NULL: nu admit valori nule in relaii.

UNIQUE: aceast constrngere nu permite duplicarea tuplurilor n relaie.

FOREING KEY: costrngerea presupune ca atributul astfel definit s aib o


valoare identic n tabela de legtur, valoare ce trebuie sa fie unic sau cheie
primar.
Sintax:

Olteanu Alexandru

19

n aceast relaie atributul Id_loc_timp este o cheie strina, definit astfel de


utilizator cu numele fk_loc_timp (FOREIGN KEY). n script este precizat i relaia la
care face referire cheia, ca fiind atributul Id din relaia Loc_timp.

CHECK: aceast costrngere elimin valorile ce nu satisfac unele condiii logice.

1.3.1.2 Interogarea bazei de date.


Interogarea bazei de date se efectueaz prin apelarea instruciunii SQL
SELECT. PostgreSQL este case sensitive n ceea ce privete numele relailor, dar n
ceea ce privete instruciunile, ele se pot scrie att cu litere mici sau cu litere mari, dar
de preferat este s pastrm sistemul de scriere pe tot parcursul codului. Instruciune se
pot scrie pe mai multe rnduri. Se recomand folosirea majusculelor i scrierea pe mai
multe rnduri pentru o vizibilitate mai bun.

Instruciunea selecteaz valoarea cmpului Denumire din tabela Ore unde


Id-ul tuplului este egal cu 1. Daca id-ul nu exist instruciunea va intoarce o eroare.
Aceast instruciune poate ntoarce un rezultat ordonat dupa valoarea unui
anumit atribut.

Instruciunea SELECT * ntoarce valoarea tuturor atributelor din tabel, iar


instruciunea ORDER BY ordoneaz n mod crescator rezultatul interogri dupa
valoarea atributului Id.

Rezultatul interogrii se poate grupa n funcie de valoarea unui atribut. Daca


valoarea unui atribut este aceeai pentru mai multe tupluri, atunci instruciunea grupeaz
valorile rezultatului, valorile identice ale atributului fiind succesive.

Olteanu Alexandru

20

Instruciunea anterioar selecteaz din tabela Profesori numele profesorilor i


ii grupeaz dupa denumirea departamentului

1.3.1.3 Popularea bazei de date.


Dupa crearea bazei de date i a tuturor relaiilor putem manipula efectiv
valorile din tabele cu ajutorul unor instruciuni SQL care ne permit inserarea,
modificarea sau tergerea de date.

Popularea efectiv a bazei de date se poate realiza prin dou moduri:


fie cu instruciunea INSERT;
fie cu instruciunea COPY

a) Inserarea unei nregistrri n baza de date cu instruciunea INSERT se


realizeaz astfel:

Tabela Faculti este populat cu 16 tupluri, formate din 2 coloane. Id-ul este
primary key si este de tip integer, iar Denumirea facultai este de tip character.
Desigur se poate popula tabela i fara ca id sa fie preciat, acesta fiind setat sa se
autoincrementeze, dar utilizatorul a preferat sa il defineasca pentru a putea controla
valoarea fiecrui id n parte.

Olteanu Alexandru

21

Dac n scriptul de inserare nu declarm toate coloanele i cele omise nu sunt


setate s se autoincrementeze sau s poat lua valoarea NULL atunci sistemul de
gestiune va da eroare.
b) Instuciunea COPY prevede ca n scriptul de populare s scrie calea ctre un
fisier de preferat de tip .csv (Comma-separated values), adic un fiier n care coloanele
sunt separate prin virgul.

COPY Profesori FROM C:\Documents and Settings\User\Profesori.csv with csv ;


Tot n scriptul de copiere se mai specific i:
- NULL: specific faptul c irul poate avea i valoarea null, adic intre doi
delimitatori te tip virgul nu exist nimic.
- CSV: specific tipul fiierului din care se adaug datele.
- HEADER: anuna sitemul de gestiune ca primul ir de caractere denumete
numele coloanei.
- DELIMITER: specific dac se folosete un alt delimitator fat de cel implicit,
virgula.

1.3.1.4 tergerea valorilor din relaii.


Instruciunea de tergere a unei relaii este DELETE. Se poate terge toat
tabela, sau doar un tuplu.

Daca nu se sepecific o condiie de tergere, atunci sitaxa DELETE FROM


name, va terge toate valorile din tabel.
Pentru a putea distruge o tabel sau o coloan din tabel exist instruciunea
DROP. Aceast instruciune nu doar sterge ci distruge coloana, tabela sau baza de date.

Olteanu Alexandru

22

1.3.1.5 Actualizarea valorilor din relaii.


Pentru a putea actualiza o relaie, trebuie ca acea relaie sa existe i sa fie
populat. Instruciunea de actualizare este UPDATE.

Sintaxa de actualizare este format din:


- UPDATE: care definete ce procedur urmeaz s fie desfurat urmat de numele
relaiei n care se va produce actualizarea.
- SET:stabilete n ce coloan se va face actualizarea.
- WHERE: este condiia care mpreuna cu coloana selectat precedent localizeaz
exact ce valoare urmeaz sa fie actualizat. De regul condiia apeleaz cheia primar
pentru a putea localiza tuplu din care face partea valoarea ce trebuie actualizat.

1.3.1.6 Subinterogri ale relaiilor.


n urmatoarea sintax utilizatorul a folosit dou subinterogri, in i not in

Daca interpretm codul, acesta ar nsemna:


- selecteaz denumirea orei din tabela Ore unde id orei se afla i n tabela
Loc_timp dar id de or nu se afl in tabela Programare_ore. Rezultatul va ntoarce
o list a orelor ce nu au fost programate.

Olteanu Alexandru

23

Alte subinterogri:

EXISTS: aceasta este o instruciune binar, care ntoarce ca rezultat true dac
interogarea are cel puin o nregistrarea ca rezultat, altfel intoarce false.
ALL: verific daca interogarea expresia satisface condiiile pentru fiecare
nregistrare

Olteanu Alexandru

24

Capitolul 2
Programare orientat obiect. Java
2.1 Java noiuni introductive
n anul 1995 compania Sun Microsystems a lansat o tehnologie remarcabil i
inovatoare denumit iniial OAK, ulterior Java, care s-a impus pe piaa dezvoltatorilor
de software datorit calitilor sale ,printre care :

Portabilitatea: Java este un limbaj de programare independent, aplicaiile


dezvoltate putnd fi rulate pe multe sisteme de operare, cum ar fi Windows,
Ubuntu, Mac OS, i chiar pe sitemele mobile de operare cum ar fi Android, iOS, far
a fi nevoie de o recompilare.

Orientatrea pe obiect: procedeul de programare elimina programarea clasica,


procedural.

Motenirea C: este proiectat dup modelul C i C++, de aceea utilizatorii care


sunt familiarizai cu C++ vor programa uor n Java.

Securitatea: Java verific dinamic codul introdus pentru detectarea


eventualelor probleme i are un set de reguli stricte pentru rularea proceselor la
distan.

Dezvoltatorii Java au creat mai multe platforme de lucru pentru rezolvarea


problemelor aparute n diverse domenii printre care:

J2SE Standard Edition, aceasta este platforma standard Java dedicat creri de
aplicaii independente.
J2ME Micro Edition, este platforma folosit pentru programarea dispozitivelor
mobile.
J2EE Enterprise Edition, este platforma cea mai complex propus de cei de la
Java.
Aplicaile Java au un mediu de execuie numit maina Java virtual (JVM).

Olteanu Alexandru

25

2.2 Structura limbajului Java


Limbajul Java a fost proiectat sa lucreze cu setul de caractere binar Unicode,
un motenitor al cosacratului ASCII , care, fiind programat s lucreze pe un singur octet
putea s reprezinte maxim 256 de caractere. Unicod poate reprezenta pn la 65536 de
semne.
Ca orice limbaj de programare i Java are o serie de cuvinte cheie, majortatea
motenite de la C++. Asta nseamn c n aplicai nu se pot folosi aceste cuvinte
deoarece ele definesc metode, clase, interfee. Cateva din aceste cuvinte cheie sunt
enumerate in tabelul 2.1

abstract

boolean

break

byte

case

catch

char

class

do

default

continue

const

else

double

extends

final

goto

for

float

finally

if

implements

import

instanceof

int

interface

long

native

protected

private

package

new

public

return

short

static

synchronized

while

void

strictfp

this

throw

throws

try

Tabelul 2.1

2.2.1 Operatori i literali n Java


Constantele n Java poart numele de literali. Acetia pot fi de mai multe tipuri:

Intregi(integer): literali ntregi se pot scrie n trei baze: baza 8, baza 10 i baza
16 i pot fi de doua tipuri.
- normali: se reprezint pe maxim 4 octei
- lungi: se reprezint pe maxim 8 octei.

Olteanu Alexandru

26

Flotani(Floating Point): sunt constante care au cel puin o zecimal sau f,


F ca sufix pentru reprezentarea valorilor normale sau d,D ca sufix pentru
reprezentarea valorilor duble. Reprezentarea se face pe 32 octei pentru valorile normale
i 64 octei pentru cele duble. Alaturarea literei e la o cifra reprezinta notaie
exponenial.
Exemplu: 9.5, 9e8, 3d, 4F

Literali logici(Boolean): este o nregistrare logica, avnd dou posibilitai


(true/ false);

n exemplul de mai sus constanta logic este isInserted i are valoarea false la
nceputul proceduri iar daca instruciunea merge, valoarea devine true. Spre deosebire
de limbajul C++, literali 0 i 1 nu sunt logici n Java

Caracter(Character): Literali de tip caracter sunt utilizai pentru a exprima


valorile din codul Unicode. Reprezentarea acestora se face printr-o liter sau o secven
trecut ntre apostrofi, cum ar fi:
- \b: secven pentru tab orizontal;
- \r: secven pentru nceput de rnd;
- \n : secven pentru linie nou;
- \f : secven pentru pagin nou;
- \ : secven pentru ghilimele;
- \ \ : secven pentru backlash

Olteanu Alexandru

27

iruri de caractere(String): Un ir de caractere este format fie din irul vid,


declarat cu ghilimele i nimic ntre ele, sau din mai multe caractere sau secvene de
caractere.

Operatorii Java sunt asemntori celor din C++, cu cateva deosebiri:

Operatorul de atribuire:atribuirea n java se realizeaz cu semnul =.

Operatori matematici: sunt operatori matematici clasici, cum ar fi +, -, *, /, dar


i operatori de auto-increment i auto-decrement, i++ respectiv i--;
Operatorul matematic + are rol i de concatenare a irurilor.
Exemplu: String h1 = Orarul;
String h2 = este;
String h3= provizoriu;
System.out.println(h1 + h2 + h3 );
Sintaxa System.out.ln(); afiaz n consol rezultatul concatenri.

Operatori organizai la nivel de octet: &(and), ||(or), !(not);

Operatorul if-else: este expresia logic dac condiia este ndeplinit returneaz
de exemplu true, altfel false.

Comentarile n Java dau posibilitatea utilizatorilor s poat nota direct n cod o


observaie sau o indicaie cu privire la cod. n funcie de marimea paragrafului comentat
se pot nota astfel:

La nivel de rnd comentariile ncep cu //. Cele dou caractere transform tot
ce se afl pe acelai rnd n secven de comentariu, asta nseamn c n momentul
compilri programul nu ine cont de aceste secvene.

Secvenele care sunt mai mari de un rnd se pun ntre /* la nceputul


paragrafului i */ la sfritul paragrafului comentat.
Exemplu:

Olteanu Alexandru

28

2.2.2 Declararea i iniializarea variabilelor


Variabilele sunt mrimile care pot lua diferite valori n timp. n Java variabilele
trebuie declarate i iniializate pentru a putea lucra cu ele. Declararea implic
specificarea tipului variabilei i a numelui pe care l are. Iniializarea presupune
atribuirea unei valori i se realizeaz cu ajutorul operatorului matematic de atribuire =
.O valoare poate fi constant dac declararea se face stipulnd sintaxa final naintea
tipului de variabil.
Exemplu: - declararea unui ir de caractere: String a;
- iniializarea unui ntreg: int b = 0;
-declararea unui ntreg constant: final C = 12;
Convenional sa stabilit ca variabilele finale constante sa fie declarate cu
majuscule, iar restul cu litere mici. Dac variabilele conin mai multe cuvinte n numele
lor, primul atom lexical se scrie cu liter mic iar urmatorii atomi cu prima liter mare.
Exemplu:

string numeProfesor ;

Declararea variabilelor se poate face n mai multe locuri din cod, astfel
variabilele sunt de mai multe tipuri:

variabile declarate la nivel de clas, sunt vizibile pentru toate metodele clasei.

variabile locale declarate la nivelul metodelor i parametri metodelor sunt


vizibile doar la nivelul metodelor.

se pot declara variabile i doar la nivelul unui bloc cod, iar acea variabil este
cunoscut de program doar la nivelul acelui bloc.

Exemplu de variabil declarat la nivel de cod:

Olteanu Alexandru

29

2.2.3 Vectori
Vectorii ca i varibilele, pentru a putea opera cu ei trebuie declarai i
iniializai. Declararea vectorilor seamana cum cea a variabilelor, doar c dupa ce
alegem tipul vectorului trebuie adugat sintaxa [] i apoi numele vectorului.
Exemplu: String[ ] numeVector;
Iniializarea vectorului se realizeaz prin alocarea memoriei prin intermediul
sitaxei new.
Exemplu: numeStudenti = new String[numrul de elemente],
unde numrul de elemente reprezint maximul de elemente ce le poate avea vectorul.
Pentru a afla numrul de elemente se poate folosi sintaxa length
Exemplu: int[ ] c = new int[20];
a.length ntoarce valoarea 20;

2.3 Programare orietat-obiect

2.3.1 Obiecte
Programarea orientat-obiect, nseamn lucrul cu obiecte create n limbajul de
programare. Crearea obiectelor realizeaz prin declararea, instanierea i iniializarea
obiectului.
a) Declararea obiectului: se realizeaz prin specificarea clasei acestuia.
b) Instanierea: presupune alocarea de memorie pentru crearea efectiv a
obiectului cu sintaxa new.
c) Iniializarea: se realizeaz cu ajutorul constructorilor din clas.
Odat creat obiectul se pot afla informai despre el, se pot schimba strile
obiectului sau se pot executa aciuni. Accesul la valorile variabilelor unui obiect depind
de drepturile oferite de clasa din care face parte obiectul. Apelarea metodelor unui
obiect se realizeaz prin aplicarea unui punct dupa numele obiectului.

Olteanu Alexandru

30

Exemplu: Rectangle dreptunghi = new Rectangle(0,0,50,70);


dreptunghi.setLocation(15,15);
dreptunghi.setSize(100,150);
System.out.println(dreptunghi.height);
Unde: - prima linie de cod atribuie obiectului dreptunghi o metoda clasa Rectangle cu
originea n 0 iar dimensiunile iniiale sunt 50 laimea i 70 nalimea.
-sintaxa setLocation schimb originea obiectului dreptunghi n locaia (15,15)
-setSize schimb dimensiunile dreptunghiului de la (50,70) la (100,150).
-sintaxa System.out.println(dreptunghi.height) tiprete n consola programului
dimensiunea nalimi dreptunghiului.

2.3.2 Clase
Modalitatea de a introduce tipuri noi de date ntr-o aplicaie Java este fie prin
intermediul claselor, fie prin intermediul interfeelor.
Pentru a declara o clas trebuie pentru nceput sa specificm modificatori clasei
i anume:

O clas declarata public va putea fi folosit de clase indiferent de pachetul


n care se afl.

O clas declarat final nu va putea avea subclase, iar din acest punct de
vedere o astfel de clas este considerat perfect pentru programarea orientata-obiect
deoarece unele metode ateapt un obiect ca parametru aflat ntr-o anumit clas i nu
aflat n subclasa.
Clasele definite n Java pot avea, daca nu sunt declarate ca fiind clase final, o
mulime de sublcase dar numai o singur clas pe care o motenete, cu alte cuvinte o
clas nu poate avea mai mult de o clas parinte. Singura clas din java care nu are nici
un parinte este clasa Object.

Olteanu Alexandru

31

P1.

Exemplu de declararea al unei clase:

// Corpul clasei

Corpul unei clase conine:


a) variabile de clas declarate i iniializate
b) declararea constructorilor
c) declararea, daca e cazul, al unor clase interne.
d) metodele clasei.
Constructorii poart acelai nume ca i clasa din care fac parte,acetia sunt metode
specifice pentru acea clas cu rol de iniializare a obiectelor.

2.3.2.1 Clasa Object


Toate clasele din Java motenesc clasa Object, orice obiect fiind descedent al
acestei clase direct sau indirect.
Fiind clasa fr nici un printe punem spune c definete standardul de
comportament comun al subclaselor ei, cum ar fi:

posibilitatea de a testa egalitatea valorilor obiectelor.

returneaz clasa din care un obiect face parte.

specific reprezentarea sub form de ir a obiectului;

Olteanu Alexandru

32

Subclasele lui Object pot folosi metodele acestuia, i le pot nbunti deoarece
nu sunt declarate ca finale. De exemplu metoda toString returneaz reprezentarea ca un
ir de caractere a obiectului. Metoda este necesar n cazul n care este nevoie s se
afieze un ir de obiecte.

2.3.3 Excepii
Excepiile sunt evenimente ce produc ntreruperea unui program n timpul
execuiei. Ele pot sa apar din varii motive, fie elementele unui ir declarat sunt mai
multe decat numrul cu care a fost iniiat, fie erori sql n cazul n care lucram cu o baza
de date, fie erori de cod.

Mesajul din parantez indic numele clasei din care a aparut eroarea i pe ce linie de
cod. n acest caz eroarea provine de la declararea incompleta a unei metode.
Tratarea erorilor n Java este obligatorie i de aceea exista pisibilitatea ca
programatorul s izoleze eroarea ntr-un bloc de cod cu sintaxele try i catch care au
urmatoarea forma:

Acest try ncearca sa pregteasc inserarea unor valori ntr-o relaie dintr-o baz de
date. Daca conexiunea e realizat atunci codul nu va ntoarce eroare, altfel va genera o
eroare SQL.

Olteanu Alexandru

33

2.3.4 Pachetele standard n Java


Pachetele sunt o colecie de interfee i clase apropiate ca utilitate. Clasele sunt
organizate n pachete pentru a eficientiza gsirea i utilizarea lor, pentru a nu aprea
conflicte cu privire la numele claselor.
Pachetele standard cele mai importante n Java sunt:
- java.lang: este pachetul ce conine clasele de baz;
- java.io: pachetul ce conine clasele responsabile de intrri/ieiri i lucrul cu fiiere;
-java.awt: pachetul cu clase folosite pentru crearea interfeei grafice cu utilizatorul;
-java.awt.event: tratarea evenimentelor produse de utilizator;
-java.applet: pachetul ce conine clase de dezvoltare a appleturilor;
-java.sql: clasele ca lucreaz cu baze de date;
-java.net: clasele de programare n reea;
-java.math: pachetul ce lucreaz cu operaii matematice complexe ;
-javax.swing: pachetul cu clase mbogite
grafice, cu utilizatorul.

folosite pentru crearea unei interfee

Pentru a putea folosi un pachet ntr-un cod, acesta trebuie importat.Importul se


realizeaz prin scrierea sintaxei import i numele pachetului naintea declarrii clasei, la
nceputul fiierului surs.
Exemplu

Olteanu Alexandru

34

2.3.5 Gestionarea i generarea interfeei grafice cu utilizatorul


Crearea intefeei grafice se realizeaz cu ajutorul pachetului javax.swing. Acest
pachet este mult mbogit estetic i funcional faa de predecesorul su java.awt.
Pachetul pune la dispoziie sute de interfee i clase.Setul componentelor GUI puse la
dispoziie de tehnologia Swing, a fost unul din marile schimbri faa de tehnologia
predecesoare, swing punnd la dispoziie 17 pachete:

Componentele pachetului swing pentru crearea interfeelor poti fi grupate


astfel:
-Componente atomice: JLabel, JCheckBox, JRadioButton, JButton, JScrollBar.
-Componente de editare
JFormattedTextField;

text:

JTextPane,

JTextField,

JPasswordField,

-Meniuri: JMenu, JPopupMenu, JMenuBar, JRadioButtonMenuItem, JMenuItem;


-Componente complexe: JTree, JTable, JList, JComboBox;
-Containere intermediare: JPanel, JSplitPanel, JScrollPane, JTabbedPane, JTollBar,
JDesktopPane;
-Containere complexe: JFrame, JApplet, JDialog ,JWindow.

2.3.5.1 JPanel
JPanel reprezint containerul intermediar pentru interfaa grafic. n el se pot
organiza i grupa componentele ale unui alt container.

Olteanu Alexandru

35

Constructorul unui panou are forma JPanel (). Un panou care sa aib i
gestionarul de poziionare lm se declar JPanel(LayoutManager lm).

2.3.5.2 JLabel
JLabel reprezint etichetele din Java, etichete ce nu pot fi suprascrise sau
selectate n momentul rulri programului. Acestea au rol informativ pentru utilizator,
deoarece n etichete se pot insera atat cmpuri text cu descrierea aciuni ce trebuie
urmat sau imagini.

2.3.5.2 JButton
JButton face parte din clasa AbstractButton, i funcionalitatea lui este c prin
simpla lui apasare genereaz aruncarea unui eveniment pe care programatorul trebuie s
l trateze. La apasarea lui, butonul i schimb aspectul. Pe un buton se pot insera atat
cmpuri text cu descrierea aciuni pe care o genereaz la apasare, dar i imagini, care pot
aprea n diferite momente ale butonului, cand acesta este apsat sau eliberat.

2.3.5.3 JComboBox
JFrame este containrul de nivel nalt cel mai des folosit pentru aplicaile
bazate pe tehniologia Swing. Componentele pachetului Swing se poziioneaz n
interiorul containrului.
Componenta JComboBox este o combinaie ntre un buton i o list din care
utilizatorul poate alege doar un element, fiind singurul disponibil la un moment dat.
JComboBox poate fi creat dintr-un obiect, sau iniializat dintr-un vector, sau folosind un
model dat explicit de tip ComboBoxModel.
Exemplu JComboBox:

JComboBoxSala este programat s listeze toate slile din baza de date. Componenta
JComboBox este declarat automat de programul NetBeans, utilizatorul fiind nevoit
doar s iniializeze componenta.

Olteanu Alexandru

36

2.3.5.4 JTable

JTable este componenta care este capabil s opereze cu tabele. JTable poate fi
creat cu ajutorul unor modele.
JTable folosete la listarea unor obiecte dintr-o baz de date i are posibilitatea
selectri unui astfel de obiect cu ajutorul metodei jTable1MouseClicked din clasa
motenita java.awt.event.MouseEvent
Exemplu

2.3.6 Conexiunea la o baz de date (JDBC)


JDBC(Java DataBase Conectivity) este interfa de programare dezvoltat
pentru accesul la o baz de date, care ofer posibilitatea dezvoltatorilor s lucreze direct
cu instruciuni SQL.Codul surs scris pentru a manipula o baz de date n Java este
portabil indiferent de SGBD, fiind nevoie doar de driverele potrivite pentru fiecare
sistem n parte.
Pe scurt JDBC este capabil s realizeze conexiunea cu baza de date, s
manipuleze baza cu secvene sql standard i este capabil s efectueze i prelucrarea
datelor ce se ntorc din baza de date.
Pentru ca o aplicaie s se poat conecta la o baz de date, primul pas este
nregistrarea unui driver. Acest lucru se face prin ncarcarea unor clase, cum ar fi:
-Class.forName:aceast clas apeleaz funcia ClassLoader
Class.forName(sun.jdbc.odbc.JdvcOdbcDriver);

- DriverManager

Olteanu Alexandru

37

import java.sql.DriverManager;
Nu exist o restricie al numrului de drivere importate n maina virtual Java,
de aceea specificarea cii URL JDBC unui sistem de gestiune este necesar. Sintaxa
general de specificare a cii este jdbc.<subprotocol>:<nume>. De exemplu, pentru
folosirea unui sistem de gestiune PostgreSQL calea arat astfel:

Dup nregistrarea driverului, conexiunea cu baza de date se realizeaz prin


metoda GetConnection din clasa DriverManager.
Stabilirea conexiuni folosind un driver PostgreSQL.

Unde: - numele driverului folosit este declarat pe a doua linie de cod;


- userul i parola pentru conectarea la baza de date din PostgreSQL sunt
iniializate sub stringul user i password;

Olteanu Alexandru

38

- n url sunt trecute calea catre serverul local i numele bazei de date la care
trebuie aplicaia sa se conecteze.

2.3.6.1 DAO (Data acces objet)


DAO este un obiect ce are o interfa de programare pentru a acesa datele
stocate n diverse sisteme de gestiune al bazelor de date. Ca urmare, DAO nu depinde de
sistemul de gestiune, codul odat scris putnd fi folosit pentru a accesa datele din
diverse siteme.
DAO folosete secvene SQL pentru a interaciona cu baza de date.Tuplurile i
atributele din baza de date sunt create n Java sub forma unor obiecte, fiecare tuplu i
atribut fiind privit ca un array de obiecte. De aceea DAO manipuleaz datele din tabele
cu ajutorul metodelor definite n Java, cum ar fi getA sau setA.

2.3.6.2 Interfee SQL n Java.


2.3.6.2.1 Interfaa Statement
Metodele interfeei Statement transmit secvene SQL ctre baza de date i
astfel ofer suport pentru dou subinterfee PreparedStatement i CallableStatement.
Metodele interfeei Statement sunt:

executeQuery: aceast metod realizeaz interogri ale bazei de date prin


secvena SQL SELECT. Rezultatul inrerogri este de tip tabel i conine 1 sau mai
valori ale coloanelor n funcie de sintaxa SQL.
Exemplu:

Olteanu Alexandru

39

unde, n acest exemplu instuciunea SQL ntoarce toate valorile din tabela
Formaiuni_studiu pentru care Id_parinte este egal cu 0.

executeUpdate: metoda realizeaz actualizri ale datelor (INSERT, DELETE,


UPDATE) sau asupra structurii bazei de date(CREATE, ALTER,DROP).
Exemplu:

execute: este o metod care ntoarce un rezultat format din mai multe obiecte.

2.3.6.2.2 Interfaa PreparedStatement


Metoda PreparedStatement pregtete secvenele sql ce vor trebui executate.
n aceast metod se pot seta mai muli parametri de intrare, fiecare fiind nlocuit n
secvena SQL cu un semn al ntrebari, ulterior fiind nevoie s se specifice o valoare
pentru fiecare parametru.
Obiectului de tip PreparedStatement se creaz cu sintaxa preparedStatement i
se specific o secvena SQL. Execuia unui obiect de acest tip se face prin aceleai
metode ca la obiectele de tip Statement.
Exemplu:

n acest exemplu, prepareStatement pregatete conexiunea la baza de date.

Olteanu Alexandru

40

2.3.6.2.3 Interfaa ResultSet


Orice interogare executat corect SQL a unei baze de date, ntoarce un rezultat
reprezentat cu ajutorul unui obiect de tip ResultSet. Obiectul conine rezultatul
interogri sub forma unui tabel cu un numr de linii i coloane diferit n funcie de
secvena SQL i consistena bazei de date.

n exemplul de sus, obiectul de tip ResultSet poarta numele de results, i


afieaz valorile selectate din tabela Profesori. Extragerea efectiv din tabel a valorilor
se realizeaz parcurgnd linie cu linie tabela folosind metode de tipul getB, unde b este
tipul de dat din tabel. Numerele din parantez semnific coloan n care se afl tipul
de dat n tabel.
Un exemplu de valori din tabela Profesori dup execuia secvenei SQL este:

Id
1

Nume
Popescu Marian

Id_dep
42

Olteanu Alexandru

41

Capitolul 3
Aplicaia de asistena de ntocmire a orarului
3.1 Descrierea aplicaiei
Aplicaia este un ajutor de ntocmire al orarului i a fost dezvoltat n mediul
de programare NetBeans IDE 7.4, un soft disponibil n mod gratuit pe internet. Pentru
crearea unei baze de date am folosit softul PgAdmin III iar sistemul de gestiune ales este
PostgreSQL deasemenea disponibilie pe internet.
Pentru a putea opera secvene sql n Netbeans, a fost necesar folosirea unui
driver JDBC numit postgresql-9.1-901.jdbc4.
Baza de date a fost conceput plecnd de la ideea c publicul int al aplicaiei
sunt secretariatele facultilor, care la nceputul fiecrui an universitare trebuie s
ntocmneasc pe baza planului de nvamnt notele de comand i orarul. Pentru ca
ntocmirea orarului sa fie corect trebuie avut n vedere eventualele probleme ce pot
aprea n momentul programrii pe sli i zile att formaiunile de studiu cat i
profesori.
Setul de reguli de care o aplicaie de asistare a ntocmiri orarului trebuie sa in
cont n momentul n care utilizatorul ncearc sa programeze un cmp din orar este:
- formaiunile de studiu pot fi programate o singur dat pe un interval orar. Daca
exist formaiuni ce au sub-formaiuni de care depind, cum ar fi anul, grup, semigrupa,
atunci nu se pot programa pe acelai interval orar i formaiuni i subformaiuni.
- profesori nu pot fi programai s in doua discipline n acelai timp.
- daca o sal a fost programat pentru o formaiune la un anumit interval orar, atunci
acea sal nu este disponibil pentru nici o alt formaiune n acelai interval.
Interfaa grafic creat a fost proiectat pentru a fi n primul rnd intuitiv,
partea estetic fiind pus pe locul 2.

Olteanu Alexandru

42

3.2 Structura bazei de date

Baza de date este format din 14 tabele distincte, fiecare fiind proiectat pentru
a asigura integritatea i optimizarea informaiei. Scriptul de crearea al bazei de date este
redat n totalitate n subcapitolul Anexe, la punctul 3.4.1
Tabelele au urmtoarele roluri:
- Profesori: este tabela de gestiune pentru profesori.
- Ore: gestiunea intervalelor orare
-Zile: gestiunea zilelor saptmni
- Sali: gestiunea salilor alocate pentru o anumit facultate.
-Mod: gestiunea paritii
-Formatiuni_studiu: gestiunea anilor, grupelor, subgrupelor.
-Planuri_scolarizare: Planurile de scolarizare pentru fiecare an.
-Loc_timp: tabel de legtur ntre ore, zile i sli.
- Departamente: gestionarea departamentelor.
- Facultai: gestionarea facultailor;
-Detalii_plan_scolarizare: gestionarea tuturor informaiilor dintr-un plan de
scolarizare
-Defalcare_ore: tabel de legtura ntre profesor, disciplin, tipul orei, numrul de ore.
-Asociere_an_plan: tabel de legtur ntre, tabela de formaiuni i tabela de planuri.
-Programare_ore: tabela de gestiune a programarilor orarului.

Olteanu Alexandru

43

3.2.1 Prezentarea tabelelor:

Caracteristici generale ale tabelelor:


toate coloanele Id ale tabelelor sunt chei primare i sunt declarat ca serial,
adic au proprietatea de autoincrement.
Sirurile de caractere sunt declarate ca fiind charachter varying de diferite
lungimi n funcie de ce rol are acel ir n aplicaie.

a) Tabela Profesori:

Tabela Profesori este format din 3 coloane:


-Nume: coloana n care se regsesc numele i prenumele profesorilor..
-Id_dep: este o cheie strin (foreign key), adic, este cheia de legtur cu
cheia primar din tabela Departamente.

b) Tabela Ore:

Tabela Ore este format din 2 coloane:

Olteanu Alexandru

44

-Denumire: este coloana declarat ca ir de caractere cu lungimea 10 i n ea


se vor stoca intervalele orare, de exemplu 13-14;

c) Tabela Zile:

Tabela Zile este format din 2 coloane:


-Denumire: este coloana declarat ca ir de caractere cu lungimea 10 i n ea
se vor stoca intervalele denumirea zilelor, de exemplu Luni, Mari;

d) Tabela Formatiuni_studiu:

Tabela Formaiuni de studiu este format din 3 coloane:


-Denumire: este coloana declarat ca ir de caractere cu lungimea 10 i n ea
se vor stoca denumirea fiecrei formaiuni de studiu, de exemplu Anul I,Grupa
1331;
-Id_parinte: Grupele sunt copii anilor, iar subgrupele sunt copii grupelor, deci
fiecare formaiune de studiu are un id parinte n funcie de parintele lor, numai anii nu
au nici un parinte.

Olteanu Alexandru

45

e) Tabela Facultati:

Tabela Facultai este format din 2 coloane:


-Denumire_facultate: este coloana declarat ca ir de caractere cu lungimea
80 i n ea se vor stoca denumirea facultailor din UPB, de exemplu Stiine Aplicate;

e) Tabela Departamente:

Tabela Formaiuni de studiu este format din 3 coloane:


-Denumire_departament: este coloana declarat ca ir de caractere cu
lungimea 80 i n ea se vor stoca denumirea tuturor departamentelor UPB.

Olteanu Alexandru

46

-Id_facultate: este o cheie strin (foreign key), adic, este cheia de legtur
cu cheia primar din tabela Facultai.

f) Tabela Sali:

Tabela Formaiuni de studiu este format din 2 coloane:


-Denumire: este coloana declarat ca ir de caractere cu lungimea 20 i n ea
se vor stoca denumirea fiecrei sli din UPB sau, pentru a nu ncarca foarte mult baza de
date, se vor stoca doar slile alocate facultii care ntocmete orarul, de exemplu BN
113;

g) Tabela Loc_timp:

Olteanu Alexandru

47

Tabela Loc_timp este format din 5 coloane:


-Id_sala: este o cheie strin (foreign key), adic, este cheia de legtur cu
cheia primar din tabela Sli.
-Id_zi: este o cheie strin (foreign key), adic, este cheia de legtur cu cheia
primar din tabela Zile
.
-Id_ora: este o cheie strin (foreign key), adic, este cheia de legtur cu
cheia primar din tabela Ore
-Id_mod: este o cheie strin (foreign key), adic, este cheia de legtur cu
cheia primar din tabela Mod.

g) Tabela Defalcare_ore:

Tabela Defalcare_ore este format din 6 coloane:


-Id_formatiune: este o cheie strin (foreign key), adic, este cheia de
legtur cu cheia primar din tabela Formatiuni_studiu.
-Id_profesor: este o cheie strin (foreign key), adic, este cheia de legtur
cu cheia primar din tabela Profesori.
.
-Tip_ora: este coloana ce precizeaz ce tip de or este. Curs, Seminar,
Laborator i este declarat ca un ir de caractere de lungime 5.
-Disciplina: aceast coloan stocheaz denumirile materiilor.

Olteanu Alexandru

48

-Nr_ore: este coloana ce stocheaz numrul de ore al unui curs, seminar sau
laborator. Variabila este declarat ca intreg.

h) Tabela Programare_ore:

Tabela Programare_ore este format din 3 coloane:


-Id_loc_timp: este o cheie strin (foreign key), adic, este cheia de legtur
cu cheia primar din tabela Loc_timp.
-Id_defalcare ore: este o cheie strin (foreign key), adic, este cheia de
legtur cu cheia primar din tabela Defalcare_ore.
mbinarea celor dou chiei strine din tabelele Defalcare_ore i Loc_timp
creaz o programare efectic n orar.

3.3 Programare Java.


Programarea n Java a aplicaiei este structurat n 3 pachete. Orar.DAO, DB
i UI. Fiecare pachet din Netbeans este proiectat avnd sarcini clare cu privire la
dezvoltarea, rularea i funcionarea corect a aplicaiei.

3.3.1 Pachetul DB.


n pachetul DB s-au definit constructori pentru tabelele din baza de date.
Fiecare tabel cu care se lucreaz direct trebuie s aib un constructor definit n DB.

Olteanu Alexandru

49

Pentru crearea unui constructor al unei tabele este necesar s definim clasa public cu
acelai nume, i s iniializm n aceasta variabile pentru fiecare coloan din tabel

n interiorul clasei se declar variabile la nivel de clas pentru fiecare coloan din
tabela Loc_timp i referirea la variabile se face cu instriciunea this. pentru a putea fi
folosite.
Constructorul gol , public Loc_timp (), se declar pentru c apelul uneori ntr-o
metod se face i catre constructorul gol, iar dac acesta nu este declarat, aplicaia va da
eraore.
Constructorul are definite n interiorul lui i niste metode de setare a valorilor n baza
de date sau de recuperare a acestora. Aceste metode sunt getA i setA, unde A este
numele coloanei din baza de date.
Exemplu

Olteanu Alexandru

50

Astfel de clase constructor se creaz pentru toate tabelele cu care vrem sa


lucrm n nterfaa grafic i pentru care trebuie sa recuperm un id sau sa setm o nou
valoare n baza de date.

3.3.2 Pachetul OrarDAO.

n pachetul OrarDAO se realizeaz conexiunea la baza de date folosind diferite


metode i cu ajutorul unui driver special pentru fiecare sistem de gestiune n parte. n
acest caz, sistemul de gestiune este PostgreSQL i astfel driverul necesar pentru
stabilirea conexiuni este postgresql-9.1-901.jdbc4.

Olteanu Alexandru

51

Pentru a realiza conexiunea la o baz de date trebuie s specificm calea ctre


baza de date, n acest caz calea fiindu-i atribuitr unui ir de caractere care este denumit
generic DB_CONNECTION_URL. n finalul cii, dupa ultimul backslesh este
specificat numele bazei de date n care vrem s lucrm.
A doua linie de cod reprezint driverul cu care se realizeaz conexiunea.
n a treia i respectiv a patra linie din cod sunt stipulate userul i parola cu care
aplicaia se va loga automat astfel la baza de date.
n continuare se declar nul conexiunea i deschiderea unei noi sesiuni se
prinde ntr-un bloc try-catch pentru a testa driverul, respectiv conexiunea i datele de
logare n urmatorul bloc try-catch.

Tot n OrarDAO, sunt iniializate clase, care cu ajutorul constructorilor


declarai n pachetul DB se ncearc manipularea bazei de date. Acest procedeu de
creare unor obiecte care s conin secvene SQL uureaz munca programatorului
deoarece pentru a iniializa proceduri de interogare sau actualizare a bazei de date este
suficient apelarea acestor metode. Programarea orientat-obiect se bazeaz pe acest
procedeu de dezvoltare al aplicaiilor.
Pentru selectarea unor valori dintr-o tabel se scrie o metod n OrarDAO,
numit selectNumeleTabelei, i n funcie de complexitatea tabelei sau de ce anume
vrem sa ne ntoarc, secvena SQL difer. De exemplu:

Olteanu Alexandru

52

Mai sus am exemplificat o metod complet de selectare a tuturor valorilor din


tabela Formatiuni_studiu. Metoda, este declarat ca o list de obiecte. Rezultatul ntors
de instruciunea sql este afiat sub form de tabel. Metoda este foarte folositoare n
momentul n care dorim sa operm secvene de actualizare a bazei de date deoarece
pune la dispoziie utilizatorului lista iar acesta poate selecta cu o metod din java printrun simplu click tuplu asupra caruia vrea s fac actualizri.
i pentru actualizarea datelor se pot crea metode de acest tip, indiferent ca e
vorba de secvene de stergere, actualizare sau inserare n baza de date, de exemplu:

Metoda insereaz n tabela denumirea unor sli, id fiind setat ca auto-increment


se va insera automat. Interfaa PreparedStatement pregtete conexiunea pentru
introducerea unor valori de la interfaa grafic a utilizatorului n tabela. Aceast
pregatire poart numele n metoda prezentat insertStatement.
Sintaxa de obinere a unei denumiri pentru sal este descris la a aptea linie de
cod i anume: insertStatement.setString(1, s.getDenumire()), unde numrul 1 precizeaz
a cta valoare declarat in sintaxa sql este denumirea, iar metoda getDenumire preia
valoarea denumiri introduse de utilizator i o pregtete pentru inserare.

Olteanu Alexandru

53

3.3.3 Pachetul UserInterface(UI).

n acest pachet se genereaz cu ajutorul metodelor grafice predefinite, care


aparin claselor swing sau awt, interfaa prin care utilizatorul va programa orarul. n
acest scop am creat 7 ferestre grafice de tip JFrame. Voi descrie pe rnd fiecare fereastr
cu toate componentele ei, codul surs anexndul la subcabitolul 3.4.4.
a) JFrameMenu.java

Frame-ul Meniu a fost creat pentru a facilita navigarea ctre toate ferestrele
aplicaiei. Acesta este format dintr-un JMenuBar cu dou meniuri.
Meniul UPB listeaz doi itemi, unul care conduce la un JFrameSali, iar al
doilea conduce ctre JFrameProfesori.
Al doilea meniu, Programare Orar conduce catre JFrameIntocmireOrar,
fereastra n care se programeaz efectiv orarul i catre 3 JFrameRaport care creaz
rapoarte cu privire la orar pe diferite criteri.

Olteanu Alexandru

54

b) JFrameSali.java

Acest fereastr da posibilitatea utilizatorului sa gestioneze tabela Sali. Tabelul


din josul ferestrei listeaz automat toate slile din tabel acest lucru fiind posibil datorit
metodei selectSali din pachetul
OrarDAO
.
Butoanele
Adaug
Sala,
Modific Sala i Sterge Sala
realizeaz secvene de actualizare
a tabelei.
Dupa
introducerea
unei
denumiri n campul text prin
apsarea butonului Adaug Sala
se realizeaz secvena de insert.
Pentru a modifica i sterge o
sal este necesar selectarea din
tabelul din josul ferestrei a unei
sli. Listarea se face automat n
momentul rulri ferestrei iar
reiniializarea listei de sli se
produce la apsarea oricrui buton
din fereastr.
Cmpul text de aceai culoare
cu fundalul este destinat pentu
afiarea erorilor n cazul n care
secvena sql nu funcioneaz.

Olteanu Alexandru

55

c) JFrameProfesori.java

JFrameProfesori este fereastra de gestiune a profesorilor singura diferen fat


de gestiunea pe sli este ca aici trebuie s selectm dintr-o list departamentul din care
face parte profesorul. Lista, la fel ca i tabelul se ncarc automat la rularea aplicaiei.
Procedurile de actualizare i selectare a datelor sunt delcarate n OrarDAO.

Olteanu Alexandru

56

d) JFrameIntocmireOrar.java

n aceast fereastr se realizeaz efectiv programarea orelor. n partea de sus a


ferestrei avem 6 ComboBox-uri care listeaz datele care nu au fost nca programate.
Prima oar se va alege un loc i un timp pentru care va trebui s selectm formaiunea
de studiu ce vrem sa o programm, disciplina ce urmeaz sa o studieze n acel nterval i
tipul disciplinei, daca este Curs, Seminar sau Laborator. Odat selectate aceste valori nu
trebuie sa apar listate n continuare. Se poate observa ca pentru Sala CB 106 luni
dimineaa, pana la ora 12 nu se mai pot programa ore deoarece sala este ocupat.
n momentul apasri butonului de adugare programare, se introduc n tabela
Programare_ore valorile id-urilor pentru loc_timp i defalcare_ore. n urma unei metode
de select din programare_ore ComboBox-urile se elibereaz de datele care au fost deja
programate.
Gridul din partea de jos a ferestrei afiseaz n timp real programarile efectuate.
Butonul de Generare raport afiseaz un raport cu privire la situaia programrii pe ore.

Olteanu Alexandru

57

d) JFrameRapoarteX.java

Ferestrere de Rapoarte sunt create pentru a genera rapoarte despre orar din prisma
diferitelor criterii, cum ar fi profesori, sali sau an studiu.
Listele ncarca datele din tabele iar n momentul n care se apas butonul de generare
raport, acesta va afia ntr-o fereastr programarea respectivei categori pentru toat
saptamana.

Sursele cod pentru toate ferestrele de tip JFrame vor fi anexate n subcapitolul 3.4.4

Olteanu Alexandru

3.4 Anexe
3.4.1 Structura scriptului bazei de date.
DROP TABLE IF EXISTS "Zile";
DROP TABLE IF EXISTS "Sali";
DROP TABLE IF EXISTS "Ore";
DROP TABLE IF EXISTS "Mod";
DROP TABLE IF EXISTS "Programare_ore";
DROP TABLE IF EXISTS "Loc_timp";
DROP TABLE IF EXISTS "Defalcare_ore";
DROP TABLE IF EXISTS "Asociere_an_plan";
DROP TABLE IF EXISTS "Detalii_plan_scolarizare";
DROP TABLE IF EXISTS "Planuri_scolarizare";
DROP TABLE IF EXISTS "Profesori";
DROP TABLE IF EXISTS "Formatiuni_studiu";
DROP TABLE IF EXISTS "Departamente";
DROP TABLE IF EXISTS "Facultati";
-- Table: "Facultati"
--DROP TABLE IF EXISTS "Facultati";
CREATE TABLE "Facultati"
(
"Id" SERIAL,
"Denumire_facultate" character varying(80),
CONSTRAINT pk_facultati PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Facultati"
OWNER TO postgres;
-- Table: "Departamente"
--DROP TABLE IF EXISTS "Departamente";
CREATE TABLE "Departamente"
(
"Id" SERIAL,
"Denumire_departament" character varying(80),
"Id_facultate" integer NOT NULL,
CONSTRAINT pk_departamente PRIMARY KEY ("Id"),
CONSTRAINT fk_departamente FOREIGN KEY ("Id_facultate")
REFERENCES "Facultati" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Departamente"
OWNER TO postgres;
CREATE TABLE "Formatiuni_studiu"
(
"Id" SERIAL,
"Denumire" character varying(10) NOT NULL,

58

Olteanu Alexandru

"Id_parinte" integer,
CONSTRAINT pk_formatiuni PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Formatiuni_studiu"
OWNER TO postgres;
-- Table: "Profesori"
-- DROP TABLE "Profesori";
CREATE TABLE "Profesori"
(
"Id" SERIAL,
"Nume" character varying(50) NOT NULL,
"Id_dep" integer NOT NULL,
CONSTRAINT pk_profesori PRIMARY KEY ("Id"),
CONSTRAINT fk_profesori FOREIGN KEY ("Id_dep")
REFERENCES "Departamente" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Profesori"
OWNER TO postgres;
-- Table: "Planuri_scolarizare"
--DROP TABLE IF EXISTS "Planuri_scolarizare";
CREATE TABLE "Planuri_scolarizare"
(
"Id" SERIAL,
"Denumire_plan" character varying(20) NOT NULL,
CONSTRAINT pk_planuri PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Planuri_scolarizare"
OWNER TO postgres;
-- Table: "Detalii_plan_scolarizare"
--DROP TABLE IF EXISTS "Detalii_plan_scolarizare";
CREATE TABLE "Detalii_plan_scolarizare"
(
"Id" SERIAL,
"Disciplina" character varying(50) NOT NULL,
"Cod_disciplina" character varying(15) NOT NULL,
"C" integer NOT NULL,
"S" integer NOT NULL,
"L" integer NOT NULL,
"P" integer NOT NULL,
"PC" integer NOT NULL,
"Forma_evaluare" character varying(1) NOT NULL,
"Id_plan" integer NOT NULL,
"Semestru" character varying(5) NOT NULL,
"Tip_O_A_L" character(1),
"Id_departament" integer NOT NULL,
CONSTRAINT pk_detalii PRIMARY KEY ("Id"),

59

Olteanu Alexandru

CONSTRAINT fk_departament FOREIGN KEY ("Id_departament")


REFERENCES "Departamente" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_plan FOREIGN KEY ("Id_plan")
REFERENCES "Planuri_scolarizare" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Detalii_plan_scolarizare"
OWNER TO postgres;
-- Table: "Asociere_an_plan"
--DROP TABLE IF EXISTS "Asociere_an_plan";
CREATE TABLE "Asociere_an_plan"
(
"Id" SERIAL,
"Id_an" integer NOT NULL,
"Id_plan" integer NOT NULL,
CONSTRAINT pk_asocieri PRIMARY KEY ("Id"),
CONSTRAINT fk_an FOREIGN KEY ("Id_an")
REFERENCES "Formatiuni_studiu" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_plan FOREIGN KEY ("Id_plan")
REFERENCES "Planuri_scolarizare" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Asociere_an_plan"
OWNER TO postgres;
-- Table: "Defalcare_ore"
-- DROP TABLE IF EXISTS "Defalcare_ore";
CREATE TABLE "Defalcare_ore"
(
"Id" SERIAL,
"Id_formatiune" integer NOT NULL,
"Id_profesor" integer NOT NULL,
"Tip_ora" character(5) NOT NULL,
"Disciplina" character varying(50) NOT NULL,
"Nr_ore" integer NOT NULL,
CONSTRAINT pk_defalcare_ore PRIMARY KEY ("Id"),
CONSTRAINT fk_defalcare_p FOREIGN KEY ("Id_profesor")
REFERENCES "Profesori" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_defalcare_f FOREIGN KEY ("Id_formatiune")
REFERENCES "Formatiuni_studiu" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Defalcare_ore"
OWNER TO postgres;
-- Table: "Loc_timp"

60

Olteanu Alexandru

-- DROP TABLE IF EXISTS "Loc_timp" ;

CREATE TABLE "Loc_timp"


(
"Id" SERIAL,
"Id_sala" integer NOT NULL,
"Id_zi" integer NOT NULL,
"Id_ora" integer NOT NULL,
"Id_mod" integer NOT NULL,
CONSTRAINT pk_loc_timp PRIMARY KEY("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Loc_timp"
OWNER TO postgres;
-- Table: "Programare_ore"
-- DROP TABLE IF EXISTS "Programare_ore";
CREATE TABLE "Programare_ore"
(
"Id" SERIAL,
"Id_loc_timp" integer NOT NULL,
"Id_defalcare" integer NOT NULL,
CONSTRAINT pk_programare PRIMARY KEY ("Id"),
CONSTRAINT fk_loc_timp FOREIGN KEY ("Id_loc_timp")
REFERENCES "Loc_timp" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_defalcare FOREIGN KEY ("Id_defalcare")
REFERENCES "Defalcare_ore" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Programare_ore"
OWNER TO postgres;

-- Table: "Mod"
-- DROP TABLE IF EXISTS "Mod";
CREATE TABLE "Mod"
(
"Id" SERIAL,
"Denumire" character varying(10) NOT NULL,
CONSTRAINT pk_mod PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Mod"
OWNER TO postgres;

61

Olteanu Alexandru

-- Table: "Ore"
-- DROP TABLE IF EXISTS "Ore";
CREATE TABLE "Ore"
(
"Id" SERIAL,
"Denumire" character varying(10) NOT NULL,
CONSTRAINT pk_ore PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Ore"
OWNER TO postgres;
-- Table: "Sali"
-- DROP TABLE IF EXISTS "Sali";
CREATE TABLE "Sali"
(
"Id" SERIAL,
"Denumire" character varying(10) NOT NULL,
CONSTRAINT pk_sali PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Sali"
OWNER TO postgres;
-- Table: "Zile"
-- DROP TABLE IF EXISTS "Zile";
CREATE TABLE "Zile"
(
"Id" SERIAL,
"Denumire" character varying(10) NOT NULL,
CONSTRAINT pk_zile PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Zile"
OWNER TO postgres;

3.4.2 Codul Java pentru pachetul DB.


Codul pentru constructorul Formatiuni
package DB;
public class Formatiuni {
private int id;

62

Olteanu Alexandru

private String denumire;


private int id_parinte;
public Formatiuni(int id, String denumire, int id_parinte) {
this.id = id;
this.denumire = denumire;
this.id_parinte = id_parinte;
}
public Formatiuni() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDenumire() {
return denumire;
}
public void setDenumire(String denumire) {
this.denumire = denumire;
}
public int getId_parinte() {
return id_parinte;
}
public void setId_parinte(int id_parinte) {
this.id_parinte = id_parinte;
}
}
Constructorul Loc_timp. Ceilali constructori sunt asemntori i se construiesc analog.
package DB;
public class Loc_timp {
private int id;
private int id_sala;
private int id_zi;
private int id_ora;
private int id_mod;
private String disponibilitate;
public Loc_timp(int id, int id_sala, int id_zi, int id_ora, int id_mod, String disponibilitate) {
this.id = id;
this.id_sala = id_sala;
this.id_zi = id_zi;
this.id_ora = id_ora;
this.id_mod = id_mod;
this.disponibilitate = disponibilitate;
}
public Loc_timp() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;

63

Olteanu Alexandru

}
public int getId_sala() {
return id_sala;
}
public void setId_sala(int id_sala) {
this.id_sala = id_sala;
}
public int getId_zi() {
return id_zi;
}
public void setId_zi(int id_zi) {
this.id_zi = id_zi;
}
public int getId_ora() {
return id_ora;
}
public void setId_ora(int id_ora) {
this.id_ora = id_ora;
}
public int getId_mod() {
return id_mod;
}
public void setId_mod(int id_mod) {
this.id_mod = id_mod;
}
public String getDisponibilitate() {
return disponibilitate;
}
public void setDisponibilitate(String disponibilitate) {
this.disponibilitate = disponibilitate;
}
}

3.4.3 Codul Java pentru pachetul OrarDAO


.
package DAO;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import DB.*;
public class OrarDAO {
private final static String DB_CONNECTION_URL = "jdbc:postgresql://127.0.0.1:5432/TestOrar";
private final static String DRIVER_CLASS_NAME = "org.postgresql.Driver";
private final static String USER = "postgres";
private static final String PASSWORD = "aezakmihesoyam";
private static Connection databaseConnection = null;
static {
try {

64

Olteanu Alexandru

Class.forName(DRIVER_CLASS_NAME).newInstance();
} catch (Exception ex) {
ex.printStackTrace();
}
try {
databaseConnection = DriverManager.getConnection(DB_CONNECTION_URL, USER,
PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
}
//Facultati
public static boolean insertFacultate(Facultate f) {
boolean isInserted = false;
if (databaseConnection != null) {
String sql = "INSERT INTO \"Facultati\" (\"Id\", \"Denumire_facultate\") VALUES(?,?)";
try {
PreparedStatement insertStatement = databaseConnection.prepareStatement(sql);
insertStatement.setInt(1, f.getId());
insertStatement.setString(2, f.getDenumire());
insertStatement.execute();
isInserted = true;
} catch (SQLException e) {
e.printStackTrace();
}
}
return isInserted;
}
//Listeaza formatiunile
public static List<Formatiuni> selectFormatiuni() {
List<Formatiuni> formatiuni = null;
String sql = "SELECT * FROM \"Formatiuni_studiu\" "
+ "WHERE \"Id_parinte\" = 0 ORDER BY (\"Denumire\")";
try {
PreparedStatement selectStatement = databaseConnection.prepareStatement(sql);
ResultSet results = selectStatement.executeQuery();
formatiuni = new ArrayList<Formatiuni>();
while (results.next()) {
Formatiuni fo = new Formatiuni();
fo.setId(results.getInt(1));
fo.setDenumire(results.getString(2));
fo.setId_parinte(results.getInt(3));
formatiuni.add(fo);
}

65

Olteanu Alexandru

66

} catch (SQLException e) {
e.printStackTrace();
}
return formatiuni;
}
public static List<Formatiuni> selectFormatiuni(int id_zi, int id_ora) {
List<Formatiuni> formatiuni = null;
String sql = "select * from \"Formatiuni_studiu\" fo where fo.\"Id\" not in "
+ "(select def.\"Id_formatiune\" from \"Defalcare_ore\" def, \"Loc_timp\" lt, \"Programare_ore\"
po where "
+ "def.\"Id\"= po.\"Id_defalcare\" and lt.\"Id\" = po.\"Id_loc_timp\" and lt.\"Id_zi\" = ? and
lt.\"Id_ora\" = ?)AND fo.\"Id_parinte\" not in "
+ "(select def.\"Id_formatiune\" from \"Defalcare_ore\" def, \"Loc_timp\" lt, \"Programare_ore\"
po where "
+ "def.\"Id\"= po.\"Id_defalcare\" and lt.\"Id\" = po.\"Id_loc_timp\" and lt.\"Id_zi\" = ? and
lt.\"Id_ora\" = ? )";
try {
PreparedStatement selectStatement = databaseConnection.prepareStatement(sql);
selectStatement.setInt(1, id_zi);
selectStatement.setInt(2, id_ora);
selectStatement.setInt(3, id_zi);
selectStatement.setInt(4, id_ora);
formatiuni = new ArrayList<Formatiuni>();
ResultSet results = selectStatement.executeQuery();
while (results.next()) {
Formatiuni fo = new Formatiuni();
fo.setId(results.getInt(1));
fo.setDenumire(results.getString(2));
fo.setId_parinte(results.getInt(3));
formatiuni.add(fo);
}
} catch (SQLException e) {
e.printStackTrace();
}
return formatiuni;
}
public static List<Ore> selectOre(int id_sala, int id_zi) {
List<Ore> ore = null;
String sql = "select * from \"Ore\" o where o.\"Id\" in \n"
+ "(select lt.\"Id_ora\" from \"Loc_timp\" lt where \n"
+ "lt.\"Id\" not in (select \"Id_loc_timp\" from \"Programare_ore\") and lt.\"Id_sala\" = ? and
lt.\"Id_zi\" = ? order by o.\"Id\"\n"
+ ") ";
try {
PreparedStatement selectStatement = databaseConnection.prepareStatement(sql);

Olteanu Alexandru

selectStatement.setInt(1, id_sala);
selectStatement.setInt(2, id_zi);
ResultSet results = selectStatement.executeQuery();
ore = new ArrayList<Ore>();
while (results.next()) {
Ore o = new Ore();
o.setId(results.getInt(1));
o.setDenumire(results.getString(2));
ore.add(o);
}
} catch (SQLException e) {
e.printStackTrace();
}
return ore;
}
public static boolean deleteOre(int id) {
boolean isDeleted = false;
String sql = "DELETE from \"Ore\" where \"Id\" = ?";
try {
PreparedStatement statement = databaseConnection.prepareStatement(sql);
statement.setInt(1, id);
int del = statement.executeUpdate();
if (del == 1) {
isDeleted = true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return isDeleted;
}
public static List<Zile> selectZile(int id_sala) {
List<Zile> zile = null;
String sql = "select distinct \"Id\", \"Denumire\" from \"Zile\" z where z.\"Id\" in "
+ "(select lt.\"Id_zi\" from \"Loc_timp\" lt where "
+ "lt.\"Id\" not in (select \"Id_loc_timp\" from \"Programare_ore\") "
+ "and lt.\"Id_sala\" = ?) order by \"Id\" ";
try {
PreparedStatement selectStatement = databaseConnection.prepareStatement(sql);
selectStatement.setInt(1, id_sala);
ResultSet results = selectStatement.executeQuery();
zile = new ArrayList<Zile>();
while (results.next()) {
Zile z = new Zile();
z.setId(results.getInt(1));
z.setDenumire(results.getString(2));

67

Olteanu Alexandru

zile.add(z);
}
} catch (SQLException e) {
e.printStackTrace();
}
return zile;
}

3.4.3 Codul Java pentru UI


package UI;
import DB.*;
import DAO.*;
import producehtml.MotorHTML;
import java.util.List;
import java.awt.*;
import javax.swing.JLabel;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

;
public class JFrameIntocmireOrar extends javax.swing.JFrame {
JLabel[][] to = new JLabel[5][5];
List<Sali> saliExistente;
List<Zile> zileExistente;
List<Ore> oreExistente;
List<Formatiuni> formatiuniExistente;
boolean first = true;
public JFrameIntocmireOrar() {
initComponents();
saliExistente = OrarDAO.selectSali();
for (Sali s : saliExistente) {
jComboBoxSala.addItem(s.getDenumire());
}
int inds = jComboBoxSala.getSelectedIndex();
int ids = saliExistente.get(inds).getId();
jPanel2.setLayout(new GridLayout(5, 5, 160, 80));
to = new JLabel[5][5];
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) { // verificare programare loc_timp
int id_lt = OrarDAO.selectLoc_timp(ids, j + 1, i + 1);

68

Olteanu Alexandru

if (OrarDAO.verificaLoc_timp(id_lt)) {
to[i][j] = new JLabel("Liber");
to[i][j].setBackground(Color.green);
to[i][j].createToolTip();
} else {
to[i][j] = new JLabel("Ocupat");
to[i][j].setBackground(Color.red);
to[i][j].createToolTip();
to[i][j].setToolTipText(OrarDAO.selectDetaliiProgramareS(ids, j+1, i+1,"T"));
}
to[i][j].setOpaque(true);
jPanel2.add(to[i][j]);
}
}
jPanel2.revalidate();
}
private void jComboBoxSalaActionPerformed(java.awt.event.ActionEvent evt) {
jComboBoxZiua.removeAllItems();
int inds = jComboBoxSala.getSelectedIndex();
int ids = saliExistente.get(inds).getId();
zileExistente = OrarDAO.selectZile(ids);
for (Zile z : zileExistente) {
jComboBoxZiua.addItem(z.getDenumire());
}
if (!first) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) { // verificare programare loc_timp
int id_lt = OrarDAO.selectLoc_timp(ids, j + 1, i + 1);
if (OrarDAO.verificaLoc_timp(id_lt)) {
to[i][j].setText("Liber");
to[i][j].setBackground(Color.green);
to[i][j].setToolTipText("");
} else {
to[i][j].setText("Ocupat");
to[i][j].setBackground(Color.red);
to[i][j].setToolTipText(OrarDAO.selectDetaliiProgramareS(ids, j+1, i+1,"T"));
}
}
}
} else {
first = false;
}
}
private void jComboBoxZiuaActionPerformed(java.awt.event.ActionEvent evt) {
jComboBoxOra.removeAllItems();
int inds = jComboBoxSala.getSelectedIndex();
int ids = saliExistente.get(inds).getId();
int indz = jComboBoxZiua.getSelectedIndex();
if (indz >= 0) {

69

Olteanu Alexandru

int idz = zileExistente.get(indz).getId();


oreExistente = OrarDAO.selectOre(ids, idz);
for (Ore o : oreExistente) {
jComboBoxOra.addItem(o.getDenumire());
}
}
}
private void jComboBoxOraActionPerformed(java.awt.event.ActionEvent evt) {
jComboBoxFormatiuni.removeAllItems();
int indz = jComboBoxZiua.getSelectedIndex();
if (indz >= 0) {
int idz = zileExistente.get(indz).getId();
int indo = jComboBoxOra.getSelectedIndex();
if (indo >= 0) {
int ido = oreExistente.get(indo).getId();
formatiuniExistente = OrarDAO.selectFormatiuni(idz, ido);
for (Formatiuni fo : formatiuniExistente) {
jComboBoxFormatiuni.addItem(fo.getDenumire());
}
}
}
}
private void jButtonAdaugaProgramareActionPerformed(java.awt.event.ActionEvent evt) {
int j = jComboBoxZiua.getSelectedIndex();
int i = jComboBoxOra.getSelectedIndex();
int k = jComboBoxSala.getSelectedIndex();
int ids = saliExistente.get(k).getId();
int idz = zileExistente.get(j).getId();
int ido = oreExistente.get(i).getId();
int id_lt = OrarDAO.selectLoc_timp(ids, idz, ido);
int indfs = jComboBoxFormatiuni.getSelectedIndex();
String formatiune = formatiuniExistente.get(indfs).getDenumire();
int idfs = formatiuniExistente.get(indfs).getId();
String disciplina = (String) jComboBoxDisciplina.getSelectedItem();
String tip_ora = (String) jComboBoxTip_ora.getSelectedItem();
String profesor = OrarDAO.selectProfesor(idfs, disciplina, tip_ora);
int id_defalcare = OrarDAO.selectDefalcare(idfs, disciplina, tip_ora);
boolean rez = OrarDAO.insertProgramareOre(id_lt, id_defalcare);
if (rez) {
jTextFieldMsg.setText(" Programare efectuata!");
} else {
jTextFieldMsg.setText(" ");
}
to[ido - 1][idz - 1].setBackground(Color.red);
to[ido - 1][idz - 1].setText("Ocupat");
to[ido - 1][idz - 1].createToolTip();

70

Olteanu Alexandru

71

to[ido - 1][idz - 1].setToolTipText(formatiune + " " + disciplina + " " +tip_ora + " Profesor " +
profesor );
jComboBoxZiua.removeAllItems();
zileExistente = OrarDAO.selectZile(ids);
for (Zile z : zileExistente) {
jComboBoxZiua.addItem(z.getDenumire());
}
}
private void jButtonGenerareActionPerformed(java.awt.event.ActionEvent evt) {
Object[][] orarSala = new Object[6][6];
orarSala[0][0] = "*";
orarSala[0][1] = "Luni";
orarSala[0][2] = "Marti";
orarSala[0][3] = "Miercuri";
orarSala[0][4] = "Joi";
orarSala[0][5] = "Vineri";
orarSala[1][0] = "8-10";
orarSala[2][0] = "10-12";
orarSala[3][0] = "12-14";
orarSala[4][0] = "14-16";
orarSala[5][0] = "16-18";
int inds = jComboBoxSala.getSelectedIndex();
int ids = saliExistente.get(inds).getId();
// Completare Tabel
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) { // verificare programare loc_timp
int id_lt = OrarDAO.selectLoc_timp(ids, j + 1, i + 1);
if (OrarDAO.verificaLoc_timp(id_lt)) {
orarSala[i+1][j+1] = " ";
} else {
orarSala[i+1][j+1] = OrarDAO.selectDetaliiProgramareS(ids, j+1, i+1, "R") ;
}
}
}
// generare HTML
String title = "Orar sali";
String h1 = "Orar sala:";
String h2 = saliExistente.get(inds).getDenumire();
String body ="Orar provizoriu";
String footer = "";
String raportOrar = MotorHTML.completeHTML(title, h1, h2, orarSala, body,footer);
MotorHTML.string2File(raportOrar, "D://Raport.html");
File f = new File("D://Raport.html");
try {
Desktop.getDesktop().browse(f.toURI());
} catch (IOException ex) {
Logger.getLogger(JFrameIntocmireOrar.class.getName()).log(Level.SEVERE, null, ex);
}
}

Olteanu Alexandru

72

private void jComboBoxFormatiuniActionPerformed(java.awt.event.ActionEvent evt) {


jComboBoxDisciplina.removeAllItems();
int indfs = jComboBoxFormatiuni.getSelectedIndex();
if (indfs >= 0) {
int idfs = formatiuniExistente.get(indfs).getId();
String [] discipline = OrarDAO.selectDisciplina(idfs);
for (String d : discipline) {
jComboBoxDisciplina.addItem(d);
}
}
}
private void jComboBoxDisciplinaActionPerformed(java.awt.event.ActionEvent evt) {
jComboBoxTip_ora.removeAllItems();
int indfs = jComboBoxFormatiuni.getSelectedIndex();
if(indfs >= 0) {
int idfs = formatiuniExistente.get(indfs).getId();
String disciplina = (String) jComboBoxDisciplina.getSelectedItem();

String [] tipOre = OrarDAO.selectTipOre(idfs, disciplina) ;


for (String t : tipOre) {
jComboBoxTip_ora.addItem(t);
}
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(JFrameIntocmireOrar.class.getName()).log(java.util.logging.Level.SE
VERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(JFrameIntocmireOrar.class.getName()).log(java.util.logging.Level.SE
VERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(JFrameIntocmireOrar.class.getName()).log(java.util.logging.Level.SE
VERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {

Olteanu Alexandru

73

java.util.logging.Logger.getLogger(JFrameIntocmireOrar.class.getName()).log(java.util.logging.Level.SE
VERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JFrameIntocmireOrar().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonAdaugaProgramare;
private javax.swing.JButton jButtonGenerare;
private javax.swing.JComboBox jComboBoxDisciplina;
private javax.swing.JComboBox jComboBoxFormatiuni;
private javax.swing.JComboBox jComboBoxOra;
private javax.swing.JComboBox jComboBoxSala;
private javax.swing.JComboBox jComboBoxTip_ora;
private javax.swing.JComboBox jComboBoxZiua;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel11;
private javax.swing.JLabel jLabel12;
private javax.swing.JLabel jLabel13;
private javax.swing.JLabel jLabel14;
private javax.swing.JLabel jLabel15;
private javax.swing.JLabel jLabel16;
private javax.swing.JLabel jLabel17;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JTextField jTextFieldMsg;
// End of variables declaration
}

package UI;
import DB.*;
import DAO.*;
import java.util.List;
import javax.swing.table.DefaultTableModel;
public class JFrameProfesori extends javax.swing.JFrame {
List<Profesori> profesoriExistenti;

Olteanu Alexandru

List<Departament> departamenteExistente;
public JFrameProfesori() {
initComponents();
departamenteExistente = OrarDAO.selectDepartamente();
for (Departament d : departamenteExistente) {
jComboBoxDepartament.addItem(d.getId() + "." + d.getDenumire());
umpleTabelProf();
}
}
private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {
int ind = jTable1.getSelectedRow();
Profesori p = profesoriExistenti.get(ind);
String nume = p.getNume();
jTextFieldNume.setText(nume);
}
private void jButtonStergeActionPerformed(java.awt.event.ActionEvent evt) {
int ind = jTable1.getSelectedRow();
Profesori p = profesoriExistenti.get(ind);
int id = p.getId();
boolean rez = OrarDAO.deleteProfesor(id);
if (rez) {
jTextFieldMsg.setText(id + " Sters!");
} else {
jTextFieldMsg.setText("Eroare!");
}
umpleTabelProf();
jTextFieldNume.setText("");
}
private void jButtonModificaActionPerformed(java.awt.event.ActionEvent evt) {
int ind = jTable1.getSelectedRow();
Profesori p = profesoriExistenti.get(ind);
int id = p.getId();
String nume = jTextFieldNume.getText();
boolean rez = OrarDAO.updateProfesor(id, nume);
if (rez) {
jTextFieldMsg.setText(id + " Modificat!");
} else {
jTextFieldMsg.setText("Eroare!");
}
umpleTabelProf();
jTextFieldNume.setText("");
}
private void jButtonAdaugaActionPerformed(java.awt.event.ActionEvent evt) {
String nume = jTextFieldNume.getText();
int id = 0;
int ind = jComboBoxDepartament.getSelectedIndex();
Departament d = departamenteExistente.get(ind);
int id_dep = d.getId();
Profesori p = new Profesori(0, nume, id_dep);
boolean rez = OrarDAO.insertProfesor(p);
if (rez) {

74

Olteanu Alexandru

jTextFieldMsg.setText(" Adaugat!");
umpleTabelProf();
} else {
jTextFieldMsg.setText("Eroare!");
}
}
private void jComboBoxDepartamentActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
private void umpleTabelProf() {
tableModel = new javax.swing.table.DefaultTableModel(
new Object[][]{},
new String[]{
"Id", "Nume", "Departament"
}
){
Class[] types = new Class[]{
java.lang.Integer.class, java.lang.String.class, java.lang.String.class
};
public Class getColumnClass(int columnIndex) {
return types[columnIndex];
}
;
};
int ind = jComboBoxDepartament.getSelectedIndex();
profesoriExistenti = OrarDAO.selectProfesori();
for (Profesori p : profesoriExistenti) {
tableModel.addRow(new Object[]{p.getId(), p.getNume(), p.getId_dep()});
}
jTable1.setModel(tableModel);
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JFrameProfesori().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonAdauga;
private javax.swing.JButton jButtonModifica;
private javax.swing.JButton jButtonSterge;
private javax.swing.JComboBox jComboBoxDepartament;
private javax.swing.JLabel jLabelDepartament;
private javax.swing.JLabel jLabelNume;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTable jTable1;
private javax.swing.JTextField jTextFieldMsg;
private javax.swing.JTextField jTextFieldNume;
// End of variables declaration
private DefaultTableModel tableModel;
}
Similar pentru celelalte JFrame, doar denumirile componentelor se vor schimba

75

Olteanu Alexandru

76

Bibliografie
[1] Vasilache, Tiberiu; Curs Baze de date; Facultatea de tiine aplicate, 2014;
[2] Vasilache, Tiberiu; Curs Programare orientat obiect; Facultatea de tiine aplicate,
2014;
[3] Frsinaru, Cristian; Curs practic de Java;
[4] Rdulescu, Florin; Curs Proiectarea bazelor de date;
[5] Tnas, tefan; Olariu, Cristian; Andrei,tefan; Java de la 0 la Expert;
Ed,Polirom,2003;
[6] Akeel,I Din; Structured Query Language (SQL) - A practical introduction;
Editura Blackwell;
[7] Wiener,Richard; Pinson,Lewis J.; Fundamentals of OOP and Data Structures
in Java;
[8] Lemay,Laura; Perkins,Charles L.; "Teach Yourself Java in 21 days";
[9] Bracha,Gilad; Generics in the Java Programming Language; 2004;
[10] Forta, B. (2002). SQL pentru incepatori. Bucuresti: Teora.
Surse online:
[1] http://www.biblioteca-digitala.ase.ro/biblioteca/biblioteca1.asp?id=11
[2] http://worknetlab.no-ip.org/.../DespremasinavirtualaJava.html
[3]http://automatica.cch.ro/Laboratoare/Indrumar%20laborator%20Baze%20de%20date
.pdf
[4] Referina P1: http://thor.info.uaic.ro/~acf/java/curs/5/interf_grafica.html
[5] http://www.postgresql.org/docs/
[6] https://netbeans.org/kb/index.html

Вам также может понравиться