Bazy Danych JDBC Wywoływanie poleceń SQL z języków programowania. Plan ćwiczenia Wprowadzenie do laboratorium. Nawiązywanie i zamykanie połączeń. Wykonywanie zapytań. Wykonywanie aktualizacji. Zarządzanie transakcjami. Prekompilowane polecenia. Ćwiczenie 0 JDBC Ćwiczenie 0 JDBC () Plan ćwiczenia cd. Wprowadzenie do laboratorium Zwiększanie liczby przesyłanych krotek. Aktualizowanie wsadowe. Modyfikowalne zbiory wyników. SQLJ. Podsumowanie. Program napisany w języku Java JDBC API MenadŜer sterowników JDBC Typ Typ Typ Typ JDBC - ODBC ODBC Biblioteka DB Opr. pośrednie SZBD Ćwiczenie 0 JDBC () Ćwiczenie 0 JDBC ()
Nawiązywanie i zamykanie połączeń Wykonywanie zapytań import java.sql.*; Statement stmt = con.createstatement() ; Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@dblab.cs.put.poznan.pl:5:dblab0g", "elearning_user", "elearning_pass"); con.close(); "SELECT nazwisko,placa_pod FROM pracownicy"); String nazwisko=rs.getstring("nazwisko"); float placa=rs.getfloat(); System.out.println(nazwisko+" "+placa); Ćwiczenie 0 JDBC (5) Ćwiczenie 0 JDBC (6) Wykonywanie aktualizacji danych Zarządzanie transakcjami Statement stmt = con.createstatement() ; int changes; "INSERT INTO pracownicy(id_prac,nazwisko)"+ "VALUES(00,'Zieliński')"); System.out.println("Wstawiono "+changes+" krotek."); "UPDATE pracownicy " + "SET placa_pod=placa_pod*.5"); System.out.println("Zmodyfikowano "+changes+" krotek."); "DELETE FROM pracownicy WHERE id_prac=00"); private static int ilepracownikow(connection con) throws SQLException { int result; Statement stmt=con.createstatement(); "SELECT COUNT(*) FROM pracownicy"); rs.next(); result=rs.getint(); return result; Ćwiczenie 0 JDBC (7) Ćwiczenie 0 JDBC (8)
Zarządzanie transakcjami cd. Prekompilowane polecenia con.setautocommit(false); Statement stmt=con.createstatement(); System.out.println(ilePracownikow(con)); // "DELETE FROM pracownicy WHERE id_prac=50"); con.rollback(); System.out.println(ilePracownikow(con)); // "SELECT nazwisko FROM pracownicy WHERE id_prac=?"); ResultSet rs; stmt.setint(,0); rs=stmt.executequery(); System.out.println(rs.getString("NAZWISKO")); "DELETE FROM pracownicy WHERE id_prac=50"); con.commit(); System.out.println(ilePracownikow(con)); // stmt.setint(,70); rs=stmt.executequery(); System.out.println(rs.getString("NAZWISKO")); Ćwiczenie 0 JDBC (9) Ćwiczenie 0 JDBC (0) Prekompilowane polecenia cd. Aktualizowanie wsadowe "UPDATE pracownicy SET placa_pod=?, etat =? WHERE id_prac=?"); "UPDATE pracownicy SET placa_pod=placa_pod *? WHERE id_prac =? "); stmt.setfloat(,000); stmt.setstring(,"profesor"); stmt.setint(,0); int changes =stmt.executeupdate(); System.out.println("Zmodyfikowano "+changes+ " krotek"); stmt.setfloat(,new Float(0.9)); stmt.setint(,0); stmt.addbatch(); stmt.setfloat(,new Float(.5)); stmt.setint(,50); stmt.addbatch(); int []changes =stmt.executebatch(); System.out.println("Zmodyfikowano"+changes[0]+", +changes[]+" krotek"); Ćwiczenie 0 JDBC () Ćwiczenie 0 JDBC ()
Zwiększanie przesyłanej liczby krotek Przewijalne zbiory wyników Statement stmt = con.createstatement(); ((OracleStatement)stmt).setRowPrefetch(0); Statement stmt = con.createstatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); "SELECT nazwisko FROM pracownicy"); while (rs.next()) System.out.println(rs.getString()); ResultSet rs = stmt.executequery( "SELECT nazwisko FROM pracownicy"); rs.absolute(); System.out.println(rs.getString()); rs.absolute(-); System.out.println(rs.getString()); rs.relative(-); System.out.println(rs.getString()); rs.relative(); System.out.println(rs.getString()); rs.afterlast(); while(rs.previous())system.out.println(rs.getstring()); Ćwiczenie 0 JDBC () Ćwiczenie 0 JDBC () Modyfikowalne zbiory wyników Wyjątki Statement stmt = con.createstatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executequery( "SELECT id_prac,nazwisko,placa_pod FROM pracownicy"); rs.last(); rs.updatestring(,rs.getstring()+""); rs.updatefloat("placa_pod", new Float(rs.getFloat()*0.9)); rs.updaterow();// albo rs.cancelrowupdates(); Statement stmt; try { stmt=con.createstatement(); stmt.executeupdate( "DELETE FROM pracownicy WHERE nazwisko='weglarz'"); catch (SQLException e) { System.out.println("Stan SQL: "+e.getsqlstate()); System.out.println("Kod błędu: "+e.geterrorcode()); rs.movetoinsertrow(); rs.updateint(,0); rs.updatestring(,"zieliński"); rs.updatefloat(,new Float(.5)); rs.insertrow(); System.out.println("Komunikat: "+e.getmessage()); Ćwiczenie 0 JDBC (5) Ćwiczenie 0 JDBC (6)
SQLJ Podsumowanie import oracle.sqlj.runtime.oracle; import java.sql.*; #sql iterator MyIter (String nazwisko); Oracle.connect("jdbc:oracle:thin:@dblab.cs.put.poznan.pl: 5:dblab0g", elearning_user", elearning_pass"); 5 MyIter zap; #sql zap={select nazwisko from pracownicy; while (zap.next()) System.out.println(zap.nazwisko()); Oracle.close(); JDBC (Java Database Connectivity) to API pozwalające programom napisanym w języku Java na korzystanie z SZBD do zapisywania i odczytywania danych w bazie danych. JDBC pozwala na wykonywanie poleceń SQL tworzonych ad hoc, oraz poleceń prekompilowanych. W JDBC.0 poprzez wyniki zapytań moŝna modyfikować relacje bazowe zapytania, oraz w dowolny sposób je przeglądać. MoŜliwe jest równieŝ równieŝ wsadowe wykonywanie aktualizacji danych. SQLJ pozwala na zagnieŝdŝanie zapytań bezpośrednio w kodzie programów napisanych w języku Java. Ćwiczenie 0 JDBC (7) Ćwiczenie 0 JDBC (8)