Conexiune la BD prin Java

Download Report

Transcript Conexiune la BD prin Java

Conexiune la BD prin Java
• JDBC (Java Database Connectivity) este o interfaţă
standard SQL de acces la baze de date.
• JDBC este o Interfaţă de Programare a Aplicaţiilor Java
(API) destinată procesării cererilor SQL. Constă dintr-o
colecţie de clase şi interfeţe scrise în Java şi care permit
realizarea de aplicaţii folosind un API java pur.
• Cu ajutorul JDBC-ului se pot trimite teoretic cereri SQL
oricărei baze de date relaţionale.
• java.sql
• Accesul la baza de date
Se face prin intermediul unui
driver specific tipului
respectiv de SGBD. Acesta
este responsabil cu accesul
efectiv la datele stocate, fiind
legatura dintre aplicatie si bd.
• Limbajul SQL
SQL (Structured Query
Language) reprezinta un limbaj
de programare ce permite
interogarea si actualizarea
informatiilor din bd relationale.
JDBC furnizează acces orientat pe obiecte la bazele de
date prin definirea de clase şi interfeţe care reprezintă
obiecte cum ar fi:
Concepte
Clasa/clasele sau interfeţele
conexiuni la baze de date
instrucţiuni SQL
Connection
Statement, PreparedStatement,
CallableStatement
ResultSet
Blob (Binary Large OBjects),
Clob(Character Large Objects)
Driver
DriverManager
mulţimi rezultat
obiecte mari binare şi caracter
drivere de baze de date
manageri de drivere
JDBC permite:
• Stabilirea unei conexiuni cu o baza de date
• Trimiterea cererilor SQL
• Procesarea rezultatelor
• JDBC este un API de nivel jos şi o bază pentru alte APIuri de nivel superior
• JDBC este o interfaţă de nivel jos, ceea ce inseamnă ca
e folosit pentru a apela comenzi SQL direct.
• JDBC - o baza pentru alte API-uri de nivel superior.
• Api-ul JDBC - Modele cu două şi cu trei
componente pentru acces la BD
1. Într-un model cu doua
componente, un
applet Java sau
aplicaţie comunică
direct cu baza de date.
• configuraţie clientserver
• reţeaua poate fi un
intranet sau Internet-ul.
2. modelul cu 3
componente:
– componenta intermediară
permite controlul asupra
accesului şi tipul de
interogări care se pot face
asupra datelor.
– utilizatorul poate folosi un
API de nivel superior care
e transpus de componenta
intermediară în apeluri de
nivel jos.
Structura JDBC-ului:
• JavaSoft distribuie trei componente JDBC odată cu kitul de dezvoltare
(JDK) :
• managerul de drivere (“JDBC driver manager”)
• pachetul de testare a driverelor (“JDBC driver test suite”)
• puntea JDBC-ODBC (“JDBC-ODBC bridge”)
• Managerul de drivere este componenta de bază a arhitecturii JDBC.
Funcţia sa de baza este să conecteze aplicaţiile Java la driverul JDBC.
• Pachetul de testare a driverelor aduce siguranţa că driverele JDBC vor rula
aplicaţiile. Numai driverele care trec testul driverelor JDBC se pot numi
conforme cu JDBC.
• Puntea JDBC-ODBC permite driverelor ODBC să fie folosite ca drivere JDBC.
JDBC API
JDBC Driver API
…
Drivere
JDBC
Protocol JDBC
Protocoale de acces specifice
bazelor de date de tranzitie
Tipuri de drivere JDBC
1. Driver ODBC – extensie a puntii JDBC-ODBC: Puntea JDBCODBC permite acces prin drivere ODBC. De notat: codul
binar ODBC trebuie să fie încărcat pe fiecare masină client
care foloseşte acest driver. Ca rezultat, acest tip de drivere
e cel mai potrivit pentru reţeaua unei firme, acolo unde
instalările suplimentare pe maşinile client nu sunt o
problemă, sau pentru cod pe server, în cadrul arhitecturii
cu trei componente
2. Apeluri native – driver Java: Acest tip de drivere
converteste apelurile JDBC în apeluri interne pe
serverele de baze de date (Oracle, Sybase, Informix,
DB2, …) Ca şi categoria anterioară, acest tip de
drivere necesită ca o parte din cod să fie incărcat pe
fiecare maşină client.
3. Driver Java de reţea JDBC pur:
Acest tip de drivere converteşte apelurile JDBC în
protocoale independente de BD, acestea apoi sunt
convertite în protocoale specifice bazei de date de către
un server. Acest server de reţea central e capabil să
conecteze clienţii Java la diferite baze de date. Aceasta
e cea mai flexibilă implementare a JDBC-ului.
4. Driver Java - protocol
nativ: Acest tip de
drivere converteşte
apelurile JDBC direct în
protocolul de reţea
folosit de serverul de
daze de date. Aceasta
permite apeluri directe
de pe maşina client la
baza de date şi e o
soluţie practică pentru
accesul din Internet.
Accesarea unei BD folosind JDBC:
1.
2.
3.
4.
5.
înregistrarea driverului JDBC
stabilirea unei conexiuni către BD
execuţia de instrucţiuni SQL
procesarea rezultatelor
închiderea conexiunii cu BD
Conectarea la o bază de date
• Procesul de conectare la o bază de date implică
efectuarea a două operaţii:
1. Inregistrarea unui driver corespunzător.
2. Realizarea unei conexiuni propriu-zise.
• O conexiune (sesiune) la o bază de date reprezintă un context
prin care sunt trimise secvenţe SQL şi primite rezultate.
• Într-o aplicaţie pot exista simultan mai multe conexiuni la
baze de date diferite sau la aceeaşi bază.
1. Înregistrarea driverului JDBC
• folosind gestionarul de drivere DriverManager
• Clasa DriverManager este componenta de organizare a JDBC-lui, şi
lucreaza între utilizator şi drivere. Ţine o evidenţă cu toate driverele
disponibile şi se ocupă cu stabilirea unei conexiuni între baza de
date şi driver-ul corespunzător.
• Metoda DriverManager.registerDriver(new TipDriver())
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
• pentru încărcarea dinamică:
Class.forName("TipDriver");
Class.forName("TipDriver").newInstance(); !!!!
Ex.: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); aruncă o
excepţie de tipul ClassNotFoundException.
2. stabilirea unei conexiuni către BD
• Conexiunea cu baza de date se realizează printr-un
obiect Connection. O sesiune a conexiunii
reprezintă clauzele SQL care sunt executate şi
rezultatele care sunt returnate prin acea
conexiune.
– metoda getConnection a clasei DriverManager .
• Clasa Driver Manager mentine o listă cu clasele
Driver înregistrate, şi atunci când metoda
getConnection e apelată, verifică dacă fiecare
driver din lista se poate conecta la baza de date.
• Clasele şi interfeţele responsabile cu realizarea unei conexiuni
sunt:
• DriverManager - este clasa ce se ocupă cu înregistrarea
driverelor ce vor fi folosite în aplicaţie;
• Driver - interfaţa pe care trebuie să o implementeze orice
clasă ce descrie un driver;
• DriverPropertyInfo - prin intermediul acestei clase pot fi
specificate diverse proprietăţi ce vor fi folosite la realizarea
conexiunilor;
• Connection - descrie obiectele ce modelează o conexiune
propriu-zisă cu baza de date.
• Metoda connect a clasei Driver foloseşte acest URL, pentru a stabili
efectiv conexiunea.
• URL (“Uniform Resource Locator”) - conţine informaţia necesară
pentru a localiza o resursă pe Internet, el poate fi văzut ca o adresă.
Sintaxa standard pentru URL-ul unei baze de date este:
jdbc:<subprotocol>:<nume> Dacă baza de date va fi accesată de pe
Internet, atunci URL-ul: //numegazda:port/subnume. Cele mai
cunoscute drivere JDBC au sintaxa:
• ODBC jdbc:odbc:numeSursaDate
• MySQL jdbc:mysql://server[:port]/numeBazaDate
• Oracle - jdbc:oracle:thin:@server:port:numeInstanta
• Metoda getConnection() din clasa DriverManager:
Connection c = DriverManager.getConnection(url);
Connection c = DriverManager.getConnection(url,username, pass);
Exemplu:
Connection conexiuneBazaDate = DriverManager.getConnection(
"jdbc:mysql://localhost/studenti");
String url="jdbc:odbc:test";
Connection conexiune = DriverManager.getConnection(url);
String user="UserJDBC";
String parola="parolaJDBC";
Connection conex1=
DriverManager.getConnection(url,user,parola);
Stabilirea unei conexiuni folosind un driver MySql
• Folosirea diferitelor tipuri de drivere implică doar schimbarea
numelui clasei ce reprezintă driverul şi a modalităţii de
specificare a bazei de date.
String url = "jdbc:mysql://localhost/test" ;
// sau
url = "jdbc:mysql://localhost/test?user=stud01&password=java";
try {
Class.forName("com.mysql.jdbc.Driver") ;
} catch(ClassNotFoundException e) {
...
3. execuţia de instrucţiuni SQL
• JDBC-ul pune la dispoziţie trei clase pentru trimiterea comenzilor SQL
bazei de date şi trei metode ale interfeţei Connection prin care se pot crea
instanţe ale acestor clase. Aceste clase şi metodele care le creează sunt:
• Clasa Statement şi metoda createStatement(). Un obiect de tip Statement
este folosit pentru trimiterea comenzilor SQL simple, fără parametri.
• Clasa PreparedStatement şi metoda prepareStatement(). Un obiect de tip
PreparedStatement este folosit pentru interogări SQL care preiau mai mult
de un argument de intrare (IN). PreparedStatement are un grup de
metode care setează valoarea parametrilor de intrare, care sunt trimise
bazei de date la momentul execuţiei. Instanţele clasei PreparedStatement
extind clasa Statement şi astfel includ şi metodele clasei Statement.
• Clasa CallableStatement şi metoda prepareCall(). Obiectele
CallableStatement sunt folosite pentru a executa proceduri stocate pe
serverul DBMS (un grup de comenzi SQL apelat după nume, similar cu
apelul unei funcţii). Un obiect CallableStatement moşteneşte metodele de
manevrare ale parametrilor IN de la PreparedStatement şi adaugă metode
pentru lucru cu parametrii OUT şi INOUT.
• O dată realizată conexiunea cu
DriverManager.getConection(), se poate folosi
obiectul Connection rezultat pentru a se crea
un obiect de tip Statements, cu ajutorul căruia
putem trimite secvenţe SQL către baza de
date.
Statement ob_Connection.createStatement();
Exemplu: Statement instrucţiune =
conexiuneBazaDate.createStatement();
• O instrucţiune poate face anumite operaţii pe baza de
date, cum ar fi căutare, inserare, actualizare sau
ştergere. Cele mai uzuale comenzi SQL sunt cele
folosite pentru:
1. interogarea bazei de date (SELECT) şi
2. actualizarea bazei de date (INSERT, UPDATE, DELETE)
3. Actualizarea structurii: CREATE, ALTER, DROP - acestea
mai sunt numite instrucţiuni DDL (Data Definition
Language)
• Execuţia unei secvenţe SQL poate fi realizată prin
intermediul a trei metode:
1. executeQuery
folosită pentru realizarea de interogări de tip SELECT.
Metoda returnează un obiect de tip ResultSet ce va
conţine sub o formă tabelarp rezultatul interogării.
String sql = "SELECT * FROM persoane";
ResultSet rs = stmt.executeQuery(sql);
2. executeUpdate
folosită pentru actualizarea datelor (INSERT, UPDATE, DELETE)
sau a structurii bazei de date (CREATE, ALTER, DROP).
Metoda va returna un întreg ce semnifică numărul de linii
afectate de operaţiunea de actualizare a datelor sau 0 în cazul
unei instrucţiuni DDL.
String sql = "DELETE FROM persoane WHERE cod > 100";
int linii = stmt.executeUpdate(sql);
// Nr de articole care au fost afectate (sterse)
sql = "DROP TABLE temp";
stmt.executeUpdate(sql); // returneaza 0
3. Execute
• Metoda este folosită doar dacă este posibil ca rezultatul unei
interogări să fie format din două sau mai multe obiecte de tip
ResultSet sau rezultatul unei actualizări să fie format din mai
multe valori, sau o combinaţie între aceste cazuri.
• Metoda întoarce true dacă rezultatul obţinut este format din
obiecte de tip ResultSet şi false dacă e format din întregi.
• metodele: getResultSet sau getUpdateCount
• Pentru a prelua toate rezultatele va fi apelată metoda
getMoreResults
String sql = "comanda SQL
necunoscuta";
stmt.execute(sql);
while(true) {
int rowCount =
stmt.getUpdateCount();
if(rowCount > 0) {
// Este o actualizare datelor
System.out.println("Linii afectate = "
+ rowCount);
stmt.getMoreResults();
continue;
}
if(rowCount = 0) {
// Comanda DDL sau nici o linie afectata
System.out.println("Comanda DDL
sau 0 actualizari");
stmt.getMoreResults();
continue;
}
// rowCount este -1
// Avem unul sau mai multe ResultSet-uri
ResultSet rs = stmt.getResultSet();
if(rs != null) {
// Proceseaza rezultatul
...
stmt.getMoreResults();
continue;
}
// Nu mai avem nici un rezultat
break;
}
Interfaţa PreparedStatement
• Interfaţa PreparedStatement este derivată din Statement, fiind diferită de
aceasta prin:
1. Instanţele de tip PreparedStatement conţin secvenţe SQL care au fost deja
compilate (sunt ”pregătite”).
2. O secvenţă SQL specificată unui obiect PreparedStatement poate să aibă
unul sau mai mulţi parametri de intrare, care vor fi specificaţi prin
intermediul unui semn de întrebare (”?”) în locul fiecăruia dintre ei.
Inainte ca secvenţa SQL să poată fi executată fiecărui parametru de
intrare trebuie să i se atribuie o valoare, folosind metode specifice
acestei clase.
Crearea unui obiect de tip PreparedStatement:
Connection con = DriverManager.getConnection(url);
String sql = "UPDATE persoane SET nume=? WHERE cod=?";
Statement pstmt = con.prepareStatement(sql);
• Trimiterea parametrilor se realizează prin metode de tip setXXX, unde
XXX este tipul corespunzător parametrului, iar argumentele metodei sunt
numărul de ordine al parametrului de intrare (al semnului de întrebare) şi
valoarea pe care dorim să o atribuim.
pstmt.setString(1, "Ionescu");
pstmt.setInt(2, 100);
• Execuţia unei secvenţe SQL folosind un obiect PreparedStatement se
realizează printr-una din metodele executeQuery, executeUpdate sau
execute, semnificaţiile lor fiind aceleaşi ca şi în cazul obiectelor de tip
Statement, cu singura deosebire că nu au nici un argument.
• Ex.
String sql = "UPDATE persoane SET nume=? WHERE cod=?";
Statement pstmt = con.prepareStatement(sql);
pstmt.setString(1, "Ionescu");
pstmt.setInt(2, 100);
pstmt.executeUpdate();
pstmt.setString(1, "Popescu");
pstmt.setInt(2, 200);
pstmt.executeUpdate();
sql = "SELECT * from persoane WHERE cod >= ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, 100);
ResultSet rs = pstmt.executeQuery();
Interfaţa CallableStatement
• derivată din PreparedStatement
• Crearea unui obiect CallableStatement se realizează prin metoda
prepareCall a clasei Connection:
Connection con = DriverManager.getConnection(url);
CallableStatement cstmt = con.prepareCall("{call proceduraStocata(?, ?)}“);
• Trimiterea parametrilor prin metode de tip setXXX
• Obţinerea valorilor rezultate în parametrii de ieşie se va face cu metode
de tip getXXX
CallableStatement cstmt = con.prepareCall("{call calculMedie(?)}");
cstmt.registerOutParameter(1, java.sql.Types.FLOAT);
cstmt.executeQuery();
float medie = cstmt.getDouble(1);
Interfaţa ResultSet
• Forma generală a unui ResultSet este tabelară, având un
număr de coloane şi de linii, funcţie de secvenţa executată.
Exemple:
Connection c = DriverManager.getConnection(url);
Statement s = c.createStatement();
ResultSet r = s.executeQuery("SELECT * FROM un_tabel ORDER
BY o_coloana");
s.executeUpdate("DELETE * FROM un_tabel");
ResultSet rs=s.executeQuery("select * from studenti");
String sql = "insert into studenti values (1, "Popescu", "Ion", 9)";
ResultSet rs = s.executeUpdate(sql);
4. Procesarea rezultatelor
• metoda next()
• metode de tip getXXX, unde XXX este tipul de dată al
unei coloane, iar argumentul primit indică fie
numărul de ordine din cadrul tabelului, fie numele
acestuia.
Exemplu:
while (rs.next()) {
System.out.println(rs.getString("nr") + ", " +
rs.getString("nume") + ", " + rs.getString("prenume")
+ ", " + rs.getString("nota"));
}
• Exemplu:
String sql = "SELECT cod, nume FROM persoane";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
int cod = r.getInt("cod");
String nume = r.getString("nume");
/* echivalent:
int cod = r.getInt(1);
String nume = r.getString(2);
*/
System.out.println(cod + ", " + nume);
}
5. Inchiderea unei conexiuni la o bază de date
• metoda close() aplicată obiectelor Statement, ResultSet şi Connection.
Exemplu:
try { . . .
rs.close();
instrucţiune.close();
}
catch (SQLException e) {
System.out.println("Eroare căutare date din: " + URLBazaDate);
}
finally {
try {
if (conexiuneBazaDate != null) {
conexiuneBazaDate.close(); }
} catch (SQLException ignored) {}
}
• Exemplu:Următorul program exemplifică accesul la înregistrările
unei tabele create în Microsoft Acces printr-o punte JDBC-ODBC.
• Pentru accesarea dintr-o aplicaţie Java a unei anumite baze de date
(create de exemplu în Microsoft Access, Dbase, Excel, FoxPro,
Oracle) se impune efectuarea următoarelor operaţii pentru a o
introduce ca sursă de date în ODBC:
1.
din "Control Panel" se alege Administrative Tools, apoi Data
Sources(ODBC).
2. în User DSN se accesează butonul "Add", se selectează "Driver do
Microsoft Access(*.mdb)" (de exemplu pentru baze de date
Access) şi se apasă butonul "FINISH".
3. în "DATA SOURCE NAME" se va introduce numele bazei de date
(din programul Java jdbc:odbc:xxxx), iar la opţiunea select se va
selecta fişierul bază de date, după care se selectează "Ok".
ex_BD.doc