Curs_11.ppt

38
Conexiune la BD prin Java

Transcript of Curs_11.ppt

Page 1: Curs_11.ppt

Conexiune la BD prin Java

Page 2: Curs_11.ppt

• 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

Page 3: Curs_11.ppt

• Accesul la baza de dateSe face prin intermediul unuidriver specific tipuluirespectiv de SGBD. Acestaeste responsabil cu accesulefectiv la datele stocate, fiindlegatura dintre aplicatie si bd.• Limbajul SQLSQL (Structured QueryLanguage) reprezinta un limbajde programare ce permiteinterogarea si actualizarea informatiilor din bd relationale.

Page 4: Curs_11.ppt

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 Connection

instrucţiuni SQL Statement, PreparedStatement, CallableStatement

mulţimi rezultat ResultSet

obiecte mari binare şi caracter Blob (Binary Large OBjects), Clob(Character Large Objects)

drivere de baze de date Driver

manageri de drivere DriverManager

Page 5: Curs_11.ppt

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 API-uri 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.

Page 6: Curs_11.ppt

• Api-ul JDBC - Modele cu două şi cu trei componente pentru acces la BD

Page 7: Curs_11.ppt

1. Într-un model cu doua componente, un applet Java sau aplicaţie comunică direct cu baza de date.

• configuraţie client-server

• reţeaua poate fi un intranet sau Internet-ul.

Page 8: Curs_11.ppt

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.

Page 9: Curs_11.ppt

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.

Page 10: Curs_11.ppt

JDBC API

JDBC Driver API

…DrivereJDBC

Protocol JDBC Protocoale de acces specificebazelor de date de tranzitie

Page 11: Curs_11.ppt

Tipuri de drivere JDBC1. Driver ODBC – extensie a puntii JDBC-ODBC: Puntea JDBC-

ODBC 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

Page 12: Curs_11.ppt

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.

Page 13: Curs_11.ppt

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.

Page 14: Curs_11.ppt

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.

Page 15: Curs_11.ppt

Accesarea unei BD folosind JDBC:

1.înregistrarea driverului JDBC 2.stabilirea unei conexiuni către BD3.execuţia de instrucţiuni SQL4.procesarea rezultatelor5.închiderea conexiunii cu BD

Page 16: Curs_11.ppt

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

Page 17: Curs_11.ppt

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.

Page 18: Curs_11.ppt

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.

Page 19: Curs_11.ppt

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

Page 20: Curs_11.ppt

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

Page 21: Curs_11.ppt

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

Page 22: Curs_11.ppt

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) {...

Page 23: Curs_11.ppt

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.

Page 24: Curs_11.ppt

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

Page 25: Curs_11.ppt

• 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) şi2. actualizarea bazei de date (INSERT, UPDATE, DELETE) 3. Actualizarea structurii: CREATE, ALTER, DROP - acestea

mai sunt numite instrucţiuni DDL (Data Definition Language)

Page 26: Curs_11.ppt

• Execuţia unei secvenţe SQL poate fi realizată prin intermediul a trei metode:

1. executeQueryfolosită pentru realizarea de interogări de tip SELECT.Metoda returnează un obiect de tip ResultSet ce vaconţine sub o formă tabelarp rezultatul interogării.

String sql = "SELECT * FROM persoane";ResultSet rs = stmt.executeQuery(sql);

Page 27: Curs_11.ppt

2. executeUpdatefolosită 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 liniiafectate de operaţiunea de actualizare a datelor sau 0 în cazulunei 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

Page 28: Curs_11.ppt

3. Execute• Metoda este folosită doar dacă este posibil ca rezultatul uneiinterogări să fie format din două sau mai multe obiecte de tipResultSet sau rezultatul unei actualizări să fie format din maimulte 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

Page 29: Curs_11.ppt

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;}

Page 30: Curs_11.ppt

Interfaţa PreparedStatement

• Interfaţa PreparedStatement este derivată din Statement, fiind diferită deaceasta 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);

Page 31: Curs_11.ppt

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

Page 32: Curs_11.ppt

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

Page 33: Curs_11.ppt

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

Page 34: Curs_11.ppt

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

Page 35: Curs_11.ppt

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

}

Page 36: Curs_11.ppt

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

}

Page 37: Curs_11.ppt

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) {}

}

Page 38: Curs_11.ppt

• 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