Documente Academic
Documente Profesional
Documente Cultură
carea unei baze de date Tipuri de drivere Realizarea unei conexiuni Efectuarea de secvent e SQL Obt inerea si prelucrarea rezultatelor Exemplu simplu Lucrul cu meta-date
1
Ce este o baz a de date ? O baz a de date reprezint a o modalitate de stocare a unor informat ii (date) pe un suport extern, cu posibilitatea reg asirii acestora. Memorat a n unul sau mai multe siere Ecient a (indec si) Sigurant a (chei primare, secundare, triggere) Securitate (parole) Modele: relat ional, orientat-obiect, distribuit, etc. Cont ine: tabele, proceduri si funct ii, utilizatori si grupuri de utilizatori, tipuri de date, obiecte, etc.
2
DBMS (Database Management System) Sistem pentru gestiunea bazelor de date (SGBD) Produc atori SGBD: Oracle Sybase IBM Informix Microsoft
Crearea unei baze de date Folosind aplicat ii specializate / scripturi SQL. Accesul la baza de date Se face prin intermediul unui driver specic tipului respectiv de SGBD. Limbajul SQL (Structured Query Language) Limbaj standardizat pentru interogarea si actualizarea informat iilor din baze de date relat ionale.
JDBC Java Database Connectivity este tehnologia Java de acces la baze de date. Este independent a de tipul bazei de date. java.sql - nucleul tehnologiei JDBC. Facilit a ti 1. Stabilirea unei conexiuni cu o baz a de date. 2. Efectuarea de secvent e SQL. 3. Prelucrarea rezultatelor obt inute.
Conectarea la o baz a de date 1. Inregistrarea unui driver 2. Realizarea unei conexiuni Conexiune (sesiune) = context prin care sunt trimise secvent e SQL si primite rezultate. Intr-o aplicat ie pot exista simultan mai multe conexiuni la baze de date diferite sau la aceea si baz a. Clase si interfet e: DriverManager Driver DriverPropertyInfo Connection
6
Inregistrarea unui driver Inc arcarea n memorie a clasei ce implementeaz a driver-ul. a. DriverManager:
DriverManager.registerDriver(new TipDriver());
b. Class.forName
Class.forName("TipDriver"); Class.forName("TipDriver").newInstance();
Din program:
System.setProperty("jdbc.drivers", "TipDriver");
Specicarea unei baze de date JDBC URL - modalitatea de a identica o BD: jdbc:sub-protocol:identicator Sub-protocol: tipul de driver odbc, oracle, sybase, db2, etc. Identicatorul bazei de date
jdbc:odbc:test jdbc:odbc:test;UID=duke;PWD=java jdbc:oracle:thin@persistentjava.com:1521:test jdbc:sybase:test jdbc:db2:test
ODBC (Open Database Conectivity) identicator DSN (Data Source Name) simplu de utilizat nu este portabil a vitez a de execut ie slab a sun.jdbc.odbc.JdbcOdbcDriver jdbc:odbc:identificator
Tip 2. nativ
Acest tip de driver transform a cererile JDBC direct n apeluri c atre driverul nativ al bazei de date, care trebuie instalat n prealabil. Clase Java care implementeaz a astfel de drivere pot procurate de la produc atorii de SGBD-uri, distribut ia standard J2SDK neincluz and nici unul.
10
Acest tip de driver transform a cererile JDBC folosind un protocol de ret ea independent, acestea ind apoi transormate folosind o aplicat ie server ntr-un protocol specc bazei de date. Introducerea serverului ca nivel intermediar aduce exibilitate maxim a n sensul c a vor putea realizate conexiuni cu diferite tipuri de baze, f ar a nici o modicare la nivelul clientului.
11
Acest tip de driver transform a cererile JDBC direct n cereri c atre baza de date folosind protocolul de ret ea al acesteia. Aceast a solut ie este cea mai rapid a, ind preferat a la dezvoltarea aplicat iilor care manevreaz a volume mari de date si viteza de execut ie este critic a.
12
Realizarea unei conexiuni O conexiune este reprezentat a printrun obiect de tip Connection Crearea unei conexiuni se realizeaz a prin metoda: DriverManager.getConnection
Connection c = DriverManager.getConnection(url); Connection c = DriverManager.getConnection( url, username, password); Connection c = DriverManager.getConnection( url, dbproperties);
13
String url = "jdbc:mysql://localhost/test" ; // sau url = "jdbc:mysql://localhost/test?user=duke&pas try { Class.forName("com.mysql.jdbc.Driver") ; } catch(ClassNotFoundException e) { ...
O conexiune va folosit a pentru: Crearea de secvent e SQL utilizate pentru interogarea sau actualizarea bazei. Aarea unor informat ii legate de baza de date (meta-date). Controlul tranzact iilor din memorie c atre baza de date prin metodele commit, rollback, setAutoCommit.
15
Efectuarea de secvent e SQL Statement PreparedStatement CallableStatement Comenzi SQL uzual folosite: SELECT INSERT, UPDATE, DELETE CREATE, ALTER, DROP DDL (Data Denition Language) CALL ResultSet - obt inerea rezultatelor
16
17
3. execute
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("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; } break; // Nu mai avem nici un rezultat }
18
Embedded SQL
int cod = 100; String nume = "Popescu"; double salariu; SELECT salariu INTO :salariu WHERE cod=:cod OR nume=:nume;
19
Interfat a PreparedStatement Instant ele de tip PreparedStatement cont in secvent e SQL care au fost deja compilate, scopul ind cre sterea vitezei de execut ie. Crearea
Connection con = DriverManager.getConnection(url); String sql = "UPDATE persoane SET nume=? WHERE cod=?"; Statement pstmt = con.prepareStatement(sql);
Trimiterea parametrilor
pstmt.setString(1, "Ionescu"); pstmt.setInt(2, 100);
20
21
Tipuri JDBC Sunt denite n clasa Types Metoda setObject permite specicarea explicit a a tipului
pstmt.setObject(1, "Ionescu", Types.CHAR); pstmt.setObject(2, 100, Types.INTEGER); // sau doar pstmt.setObject(2, 100);
Metoda setNull
pstmt.setNull(1, Types.CHAR); pstmt.setInt(2, null);
22
23
24
Structura datelor obiectului rs: cod nume 100 Ionescu 200 Popescu Un ResultSet napsuleaz a si metainformat ii legate de interogare.
25
Extragerea datelor Parcurgem tabelul linie cu linie si din ecare valorile de pe coloane. Coloanele sunt numerotate de la st anga la dreapta, ncep and cu 1.
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); }
26
Cursoare modicabile
Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); String sql = "SELECT cod, nume FROM persoane"; ResultSet rs = stmt.executeQuery(sql);
Metode suplimentare
absolute updateXXX updateRow moveToInsertRow insertRow moveToCurrentRow deleteRow
supportsPositionedUpdate/Delete
27
Exemplu simplu
Listing 1: Exemplu simplu de utilzare JDBC
import java . sql .*; public class TestJdbc { public static void main ( String [] args ) { String url = " jdbc : mysql :// localhost / test " ; try { Class . forName ( " com . mysql . jdbc . Driver " ) ; } catch ( Cl as sNo tF oun d E x c e pt io n e ) { System . out . println ( " Eroare incarcare driver !\ n " + e ) ; return ; } try { Connection con = DriverManager . getConnection ( url ) ; // Golim tabelul persoane String sql = " DELETE FROM persoane " ; Statement stmt = con . createStatement () ; stmt . executeUpdate ( sql ) ; // Adaugam un numar de persoane generate aleator // Tabelul persoane are coloanele ( cod , nume , salariu ) int n = 10; sql = " INSERT INTO persoane VALUES (? , ? , ?) " ; PreparedStatement pstmt = con . prepareStatement ( sql ) ; for ( int i =0; i < n ; i ++) { int cod = i ; String nume = " Persoana " + i ; double salariu = 100 + Math . round ( Math . random () * 900) ; // salariul va fi intre 100 si 1000 pstmt . setInt (1 , cod ) ; pstmt . setString (2 , nume ) ; pstmt . setDouble (3 , salariu ) ; pstmt . executeUpdate () ; } // Afisam persoanele ordonate dupa salariu sql = " SELECT * FROM persoane ORDER BY salariu " ; ResultSet rs = stmt . executeQuery ( sql ) ; while ( rs . next () )
28
System . out . println ( rs . getInt ( " cod " ) + " , " + rs . getString ( " nume " ) + " , " + rs . getDouble ( " salariu " ) ) ;
// Calculam salariul mediu sql = " SELECT avg ( salariu ) FROM persoane " ; rs = stmt . executeQuery ( sql ) ; rs . next () ; System . out . println ( " Media : " + rs . getDouble (1) ) ; // Inchidem conexiunea con . close () ; } catch ( SQLException e ) { e . printStackTrace () ; } } }
29
Lucrul cu meta-date Interfat a DatabaseMetaData Un obiect de tip DatabaseMetaData ofer a diverse informat ii (metadate - date despre date) legate de baza respectiv a, cum ar : tabele proceduri stocate capabilit a tile conexiunii gramatica SQL suportat a, etc. Metoda getMetaData din clasa Connection.
30
31
Interfat a ResultSetMetaData Meta-datele unui ResultSet reprezint a informat iile despre rezultatul cont inut n acel obiect cum ar num arul coloanelor, tipul si denumirile lor, etc.
ResultSet rs = stmt.executeQuery("SELECT * FROM tabel") ResultSetMetaData rsmd = rs.getMetaData(); // Aflam numarul de coloane int n = rsmd.getColumnCount(); // Aflam numele coloanelor Sring nume[] = new String[n]; for(int i=0; i<n; i++) nume[i] = rsmd.getColumnName(i);
32