Sunteți pe pagina 1din 6

smaranda.belciug@inf.ucv.

ro Laborator 10 Fiiere Citire fiier


import java.io.*; class MyFileRead { public static void main(String args[]){ try{ //se deschide fisierul FileInputStream fstream = new FileInputStream("textfile.txt"); // se preia obiectul DataInputStream in = new DataInputStream(fstream); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String strLine; //se citeste linie de linie din fisier while ((strLine = br.readLine()) != null) { // se printeaza continutul System.out.println (strLine); } //se inchide fluxul de intrare in.close(); }catch (Exception e){ System.err.println("Error: " + e.getMessage()); } } }

Scriere fiier
import java.io.*; class MyFile { public static void main(String args[]){ try{ // creeaza fisierul FileWriter fstream = new FileWriter("out.txt"); BufferedWriter out = new BufferedWriter(fstream); out.write("Hello Java"); //inchide fisierul out.close(); }catch (Exception e){ System.err.println("Error: " + e.getMessage()); } } }

Baze de date Java poate accesa mai multe tipuri de baze de date (de la un simplu fiier text, pn la un obiecte de tip baza de date). n majoritatea aplicaiilor se scrie o clasa numit accesor, care face legtura dintre baza de date i restul aplicaiei. De exemplu, dac folosim JDBC, rspunsurile query-urilor se ntorc sub forma unui obiect de tip ResultSet.

smaranda.belciug@inf.ucv.ro

Exemplu. S presupunem c avem o aplicaie de tip Sistem de Management al Datelor cu Caracter Personal. Avem clasele primare: Persoan, Adres i ntlnire. Ar fi indicat s scriem o clas PersoanAccesor pentru a prelua numele i adresele din baza de date (probabil folosind JDBC) i s generm obiecte Persoan i Adres din ea. Obiectele din clasa accesor sunt actualizate, iar actualizrile respective trebuie s se reflecte i n baza de date. Java DataBase Connectivity (JDBC) are clase incluse n pachetul java.sql i extensiile JDBC Level 2 n pachetul javax.sql. Reeta nr 1: Setarea i Conectarea la JDBC Problem. Vrem s accesm o baz de date via JDBC. Soluie. Folosim Class.forName() i DriverManager.getConnection(). Discuie. Recapitulare. SQL are query-uri de forma: SELECT * from userdb. SQL face update-urile folosind: INSERT, DELETE, CREATE i DROP. JDBC are dou niveluri: JDBC1 i JDBC2. Nivelul 1 este inclus n implementarea i driverele JDBC, Nivelul 2 este opional i are nevoie de un driver Level 2. Noi vom lucra cu Nivelul 1. Folosirea unui query JDBC pas cu pas Cum se creeaz un JDBC query: 1. Se ncarc clasa potrivit Driver, fapt ce are ca efect secundar nregistrarea cu DriveManager-ul. 2. Se creeaz un obiect Connection, folosind metoda DriverManager.getConnection():
Connection con = DriverManager.getConnection (dbURL, name, pass);

3. Se creeaz un obiect Statement, folosind metoda obiectului Connection, createStatement():


Statement stmt = con.createStatement( );

4. Se creeaz un obiect ResultSet, folosind metoda obiectului Statement executQuery():


ResultSet rs = stmt.executeQuery("select * from MyTable");

5. Se itereaz ResultSet-ul:

smaranda.belciug@inf.ucv.ro
while (rs.next( )) { int x = rs.getInt("CustNO");

6. Se nchide ResultSet. 7. Se nchide Statement. 8. Se nchide Connection. Reeta nr 2: Conectarea la o baza de date JDBC Problem. Vrem s ne conectm la o baz de date. Soluie. Folosim DriverManager.getConnection(). Discuie. Metoda de clas DriverManager.getConnection() permite conectarea la o baza de date folosind un URL de genul: jdbc:dbmsnetproto://server:4567/mydatabase, un nume de logare i o parol. Drivere JDBC Clasa Driver-ului
sun.jdbc.odbc.JdbcOdb cDriver jdbc.idbDriver jdbc:odbc:

dbURL

Baza de date Microsoft ODBC (Inclus n JDK) Instant Database (IDB)

jdbc:idb:

oracle.jdbc.Driver.Or acleDriver

jdbc:oracle:thin:@server:port #:dbname

Oracle

postgresql.Driver

jdbc:postgres://host/database

PostGreSQL (free) http://www.postgresql.org)

org.gjt.mm.mysql.Driv er

jdbc:mysql://host/database

MySql (free http://www.mysql.com)

import java.awt.*; import java.sql.*; /** Se incarca un driver si ne conectam la baza de date * */ public class Connect {

smaranda.belciug@inf.ucv.ro
public static void main(String[] av) { String dbURL = "jdbc:odbc:WRBC"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); DriverManager.setLogStream(System.err); System.out.println("Getting Connection"); Connection conn = DriverManager.getConnection(dbURL, "ian", ""); // utilizator, parola //Daca un obiect SQLWarning e valabil il afiseaza SQLWarning warn = conn.getWarnings( ); while (warn != null) { System.out.println("SQLState: " + warn.getSQLState( )); System.out.println("Message: " + warn.getMessage( )); System.out.println("Vendor: " + warn.getErrorCode( )); System.out.println(""); warn = warn.getNextWarning( ); } //Procesarea conexiunii conn.close( ); } catch (ClassNotFoundException e) { System.out.println("Nu pot incarca driver-ul " + e); } catch (SQLException e) { System.out.println("Nu pot accesa baza de date " + e); } } }

Reeta nr 3. Trimiterea unui query JDBC i obinerea rezultatelor Soluie. Creeaz un obiect Statement i folosete-l pentru a executa un query. Rezultatul l pui ntr-un obiect de tip ResultSet. Discuie. Obiectul Connetion poate s genereze mai multe tipuri de statements. Cel mai simplu este un Statement creat de createStatement(), care este folosit pentru a trimite un query SQL ca string:
Statement stmt = conn.createStatement( ); stmt.executeQuery("select * from myTable");

Rezultatul query-ului este returnat ntr-un obiect de tip ResultSet. ResultSet-ul lucreaz ca un iterator, adic permite accesarea liniilor din rezultatul query-ului.
while (rs.next( )) { int i = rs.getInt(1); // sau getInt("UserID");

Dup cum se vede din comentariu, se pot obine elemente din ResultSet prin indexul coloanei (care porneste de la 1, n ciuda faptului c n Java se pornete de la zero) sau prin numele coloanei.
String bar, beer ;

smaranda.belciug@inf.ucv.ro
float price ; ResultSet rs = stmt.executeQuery("SELECT * FROM Sells"); while ( rs.next() ) { bar = rs.getString("bar"); beer = rs.getString("beer"); price = rs.getFloat("price"); System.out.println(bar + " sells " + beer + " for " + price + " Dollars."); } Sau bar = rs.getString(1); price = rs.getFloat(3); beer = rs.getString(2);

Tranzacii JDBC-ul permite comenzilor SQL s fie grupate ntr-o singur tranzacie. Astfel putem asigura ACID (Atomcity, Consistency, Isolation, Durability). Controlul tranzaciilor se face prin obiectul Connection. Cnd se creeaz o conexiune, ea este n modul auto-commit. Acest lucru nseamn c fiecare comand SQL este tratat ca i tranzacie i i se va aplica commit n momentul n care execuia a luat sfrit. Putem s oprim modul auto-commit pentru o conexiune activ cu :
con.setAutoCommit(false);

i pentru a-l porni din nou:


con.setAutoCommit(true) ;

Odat ce este oprit auto-commit-ul, nicio comand SQL nu o s fie committed (baza de date nu va fi permanent updatat), pn n momentul n care acest lucru este cerut concret:
con.commit() ;

n orice moment, nainte de a face commit, putem s apelm rollback() i s anulm tranzacia.
con.setAutoCommit(false); Statement stmt = con.createStatement(); stmt.executeUpdate("INSERT INTO Sells VALUES('Bar Of Foo', 'BudLite', 1.00)" ); con.rollback(); stmt.executeUpdate("INSERT INTO Sells VALUES('Bar Of Joe', 'Miller', 2.00)" ); con.commit(); con.setAutoCommit(true);

smaranda.belciug@inf.ucv.ro Tratarea erorilor cu ajutorul Excepiilor n programele care lucreaz cu baze de date pot aprea multe erori, care trebuie reparate. Programele trebuie s recupereze datele pierdute n urma erorilor i s lase baza de date ntr-o stare corect. Pentru a realiza acest lucru trebuie folosit rollback-ul. Clientul (programul) care acceseaz un server (baza de date) trebuie s fie prevenit de orice eroare care poate fi returnat de server. JDBC ofer accesul la astfel de informaii prin: SQLExeption i SQLWarning. SQLExceptions sunt excepii Java, care dac nu sunt tratate vor nchide aplicaia. SQLWarnings sunt subclase ale lui SQLException, dar reprezint erori nefatale, care pot fi ignorate. Exemplu. Un exemplu de prindere a unei excepii SQLException i de folosire a rollback-ului pentru anularea tranzaciei.
try { con.setAutoCommit(false) ; stmt.executeUpdate("CREATE TABLE Sells (bar VARCHAR2(40), " + "beer VARHAR2(40), price REAL)") ; stmt.executeUpdate("INSERT INTO Sells VALUES " + "('Bar Of Foo', 'BudLite', 2.00)") ; con.commit() ; con.setAutoCommit(true) ; }catch(SQLException ex) { System.err.println("SQLException: " + ex.getMessage()) ; con.rollback() ; con.setAutoCommit(true) ; }

n acest caz, o excepie este aruncat, deoarece beer este definit ca i VARHAR2, deci greit. SQLWarnings pot s returneze obiecte de tip Connection, obiecte Statement, obiecte ResultSet.
ResultSet rs = stmt.executeQuery("SELECT bar FROM Sells") ; SQLWarning warn = stmt.getWarnings() ; if (warn != null) System.out.println("Message: " + warn.getMessage()) ; SQLWarning warning = rs.getWarnings() ; if (warning != null) warning = warning.getNextWarning() ; if (warning != null) System.out.println("Message: " + warn.getMessage()) ;

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