Documente Academic
Documente Profesional
Documente Cultură
JDBC
JDBC (Java DataBase Connectivity) este o parte a Java API dedicată
conectării la baze de date. Utilizând JDBC, putem executa instrucţiuni SQL pentru
orice bază de date relaţională.
Etapele principale într-o aplicaţie ce foloseşte JDBC sunt următoarele:
- deschiderea unei conexiuni către baza de date;
- crearea unui "obiect instrucţiune" prin care transmitem instrucţiuni SQL către
gestionarul bazei de date;
- regăsirea rezultatelor.
Baza de date astfel creată este însă particulară şi nu este recunoscută ca atare
de orice sistem. De aceea trebuie folosit un "intermediar" care să permită accesarea şi
exploatarea ei. Un astfel de intermediar este ODBC (Open DataBase Connectivity).
Baza de date trebuie conectată la o sursă de baze de date ODBC, prin înregistrarea ei
la driver-ul ODBC.
Adresa sursei de date se precizează prin:
String url="jdbc:odbc:sursă_date"
Presupunem că numele sursei de date este AgendaODBC. Mergem succesiv în:
- Administrative Tools
- Data Sources (ODBC)
- System DSN sau UserDSN (baza de date a sistemului sau a utilizatorului)
- Add
- selectez *.mdb
- Data Source Name: AgendaODBC
- Select
- merg în directorul meu
- selectez Agenda.mdb
- OK
- OK
- închid.
Încărcarea driver-ului ODBC se realizează prin:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
try {
String url="jdbc:odbc:AgendaODBC";
Connection con =
DriverManager.getConnection(url,"user","parola");
}
catch (SQLException e) {...}
Se observă că trebuie trimis numele utilizatorului şi o parolă, pentru o
eventuală validare a accesului la baza de date.
Interfaţa:
public interface ResultSet
permite regăsirea, sub forma unui tabel, a rezultatelor căutării la executarea unei
metode executeQuery. Un obiect de acest tip menţine un cursor la linia curentă din
tabel, iniţial la prima linie a acestuia. Dintre metodele interfeţei ResultSet descriem
deocamdată numai următoarele:
public boolean next()
întoarce true dacă şi numai dacă mai există linii în rs, caz în care se trece la
următoarea înregistrare;
public gettip(String s)
întoarce conţinutul câmpului cu numele s din înregistrarea curentă ca o valoare
de tipul tip din Java; tip poate fi String, Int etc.
Exemplu
4
Clasa Agenda de mai jos conţine numai metoda principală. Această metodă
prevede crearea unei conexiuni con la baza de date, a unui "obiect instrucţiune" stmt
şi a unui obiect bd de tipul BD. În continuare sunt citite de la intrare şiruri de caractere
şi se întreprind următoarele acţiuni:
- dacă primul şir de caractere citit este "INSERT", mai sunt citite 3 şiruri de
caractere şi un număr întreg; prin invocarea metodei adauga a clasei BD este
inserată o nouă înregistrare în baza de date;
- dacă primul şir de caractere citit este "SELECT", atunci mai sunt citite două şiruri
de caractere nume şi loc şi este invocată metoda cauta a clasei BD pentru listarea
tuturor personelor cu numele nume şi localitatea loc;
- dacă primul şir de caractere citit este "STOP", atunci programul se termină.
import java.sql.*;
class Agenda {
public static void main(String[] args) throws Exception {
String id,nume,prenume,loc; int sal; Persoana P;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:AgendaODBC";
Connection con =
DriverManager.getConnection(url,"Vasile","Sile");
Statement stmt = con.createStatement();
BD bd = new BD(stmt);
for ( ; ; ) {
IO.writeln("*** Comanda noua : ***");
id = IO.readString();
if (id.equals("STOP")) break;
else if (id.equals("SELECT")) {
nume = IO.readString(); loc = IO.readString();
bd.cauta(nume,loc);
}
else if (id.equals("INSERT")) {
nume = IO.readString(); prenume = IO.readString();
loc = IO.readString(); sal = (int) IO.read();
P = new Persoana(nume,prenume,loc,sal);
bd.adauga(P);
}
else IO.writeln("Comanda incorecta");
}
con.close(); stmt.close();
}
}
va fi afişat:
Ionescu Ion Sibiu 510
Ionescu Vasile Sibiu 560
Ionescu Dan Sibiu 460
import java.io.*;
class Persoana implements Serializable {
private String nume,prenume,localitate;
private int salariu;
public Persoana(String n, String p, String l, int s) {
nume=n; prenume=p; localitate=l; salariu=s;
}
public String rNume() { return nume; }
public String rPrenume() { return prenume; }
public String rLocalitate() { return localitate; }
public int rSalariu() { return salariu; }
public String toString() {
return "\t"+ nume+"\t"+prenume+"\t"+
localitate+"\t"+salariu;
}
}
import java.io.*;
class Persoana implements Serializable {
private String nume,prenume,localitate; int salariu;
public Persoana(String n, String p, String l, int s) {
nume=n; prenume=p; localitate=l; salariu=s;
9
}
public String rNume() { return nume; }
public String rPrenume() { return prenume; }
public String rLocalitate() { return localitate; }
public int rSalariu() { return salariu; }
public String toString() {
return "\t"+ nume+"\t"+prenume+
"\t"+localitate+"\t"+salariu;
}
}
Uneori programul trimite cereri de aceleaşi tip, dar cu alte valori pentru unul
sau mai multe câmpuri. De exemplu putem trimite cereri multiple în care doar
valoarea unui câmp (unor câmpuri) diferă. În aceste situaţii este utilă, dar şi eficientă,
folosirea unor instrucţiuni SQL în care apar parametri. Concret, în locul câmpului
(câmpurilor) vom introduce caracterul '?', umând ca acesta să fie înlocuit cu o
11
Metodele de setare:
public void setTip(int i, tip t) throws SQLException
setează parametrul cu numărul de ordine i, cu precizarea că numerotarea începe
cu 1. Driver-ul îl converteşte la o valoare de tipul tipSQL şi îl trimite bazei de
date. Iată câteva cazuri particulare:
import java.sql.*;
class Agenda1 {
public static void main(String[] args) throws Exception {
String id,nume,prenume,loc; int sal; Persoana P;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:AgendaODBC";
Connection con =
DriverManager.getConnection(url,"Vasile","Sile");
12
Persoana p;
String cerere="SELECT * FROM PERSOANE WHERE SALARIU>?";
PreparedStatement pstmt = con.prepareStatement(cerere);
for (int i=400; i<650; i=i+50) {
pstmt.setInt(1,i);
IO.writeln("Persoane cu salariul > "+i);
ResultSet rs = pstmt.executeQuery();
while( rs.next() ) {
p = new Persoana( rs.getString("Nume"),
rs.getString("Prenume"),
rs.getString("Localitate"),
rs.getInt("Salariu")
);
IO.writeln(""+p);
}
}
con.close(); pstmt.close();
}
}