Sunteți pe pagina 1din 38

74

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 şi 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 exemplele care vor fi prezentate în continuare a fost folosită arhiva


ojdbc14_g.jar.
75

Principalele clase din JDBC


Pentru realizarea unei aplicaŃii care accesează un server de baze de date JDBC
defineşte o serie de clase, cele mai utilizate fiind Connection, Statement,
PreparedStatement şi ResultSet.
Notă: Este esenŃial ca după utilizarea lor obiectele JDBC să fie suprimate prin
apelul metodei close() definită pentru toate clasele menŃionate.

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:biblio/bibpas@193.226.7.210:1521/XE");
cnx = ods.getConnection(); // cnx apartine clasei Connection
} catch ( SQLException sqlException ) {
System.out.println("Conectare imposibila.");
System.exit( 1 );
}

Şirul de caractere subliniat conŃine schema (biblio), parola (bibpas), IP-ul


serverului pe care rulează Oracle XE (193.226.7.210) ş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();

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ă
76

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();

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 rs = stmt.executeQuery( "SELECT * FROM Edituri order by nume"
);
while ( rs.next() ) {
System.out.println( rs.getString("nume") );
}
77

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 nici 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.

Metode JDBC get*() Tip dată SQL Tip Java


getBit( ) BIT boolean
getByte( ) TINYINT byte
getShort( ) SMALLINT short
getInt( ) INTEGER int
getLong( ) BIGINT long
getFloat( ) REAL float
getDouble( ) DOUBLE double
getString( ) CHAR String
78

Metode JDBC get*() Tip dată SQL Tip Java


getString( ) VARCHAR String
getString( ) LONGVARCHAR String
getDate( ) DATE java.sql.Date
getTimeStamp( ) TIME java.sql.Date
getObject( ) BLOB Object

ObservaŃie: 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. Dacă tabelul edituri are două câmpuri, Cod_edit şi Nume,
pentru exemplul dat acelaşi rezultat se putea obŃine deci scriind :
System.out.println( rs.getString(2) );

O mulŃime de selecŃie poate servi la actualizarea datelor din tabele folosite la


crearea ei. Pentru aceasta obiectul de tip Statement folosit la trimiterea comenzii
select trebuie declarat astfel:

Statement stmt = con.createStatement(


ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);

Corectarea datelor din tabele se realizează ca în exemplul următor:

ResultSet rs = stmt.executeQuery("SELECT * FROM Edituri order by nume


");
rs.absolute(5); // mută cursorul pe a linia 5 din rs
rs.updateString("NUME", "Teora"); // corecteaza câmpul NUME
rs.updateRow(); // se trimite sursei de date linia 5

Pentru inserarea unei noi linii folosind o mulŃime de selecŃie se va folosi o linie
creată în acest scop prin apelul metodei moveToInsertRow(). În această linie pot fi
apoi adăugate valorile dorite folosind metode update*() (updateInt(), updateString()
etc). Exemplu:
rs.moveToInsertRow(); // mută cursorul pe linia suplimentară creată
rs.updateInt(1, "23"); // impune valoarea pt. primul câmp
rs.updateString(2,"Casa cartii"); // idem, câmpul 2
rs.insertRow();
rs.moveToCurrentRow();
79

Un ResultSet este închis prin apelul metodei close() sau automat, la


închiderea obiectului Statement folosit la crearea sa respectiv la reconstruire
(reexecutarea interogării).

Clasa PreparedStatement
Deoarece trimiterea efectivă a unei comenzi SQL folosind un obiect din clasa
Statement presupune derularea în prealabil a unui proces de analiză sintactică şi de
construire a unei comenzi acceptate de serverul de baze de date, în cazul trimiterii
repetate a aceleiaşi comenzi SQL se poate câştiga timp dacă procesul de pregătire
menŃionat se derulează o singură dată pentru tot setul de comenzi. Pentru a realiza
acest lucru este necesar însă ca în locul obiectului din clasa Statement să se declare
un obiect din clasa înrudită PreparedStatement. Exemplu:

PreparedStatement ps = cnx.prepareStatement("INSERT INTO Edituri


VALUES(?,?)");
ps.setInt(1, 12);
ps.setString(2, "Minerva");
ps.executeUpdate();
ps.setInt(1, 13);
ps.setString(2, "Orizonturi");
ps.executeUpdate();
ps.setInt(1, 14);
ps.setString(2, "Dacia");
ps.executeUpdate();

ps.close;

ObservaŃie: Şirul de caractere care conŃine comanda care urmează să fie


executată repetat poate conŃine caractere '?' care indică poziŃiile pe care vor fi
inserate valori noi înaintea reapelării metodei executeUpdate() (sau executeQuery(),
după caz). Pentru inserare se apelează una dintre metodele set*() din tabelul
următor, în funcŃie de tipul valorii inserate.

Tip dată Oracle metodă set*()

CHAR setString()
VARCHAR2 setString()
setBigDecimal()
setBoolean()
setByte()
setShort()
NUMBER
setInt()
setLong()
setFloat()
setDouble()
INTEGER setInt()
80

FLOAT setDouble()
CLOB setClob()
BLOB setBlob()
RAW setBytes()
LONGRAW setBytes()
setDate()
DATE setTime()
setTimestamp()

Primul parametru al metodei set*() indică în câta dintre poziŃiile marcate cu


'?' se va face inserarea, numerotarea acestora începând cu '1'.

Clasa CallableStatement
Un obiect de tip CallableStatement permite lansarea în execuŃie a unei
proceduri stocate (scrisă în PL SQL de exemplu).
Crearea unui obiect din clasa CallableStatement se realizează ca în exemplele
următoare:
a. Procedură stocată fără parametri:
CallableStatement cs = cnx.prepareCall("{call procst}");
b. Procedură stocată având 2 parametri:
CallableStatement cs = cnx.prepareCall("{call procstoc(?, ?)}");
cs.setString(1,theuser);
cs.setString(2,password);
cs.executeQuery();

c. Procedură având doi parametri de intrare, unul de ieşire şi care returnează


o mulŃime de selecŃie

CallableStatement cs = cnx.prepareCall("{call proc3p(?,?,?)}");


cs.setString(1,theuser);
cs.setString(2,password);
cs.registerOutParameter(3,Types.DATE);

cs.executeQuery();
Date dataconect = cs.getDate(3);

Realizarea interfeŃei aplicaŃiei

1. Se porneşte mediul de programare (NetBeans 5.5 IDE sau o versiune


ulterioară) ;

2. Se demarează un nou proiect (File / New Project ... sau se apasa


butonul );
81

3. Se defineşte numele proiectului (Biblio), se deselectează caseta de


validare Create Main Class şi se apasă Finish. Deselectarea casetei Create Main va
opri crearea unei clase principale. 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()).

Se deselectează!
82

4. Se adaugă proiectului arhiva ojdbc14_g.jar:

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>.
83

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.

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 :
84

În fereastra care se afişează se introduce numele noii clase. Fiind clasa


principală a aplicaŃiei, ea va purta numele proiectului, Biblio. În fereastra New
JFrame Form este bine să se indice de asemenea numele unui nou pachet care va
înlocui pachetul implicit şi va coŃine fişierele sursă ale aplicaŃiei.
85

Vizualizare sursă în Java Vizualizare mod grafic Controale Windows

ConŃinut fereastră

Componentele interfeŃei ProprietăŃi


86

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

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 Biblio.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:


87

- Se completează constructorului clasei Biblio:

public class Biblio extends javax.swing.JFrame {

/** Creates new form Biblio */


public Biblio() {
// Creez conexiunea cu serverul
try {
OracleDataSource ods = new OracleDataSource();

ods.setURL("jdbc:oracle:thin:biblio/biblio@localhost:1521/XE");
cnx = ods.getConnection();
88

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":
89

Realizarea formularelor

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 afişate;
• 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 datele este definit prin lege.
AplicaŃia trebuie să asigure afişarea pe ecran şi imprimarea rapoartelor.

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 anumeite 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ă.

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
Biblio, se va proceda astfel:

a. Se adaugă proiectului bara cu meniuri derulante:


90

Se va selecta cu mouse-ul JMenubar şi se va realiza adăugarea sa printr-un clic cu


mouse-ul în fereastra aplicaŃiei.

clic

selectat
În continuare se va edita conŃinutul barei cu meniuri folosind reprezentarea
arborescentă afişată prin selectarea tabului Inspector.
b. Se modifică numele primului meniu derulant (proprietatea text):

selectat
modificarea proprietăŃii text

c. Se adaugă meniului OperaŃii opŃiunea Iesire. Efectul selectării acesteia va fi


oprirea aplicaŃiei.
91

selectat
modificarea proprietăŃii text

d. Se adaugă barei cu meniuri un al doilea meniu derulant:

Rezultat:

Se modifică proprietatea text a noului obiect din Menu în Formulare:


92

selectat

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.
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:

dublu clic

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.

JLabel
Controlul de tip JLabel serveşte la plasarea într-un formular a unui text sau a
unei imagini.
93

După includerea controlului trebuie setate principalele proprietăŃi ale acestuia,


respectiv text sau icon pentru definirea conŃinutului, font, foreground, background
ş.a.

ProprietăŃile icon şi text se pot folosi împreună. Dacă se selectează icon


trebuie indicat fişierul care conŃine imaginea de afişat, aceasta fiind în format JPEG
(Joint Photographic Experts Group, având extensia .jpg) sau GIF (Graphics
Interchange Format având extensia .gif).
94

JTextField

Controlul de tip JTextField, este folosit la afişarea sau introducerea şirurilor de


caractere.
Accesul la conŃinutul unui control de tip JTextField se realizează cu perechea
de metode setText() (impunere String conŃinut) şi getText() (preluare String
conŃinut) ca în exemplul următor:

nume_ed.setText(nm);
. . .
String nume = nume_ed.getText();

Exemplu fundamental : Să se adauge aplicaŃiei un formular care permite


navigarea în tabelul Edituri. Pentru navigare se vor folosi două butoane (Inainte
respectiv Inapoi).
Rezolvare:
Î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 şi a
ferestrei principale (sau, mai general, fereastra aplicaŃiei în cadrul căreia se va afişa
noua fereatră).

Pentru a edita fereastra de dialog se selectează cu un dublu clic în fereastra


Inspector identificatorul acesteia:

dublu clic
95

nume_ed

Se adaugă ferestrei de dialog cinci controale. Controlul de tip JTextField i se schimbă


numele în nume_ed şi se deselectează proprietatea editable deoarece conŃinutul
acestui control nu poate fi modificat de operator. Numele butoanelor se schimbă în
ed_prec, ed_urm şi gata.

Pentru a modifica etichetele butoanelor se accesează proprietatea text a


acestora sau se selectează controlul cu butonul stâng al mouse-ului şi se selectează
Edit Text în meniul contextual.

Deoarece rolul acestui formular este parcurgerea tabelului Edituri, clasei


principale i se va adăuga un obiect din clasa ResultSet denumit rezultat. Acesta va fi
iniŃializat într-o secvenŃă de cod executată la deschiderea formularului şi va fi închis
(se va apela metoda close()) la închiderea acestuia. De asemenea se va adăuga
clasei principale obiectul comanda aprŃinând clasei Statement. Acesta va conŃine
comenzi SQL individuale care vor fi apoi trimise serverului Oracle XE.
96

Pentru a realiza acŃiuni înaintea afişării unui formular este necesară


adăugarea unei metode asociate evenimentului windowActivated .

Clic + Enter

În cazul formularului Edituri, metoda EdituriWindowActivated() astfel


adăugată va iniŃializa succesiv variabilele comanda (Statement) şi rezultat (ResultSet)
şi va plasa în controlul nume_ed numele primei edituri.

private void EdituriWindowActivated(java.awt.event.WindowEvent evt) {


// TODO add your handling code here:
try {
comanda = cnx.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
// resultSet poate fi parcurs in ambele sensuri - e
scrollable
// resultset nu reflecta modificarile facute de altii si
// permite update
rezultat = comanda.executeQuery("SELECT * FROM edituri");
if (rezultat.next()) // Trec pe prima linie
{// preiau numele
String nm = rezultat.getString("nume");
nume_ed.setText(nm);
}
} catch ( SQLException sqlException ) {
97

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 Edituri se procedează ca mai sus, evenimentul selectat fiind
windowDeactivated.

private void EdituriWindowDeactivated(java.awt.event.WindowEvent evt) {


// TODO add your handling code here:
try {
rezultat.close();
comanda.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}

Pentru a iniŃia introducerea secvenŃei de cod care trebuie executată la


acŃionarea unui buton se modifică proprietatea actionPerformed sau, mai simplu, se
selectează controlul cu butonul drept al mouse-ului şi apoi se selectează Events /
Action / actionPerformed folosind meniul contextual. Mediul de dezvoltare va include
automat o funcŃie de tratare a evenimentului al cărui conŃinut trebuie apoi editat:

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


// TODO add your handling code here:
try {
if(!rezultat.isLast()) // nu este pe ultima linie
{
ed_prec.setEnabled(true);
if (rezultat.next()) // Trec pe urmatoarea linie
{ // preiau numele
String nm = rezultat.getString("nume");
98

nume_ed.setText(nm);
}
} else {

ed_urm.setEnabled(false);
}
} catch (SQLException esq) {}
}

La fel se iniŃiază scrierea codului pentru celelalte două butoane, prec şi gata:

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


// TODO add your handling code here:
try {
if(!rezultat.isFirst()) // nu este pe prima linie
{
ed_urm.setEnabled(true);
if (rezultat.previous()) // Trec pe linia anterioara
{ // preiau numele
String nm = rezultat.getString("nume");
nume_ed.setText(nm);
}
} else {
ed_prec.setEnabled(false);

}
} catch (SQLException esq) {}
}

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


// TODO add your handling code here:
FormEdituri.setVisible(false);
}

Pentru a realiza afişarea ferestrei de dialog create se revine la fereastra


principală (clic pe JFrame) şi se va adăuga meniului aplicaŃiei meniul derulant
Formulare având ca primă opŃiune Afisare edituri.

dublu clic
99

Pentru a modifica proprietăŃile opŃiunii astfel adăugate, se selectează noua


opŃiune în fereastra Inspector şi se operează folosind fereastra Properties.

ConŃinutul metodei AEdituriActionPerformed() este următorul:


100

private void AEdituriActionPerformed(java.awt.event.ActionEvent evt)


{
// TODO add your handling code here:
Edituri.setLocation(120,170);
Edituri.setVisible(true);
Edituri.pack();
}

În continuare se poate executa aplicaŃia apăsând butonul .


101

Laborator nr. 7
InterfaŃa aplicaŃiei. Conexiune cu baza de date.

Realizarea interfeŃei unei aplicaŃii care accesează baza de date pentru evidenŃa câinilor.
1. PorniŃi serverul Oracle XE – Start -> Programs -> Oracle Database 10g Express Edition ->
Go To Database HomePage sau tastaŃi în Internet Explorer adresa http://127.0.0.1:8080/apex/
2. PorniŃi mediul de programare NetBeans.
3. CreaŃi un proiect :
• File / New Project (Java Application), nume – Caini ( se deselectează Create Main Class
!!!);
• adăugaŃi proiectului arhiva ojdbc14_g.jar (curs p. 82);
• creaŃi fereastra principală a aplicaŃiei:
 Urmând paşii File / New File -> Java Gui Form -> JFrame Form creaŃi clasa
principală (cu numele caini, package evidcaini), derivată din clasa JFrame, care
va conŃine metoda statică main();
 daŃi nume ferestrei şi impuneŃi poziŃia în care se va afişa fereastra creată -
Events – windowActivated;
 adăugaŃi
this.setLocation(150,150);
this.pack();
• realizaŃi modificările necesare comunicării cu serverul Oracle XE, baza de date caini.
 inseraŃi la începutul fişierului caini.java
import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;

 adăugaŃi clasei principale variabila cnx de tip Connection


(caini -> Source Packages -> evidcaini -> caini.java -> caini -> Fields -> Add
Field);
 completaŃi constructorul clasei caini
102

public caini( ) {

try {
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:caini/caini@localhost:1521/XE");
cnx = ods.getConnection();
System.out.println("Conectare Ok");
} catch ( SQLException sqlException ) {
System.out.println("Conectare imposibila.");
System.exit( 1 );
}
initComponents();
}

4. RealizaŃi câte-un proiect şi fereastra principală pentru toate bazele de date create în Oracle XE:

Biblio

Aeroport

Banca
103

5. Folosind aplicaŃiile realizate, afişaŃi în fereastra Output a mediului de programare date din baza
de date. Pentru aceasta adăugaŃi constructorului clasei principale două obiecte, comanda, de tip
Statement şi rez, de tip ResultSet astfel:

Statement comanda = cnx.createStatement();


ResultSet rez = comanda.executeQuery( "fraza SQL");

MulŃimea de selecŃie rez va conŃine rezultatul unei fraze SQL SELECT. În cazul primei aplicaŃii
folosiŃi fraza select * from caine.
AfişaŃi rezultatul:
while (rez.next()) {
System.out.println( rez.getString("rasa") );
}
comanda.close();

sau
Statement comanda = cnx.createStatement();
ResultSet rez = comanda.executeQuery("select rasa,talie from caine, talie where
talie.cod_talie = caine.cod_talie and talie.talie ='mare' ");
while (rez.next()) {
System.out.println(rez.getString("rasa")+" -- "+rez.getString("talie") );
}
comanda.close();

ObservaŃie: Pentru a evita greşelile de scriere, verificaŃi comenzile SQL folosite în cadrul
aplicaŃiilor folosind interfaŃa grafică a serverului Oracle XE.

6. În cazul celei de-a doua aplicaŃii încercaŃi comenzi de genul:


Statement comanda = cnx.createStatement();
104

ResultSet rez = comanda.executeQuery("select cod_cursa,oras,nume_companie,ora_sosire from


orase, compania, cursa where cursa.oras_sosire = orase.cod_oras and cursa.cod_companie =
compania.cod_companie order by cod_cursa");

while (rez.next()) {
System.out.println( rez.getString("cod_cursa")
+" -- "+rez.getString("nume_companie")
+" -- ora sosirii: "+rez.getString("ora_sosire"));
}
comanda.close();

sau
Lista pasagerilor care zboară
la Bucureşti şi compania
corespunzătoare zborului

toate cursele care aterizează


într-un anumit oraş pe parcursul
unei zile

toti pasagerii unei anumite curse,


indiferent de orasul de destinatie

7. Pentru a treia aplicaŃie:

toŃi clienii băncii şi numerele lor de telefon,


în ordine alfabetică

toate operatiunile efectuate de o persoana,


in oricare dintre conturile sale

toate operatiunile efectuate


in oricare dintre conturi intr-o zi
105

Laborator nr. 8

InterfaŃa aplicaŃiei. Meniu, submeniuri, controale. Citire din baza de date.

1. PorniŃi mediul de programare NetBeans.


2. AdăugaŃi proiectului creat pentru exploatarea bazei de date biblio o bară cu meniuri derulante
conŃinând meniurile: Fisier, Formulare, Rapoarte, Help astfel:
adăugaŃi proiectului un obiect JMenubar din fereastra Palette, apoi adăugaŃi-i acestuia cinci
meniuri derulante, modificănd textul acestora în fereastra proprietăŃi.

• adăugaŃi fiecărui meniu derulant opŃiunile care vor fi folosite în continuare


• pentru adăugarea unei opŃiuni (JMenuItem) într-un meniu derulant: clic dreapta pe JMenu -
> Add -> JMenuItem. AdăugaŃi opŃiunile:
- Fisier – Iesire;
- Rapoarte – Edituri, Cărti, Autori, Împrumuturi;
• pentru adăugarea într-un meniu derulant a unei componente de tip submeniu selectaŃi cu
butonul drept al mouse-ului JMenu1 -> Add -> JMenu . Valabil pentru :
- Formulare – Parcurgere, Adăugare, Situatii, Operatii;
- După declarare, submeniului i se pot adăuga opŃiuni.
• daŃi nume fiecărei intrări;
106

3. CreaŃi un prim formular pentru parcurgerea unui tabel din baza de date, de exemplu autori,
astfel:
• AdăugaŃi clasei principale un obiect din clasa JDialog. Pentru aceasta selectaŃi succesiv
fereastra principală şi controlul JDialog din fereastra Palette;
• selectaŃi cu un dublu clic identificatorul noii ferestre în fereastra Inspector;
• adăugaŃi cele două controale de tip JLabel (pentru titlul formularului şi eticheta "autorul"),
un control de tip JTextField şi cele trei controale de tip JButton;
• schimbaŃi textele corespunzătoare acestor controale;

JLabel

JTextField

JButton

• schimbaŃi numele controalelor (clic dreapta pe control în fereastra Inspector -> Change
Variable Name) astfel:
107

• adăugaŃi clasei principale două noi variabile (obiecte), rezultat, din clasa ResultSet
(iniŃializat la deschiderea formularului şi închis la ieşirea din acesta), şi comanda, din clasa
Statement (aceasta va conŃine comenzi SQL individuale care vor fi apoi trimise serverului
Oracle XE ). Pentru adăugarea variabilelor selectaŃi în arborele de definire a proiectului:
Biblio -> Source Packages -> Biblioteca -> Biblio.java ->Biblio -> Fields -> Add Field;

• ataşaŃi evenimentului windowActivated ( în fereastra Inspector : Form Biblio ->


Other Components -> Autori) metoda AutoriWindowActivated pentru a rula un cod la
deschiderea formularului. Metoda va conŃine:
- 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 autori");
if (rezultat.next())
{
String nm = rezultat.getString("nume");
numeaut.setText(nm);
}
} catch ( SQLException ex ) {
ex.printStackTrace();
}

• ataşati evenimentului windowDeactivated metoda AutoriWindowDeactivated


try {
rezultat.close();
comanda.close();
} catch (SQLException ex) {
ex.printStackTrace();
}

• selectaŃi intrarea pautori ( = parcurgere autori) din meniul aplicaŃiei şi adăugaŃi-i o metodă
pentru tratarea evenimentului actionPerformed . Metoda va fi executată la selectarea
opŃiunii şi va provoca afişarea ferestrei de dialog realizate.
Autori.setLocation(120,170);
Autori.setVisible(true);
Autori.pack();
108

• adăugaŃi codul necesar navigării printre înregistrările tabelului autori;

- pentru butonul autprec:


try {
if(!rezultat.isFirst()) // nu este pe prima linie
{
auturm.setEnabled(true);
if (rezultat.previous()) // Trec pe linia anterioara
{ // preiau numele
String nm = rezultat.getString("nume");
numeaut.setText(nm);
}
} else {
autprec.setEnabled(false);

}
} catch (SQLException esq) {}

- pentru butonul auturm:


try {
if(!rezultat.isLast()) // nu este pe ultima linie
{
autprec.setEnabled(true);
if (rezultat.next()) // Trec pe urmatoarea linie
{ // preiau numele
String nm = rezultat.getString("nume");
numeaut.setText(nm);
}
} else {

auturm.setEnabled(false);
}
} catch (SQLException esq) {}
109

• adăugaŃi codul necesar închiderii formularului Autori


Autori.setVisible(false);

4. CreaŃi un formular pentru parcurgerea tabelului edituri adăugând o nouă intrare în meniul
formularului principal.

5. AdăugaŃi în tabelul edituri două câmpuri suplimentare: adresa şi telefon, de tip varchar2 (150)
respectiv numeric(10):

6. AdăugaŃi în formularul realizat la punctul precedent alte două casete JTextField, în care să
afişaŃi informaŃii suplimentare despre edituri:.

Obs. :
• declaraŃi două variabile locale de tip String: nm1 şi nm2
String nm = rezultat.getString("nume");
110

String nm1 = rezultat.getString("adresa");


String nm2 = rezultat.getString("telefon");
numeed.setText(nm);
adresa.setText(nm1);
telefon.setText(nm2);
• adăugaŃi această secvenŃă de cod codului ce se execută la apăsarea celor două butoane
pentru navigarea printre înregistrările tabelelor edurm respectiv edprec

7. CreaŃi un formular pentru parcurgerea tabelului cărŃi, adăugând şi o opŃiune suplimentară în


meniul formularului principal.

8. AdăugaŃi în formularul realizat la punctul precedent alte două controale JTextField, în care să
afişaŃi informaŃii suplimentare despre cărŃi:.

Obs. :
• înlocuiŃi fraza SELECT de la punctul precedent cu alta:
SELECT nume, titlu, an_apar FROM edituri, carti WHERE carti.cod_edit=edituri.cod_edit
• declaraŃi alte două variabile locale de tip String: nm1 şi nm2
String nm = rezultat.getString("titlu");
String nm1 = rezultat.getString("nume");
String nm2 = rezultat.getString("an_apar");
numecarte.setText(nm);
ed.setText(nm1);
an.setText(nm2);
111

• adăugaŃi această secvenŃă de cod codului ce se execută la apăsarea celor două butoane
pentru navigarea printre înregistrările tabelelor autprec respectiv auturm

9. AdăugaŃi proiectului creat pentru exploatarea bazei de date aeroport o bară cu meniuri
derulante conŃinând meniurile: Fisier, Formulare, Rapoarte, Situatii, Help;
10. AdăugaŃi aplicaŃiei un formular cu ajutorul căruia să navigaŃi printre înregistrările tabelului
cursa, afişând informaŃii despre zboruri :

Pentru afişarea formularului adăugaŃi o opŃiune în submeniul Formulare.

11. AdăugaŃi proiectului creat pentru exploatarea bazei de date caini o bară cu meniuri derulante
conŃinând meniurile: Fisier, Formulare, Rapoarte, Situatii, Help;
12. AdăugaŃi aplicaŃiei un formular cu ajutorul căruia să navigaŃi printre înregistrările tabelului
caine, afişând informaŃii despre rasă, scop, talie şi Ńara de origine:

Pentru afişarea formularului adăugaŃi o opŃiune în submeniul Formulare.

S-ar putea să vă placă și