Łączenie z bazą danych – przykładowa klasa infPolaczenie import
Transkrypt
Łączenie z bazą danych – przykładowa klasa infPolaczenie import
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania Łączenie z bazą danych – przykładowa klasa infPolaczenie import java.sql.DriverManager; import java.sql.Connection; import java.sql.SQLException; public class infPolaczenie { public static void main(String[] argv) { System.out.println("Sprawdzanie czy zostal zarejestrowany sterownik "); tr y { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException cnfe) { System.out.println("Nie moge znalezc sterownika!"); System.out.println("Wyswietlam sciezke i wychodze z programu."); cnfe.printStackTrace(); System.exit(1); } Łączenie z bazą danych – przykładowa klasa infPolaczenie (c.d.) System.out.println("Zarejestrowano sterownik, lacze sie..."); Connection c = null; try { c = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum","olga", "olga"); } catch (SQLException se) { System.out.println("Blad! Nie moge sie polaczyc"); se.printStackTrace(); System.exit(1); } if (c != null) System.out.println("Ustanowiono polaczenie z baza"); else System.out.println("Polacznie z baza nie powiodlo sie"); } } Metadane w JDBC - przykład Wykorzystanie metod interfejsu DatabaseMetaData do wypisania informacji o bazie danych: Metadane w JDBC – przykład (c.d.) System.out.print("Nazwa RDBMS: "); System.out.println(dmd.getDatabaseProductName()); System.out.print("Wersja PostgreSQL: "); System.out.println(dmd.getDatabaseProductVersion()); System.out.print("Nazwa użytkownika: "); System.out.println(dmd.getUserName()); System.out.print("Główny numer poprawki sterownika: "); System.out.println(dmd.getDriverMajorVersion()); System.out.print("Poboczny numer poprawki sterownika: "); System.out.println(dmd.getDriverMinorVersion()); System.out.print("Nazwa sterownika: "); System.out.println(dmd.getDriverName()); 1 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania System.out.print("Wersja sterownika: "); System.out.println(dmd.getDriverVersion()); Metadane w JDBC – przykład (c.d.) System.out.print("Adres URL sterownika JDBC: "); System.out.println(dmd.getURL()); System.out.print("Używanie plików lokalnych do zapisywania tabel: "); System.out.println(dmd.usesLocalFiles()); con.close(); } } Zapytania do bazy Connection con = null; Statement stm = null; ResultSet rs = null; try { Class.forName ("org.postgresql.Driver"); con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); stm = con.createStatement(); //utworzenie obiektu typu Statement //wykonanie zapytania rs = stm.executeQuery("SELECT imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres FROM osoby"); //przetworzenie otrzymanych danych while(rs.next()){ //wypisanie danych za pomocą funkcji println System.out.println(rs.getString("Nazwisko") +" , " + rs.getlnt("Wiek")”); } Zapytania do bazy catch(SQLException e){ //obsługa wyjątku } finally{ //zamknięcie połączenia z bazą danych try{ if(null!=con.close(); con = null; } catch(Exception ee){ ee.printStackTrace(); } } Zapytania do bazy - przykład import java.sql.*; import java.util.*; public class TabelaOsoby{ final static String jdbcDriver = "org.postgresql.Driver"; final static String table = "osoby"; public static void main(String[] args) { System.out.println("--- Zawartość tabeli osoby---"); 2 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania try { Class.forName(jdbcDriver); Zapytania do bazy - przykład (c.d.) Connection con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); Statement stm = con.createStatement(); ResultSet rs = stm.executeQuery("SELECT * FROM "+ table); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); for(int kol = 1; kol <= columnCount; kol++) { System.out.print(rsmd.getColumnLabel(kol)); System.out.print(" (" + rsmd.getColumnTypeName(kol)+")"); if(kol < columnCount) System.out.print(", "); } Zapytania do bazy - przykład (c.d.) System.out.println(); while(rs.next()) { for(int col = 1; col <= columnCount; col++) { System.out.print(rs.getString(col)); if(col < columnCount) System.out.print(", "); } System.out.println(); } rs.close(); stm.close(); con.close(); } catch (ClassNotFoundException e) { System.out.println("Nie można załadować sterownika"); } catch (SQLException e) { System.out.println("Wyjątek SQL : " + e.getMessage()); } } } Zapytania do bazy Connection con = null; Statement stm = null; ResultSet rs = null; try { Class.forName ("org.postgresql.Driver"); con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); stm = con.createStatement(); //utworzenie obiektu typu Statement //wykonanie zapytania rs = stm.executeQuery("SELECT imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres 3 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania FROM osoby"); //przetworzenie otrzymanych danych while(rs.next()){ //wypisanie danych za pomocą funkcji println System.out.println(rs.getString("Nazwisko") +" , " + rs.getlnt("Wiek")”); } Przewijanie zbioru wyników w JDBC Możliwe do ustawienia wartości parametrów int resultSetType, resultSetConcurrency oraz int Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy zadeklarować instrukcję: tr y { // utworzenie obiektu ResultSet z przewijaniem typu insensitive Statement stm = connection.createStatement ( // zestaw wyników z przewijaniem ResultSet.TYPE_SCROLL_INSENSITIVE, // zestaw wyników tylko do odczytu. ResultSet.CONCUR_READ_ONLY); // utworzenie obiektu ResultSet z przewijaniem typu sensitive stm = connection.createStatement ( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); } catch (SQLException e) { } Zapytania do bazy Connection con = null; Statement stm = null; ResultSet rs = null; try { Class.forName ("org.postgresql.Driver"); con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); stm = con.createStatement(); //utworzenie obiektu typu Statement //wykonanie zapytania rs = stm.executeQuery("SELECT imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres FROM osoby"); //przetworzenie otrzymanych danych while(rs.next()){ //wypisanie danych za pomocą funkcji println System.out.println(rs.getString("Nazwisko") +" , " + rs.getlnt("Wiek")”); } Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy zadeklarować instrukcję: tr y { 4 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania // utworzenie obiektu ResultSet z przewijaniem typu insensitive Statement stm = connection.createStatement ( // zestaw wyników z przewijaniem ResultSet.TYPE_SCROLL_INSENSITIVE, // zestaw wyników tylko do odczytu. ResultSet.CONCUR_READ_ONLY); // utworzenie obiektu ResultSet z przewijaniem typu sensitive stm = connection.createStatement ( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); } catch (SQLException e) { } Aktualizowanie zbioru wyników w JDBC Przykładowo, w celu zmiany danych w bazie można napisać kod: String query = "SELECT * FROM osoby"; ResultSet rs = stm.executeQuery(query); while(rs.next()){ if(…){ String nr = … String adres = rs.getString("adres") + nr; …….. rs.updateString ("adres", adres) ; rs.updateRow(); } } Zapytania do bazy Connection con = null; Statement stm = null; ResultSet rs = null; try { Class.forName ("org.postgresql.Driver"); con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); stm = con.createStatement(); //utworzenie obiektu typu Statement //wykonanie zapytania rs = stm.executeQuery("SELECT imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres FROM osoby"); //przetworzenie otrzymanych danych while(rs.next()){ //wypisanie danych za pomocą funkcji println System.out.println(rs.getString("Nazwisko") +" , " + rs.getlnt("Wiek")”); } Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy zadeklarować instrukcję: tr y { // utworzenie obiektu ResultSet z przewijaniem typu insensitive 5 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania Statement stm = connection.createStatement ( // zestaw wyników z przewijaniem ResultSet.TYPE_SCROLL_INSENSITIVE, // zestaw wyników tylko do odczytu. ResultSet.CONCUR_READ_ONLY); // utworzenie obiektu ResultSet z przewijaniem typu sensitive stm = connection.createStatement ( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); } catch (SQLException e) { } Aktualizowanie zbioru wyników w JDBC Przykładowo, w celu zmiany danych w bazie można napisać kod: String query = "SELECT * FROM osoby"; ResultSet rs = stm.executeQuery(query); while(rs.next()){ if(…){ String nr = … String adres = rs.getString("adres") + nr; …….. rs.updateString ("adres", adres) ; rs.updateRow(); } } Operacje na zbiorze wyników w JDBC Pokazuje to przykład: Zapytania do bazy Connection con = null; Statement stm = null; ResultSet rs = null; try { Class.forName ("org.postgresql.Driver"); con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); stm = con.createStatement(); //utworzenie obiektu typu Statement //wykonanie zapytania rs = stm.executeQuery("SELECT imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres FROM osoby"); //przetworzenie otrzymanych danych while(rs.next()){ //wypisanie danych za pomocą funkcji println System.out.println(rs.getString("Nazwisko") +" , " + rs.getlnt("Wiek")”); } Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy zadeklarować instrukcję: 6 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania tr y { // utworzenie obiektu ResultSet z przewijaniem typu insensitive Statement stm = connection.createStatement ( // zestaw wyników z przewijaniem ResultSet.TYPE_SCROLL_INSENSITIVE, // zestaw wyników tylko do odczytu. ResultSet.CONCUR_READ_ONLY); // utworzenie obiektu ResultSet z przewijaniem typu sensitive stm = connection.createStatement ( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); } catch (SQLException e) { } Aktualizowanie zbioru wyników w JDBC Przykładowo, w celu zmiany danych w bazie można napisać kod: String query = "SELECT * FROM osoby"; ResultSet rs = stm.executeQuery(query); while(rs.next()){ if(…){ String nr = … String adres = rs.getString("adres") + nr; …….. rs.updateString ("adres", adres) ; rs.updateRow(); } } Operacje na zbiorze wyników w JDBC Zasady użycia metod: executeOuery(), executeUpdate() i execute(), umożliwiających wykonanie poleceń SQL na rzecz obiektu Statement: Ten sam obiekt Statement może zostać wielokrotnie wykorzystany do wykonania różnych instrukcji SQL. Przykładowy kod, wstawiający do tabeli dwa rekordy za pomocą dwóch obiektów ResultSet ma postać: import java.sql.*; import java.io.*; public class DodawanieRekordow { public static DodawanieRekordow dodawanieRekordow; protected Connection connection = null; public DodawanieRekordow(){ try{ connect(); writeRecord(); close(); } 7 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania catch(SQLException e){ System.out.println("Błąd: " + e); while((e = e.getNextException()) != null){ } } } public static void main(String args[]){ dodawanieRekordow = new DodawanieRekordow(); public void connect()throws SQLException{ try{ Class.forName("org.postgresql.Driver"); } } catch(ClassNotFoundException e){ System.out.println("Błąd załadownaia sterownika: " + e); System.exit(-1); } connection = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); System.out.println("\nPołączenie zostało nawiązane\n"); } public void close()throws SQLException{ connection.close(); System.out.println("\nPołączenie zostało zamknięte\n"); } public void writeRecord()throws SQLException{ Statement statement = connection.createStatement(); int liczba = statement.executeUpdate("INSERT INTO osoby VALUES (1,'Olga', ‘Kowalska', '01/01/1980', 'Warszawa', ‘Nowa 27/11')"); System.out.println("Liczba dodanych rekordów: " + liczba); } } Operacje na zbiorze wyników w JDBC //połączenie jest nawiązane i utworzony obiekt Statement statement String sql; //do typu String przypisano zmienną reprezentującą polecenia SQL //... //wykonanie metody execute() boolean b = statement.execute(sql); if(b){ //sprawdzamy zwróconą wartość b == true //obsługa danych ResultSet rs = statement.getResultSet(); 8 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania while(rs.next()){ //... System.out.println(rs.getlnt("nazwa_pola")); // inna obsługa danych //... } } else{ // zwrócona wartość b == false //sprawdzenie ilości zmienionych rekordów int liczba = statement.getUpdateCount(); System.out.println("Liczba zmienionych rekordów: "+ liczba); } //zamknięcie połączenia ResultSet rs = stm.executeQuery("…"); //…. ResultSetMetaData rsmd = rs.getMetaData(); Connection con DriverManager.getConnection("jdbc:postgresql://localhost/ archiwum","olga", "olga"); void wypisz(String args){ System.out.println(args); } String query = "SELECT imie, nazwisko, adres FROM osoby"; try{ Statement stm = con.createStatement(); ResultSet rs = stm.executeQuery(query); ResultSetMetaData rsmd = rs.getMetaData(); int liczba = rsmd.getColumnCount(); //liczba kolumn for(int i = 1; i<=liczba; i++) { wypisz('\n' rsmd.getColumnName(i)); //nazwa wypisz(' ' rsmd.getColumnDisplaySize(i)); //szerokość wypisz(' ' rsmd.getColumnClassName(i)); //klasa Javy wypisz(' ' rsmd.getColumnType(i)); //typ SQL wypisz(' ' rsmd.getColumnTypeName(i)); //typ RDBMS } stm.close(); con.close(); } catch(SQLException e){ System.out.println(e.getMessage()); } 9 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania //połączenie zostało już nawiązane przez obiekt Connection con try{ con.setAutoCommit(false); //wyłączenie trybu autocommit Statement stm = con.createStatement(); //utworzenie ob. Statement //wywołanie polecenia SQL stm.executeUpdate("UPDATE osoby"+ ”SET adres = ‘Nowa 27‘”+ "WHERE Nazwisko LIKE '%ska';"); stm.executeUpdate("DELETE FROM osoby"+ "WHERE adres = ‘Nowa 27'"); con.commit(); //zatwierdzenie transakcji w przypadku braku błędów } catch(Exception e){ con.rollback(); } //odwołanie transakcji przy wystąpieniu błędów //zamknięcie połączenia Connection con = DriverManager.getConnection ("jdbc:postgresql://localhost/archiwum","olga", "olga"); Statement stm = con.createStatement(); Savepoint sp; stm.executeUpdate(("INSERT INTO osoby VALUES (1,'Olga', ‘Kowalska', '01/01/1980', 'Warszawa', ‘Nowa 27/11')"); sp = con.setSavepoint(safety); stm.executeUpdate("INSERT INTO akta_studenckie (id_osoby, nr_albumu) VALUES (2, 22780)"); try{ stm.executeUpdate("UPDATE osoby SET akta_studenckie = 2 WHERE id = 1"); catch(SQLException e){ con.rollback(sp); } con.commit(); Transakcje w JDBC - przykładowy program import java.sql.* ; public class Transakcja1 { public static void main(String [ ] args) throws SQLException { int kod_bledu ; Connection conn = null ; try { //Załadowanie i rejestracja sterownika Oracle DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver( )); //ustanawiamy połączenie conn = DriverManager.getConnection („jdbc:oracle:thin:@training: 1521:Oracle”, „oratest”, oratest”) ; Transakcje w JDBC - przykładowy program //W Wyłączamy tryb automatycznego zatwierdzania conn = setAutoCommit( false) ; 10 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania String sql1 = „SELECT nr FROM tabela WHERE nr=? ” ; String sql2 = „INSERT INTO tabela VALUES (?.?.?) ” ; PreparedStatement pstmt1 = conn. prepareStatement (sql1) ; PreparedStatement pstmt2 = conn. prepareStatement (sql2) ; pstmt1.setInt(1, 9999); ResultSet rset = pstmt1.executeQuery( ) ; if (rset.next( ) ) { System.out.println(”nr 9999 istnieje”) ; rset.close ( ) ; } else { pstmt2.setInt(1, 9999); pstmt2.setString(2, „Adam”) ; pstmt2.setString(3, „Kowalski”) ; } Transakcje w JDBC - przykładowy program pstmt1.close ( ) ; pstmt2.close( ) ; //zzatwierdzamy efekt instrukcji INSERT conn.commit( ) ; conn.close( ) } catch (SQLException e) //w wycofujemy zmiany, aby anulować efekt instrukcji INSERT { conn. Rollback ( ) ; kod_bledu = e.getErrorCode( ) ; System.err.println(kod_bledu + e.getMessage( ) ) ; } } } Connection con = null; try{ //wywołanie funkcji powodujących wyjątek: // połączenie z bazą danych, polecenia SQL } catch(SQLException e){ //przechwycenie wyjątku i wyświetlenie go na konsoli System.out.println(e.getMessage()); //pobranie referencji do kolejnych wyjątków, //do momentu otrzymania wartości null while(null!=(e=e.getNextException()){ //wyświetlenie informacji o kolejnych wyjątkach System.out.println(e.getMessage()); } } Connection con = null; try{ 11 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania //połączenie i wykonanie transakcji } catch(SQLException e) { //obsługa wyjątku } final { if(con!= null){ try {con.close();} catch(SQLException e){ } } } Mapowanie typów danych w JDBC Przykład wywołania funkcji wyzej z konwertowaniem dostarczonych argumentów znakowych na wielkie litery //utworzono i zainicjowano obiekt Connection con //utworzenie obiektu CallableStatement, z podaniem w argumencie // funkcji 'prepareCall' składni wywołania funkcji przechowywanej CallableStatement wyzej = con.prepareCall("{?=call wyzej(?)}"); //rejestracja par. wyjściowego funkcji którym jest znacznik "?" wyzej.registerOutParameter(1, Types.VARCHAR); //przypisanie pierwszemu znacznikowi '?' wartości wyzej.setString(2, "Konwertuj z małych liter na duże"); //wywołanie wykonania funkcji przechowywanej wyzej.execute(); String wyzejPobierz = wyzej.getString(1); wyzej.close(); Przykład zwracania wartości funkcji jako refcursor //ustawiono wywołanie funkcji. Statement stm = con.createStatement(); stm.execute("CREATE OR REPLACE FUNCTION refKursorFunkcja()" +"RETURNS refcursor AS’ DECLARE kursor refcursor ; " + " BEGIN OPEN kursor FOR SELECT 1 UNION SELECT 2; " + " RETURN kursor ; END ;' language plpgsql"); stm.close(); //należy być wewnątrz transakcji dla kursorów, by pracować z nimi con.setAutoCommit(false); //wywołanie procedury CallableStatement proc = con.prepareCall("{?=call refKursorFunkcja()}"); proc.registerOutParameter(1, Types.Other); proc.execute(); ResultSet rs = (ResultSet)proc.getObject(1); while (rs.next()) { //działania na rezultatach } rs.close(); 12 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania proc.close(); Przykład zwracania wartości funkcji jako typ danych SETOF Statement stm = con.createStatement(); stm.execute("CREATE OR REPLACE FUNCTION setOfFunkcja()" +"RETURNS SETOF int AS 'SELECT 1 UNION SELECT 2; ' language sql"); ResultSet rs = stm.executeQuery("SELECT * FROM setOfFunkcja()"); while (rs.next()) { // jakies operacje na danych } rs.close(); stm.close(); Funkcje przechowywane w JDBC Wartości zwracane przez refcursor można potraktować jako nazwę kursora; w tym celu należy użyć metody getString() obiektu ResultSet. W kursorze można również używać takich poleceń jak FETCH i MOVE. Obsługa dużych obiektów w JDBC JDBC umożliwia obsługę stosunkowo dużych obiektów za pomocą metod getBytes() i getString(), należących do interfejsu java.sql.ResultSet. Często jednak znajdujące się w bazie obiekty mogą być tak duże, że zastosowanie powyższych metod nie będzie możliwe. JDBC udostępnia metody operujące na strumieniach: getBinaryStream(), getAsciiStream(), getUnicodeStream() setBinaryStream(), setAsciiStream() setUnicodeStream(). W celu zapisania w bazie danych znajdującego się na dysku twardym zdjęcia należy napisać kod: //utworzono połączenie, stworzono i zainicjowano obiekt // Connection con i utworzono obiekt File dla pliku zdjecia File zdjecie = new File("olga.gif"); int wielkoscPliku = zdjecie.length(); //odczytanie wielkości pliku //utworzenie strumienia wejściowego z pliku InputStream is = new FileInputStream(zdjecie); //przygotowanie poleceń wstawiania do bazy PreparedStatement pstm = 13 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania con.prepareStatement("UPDATE PORTRETY SET zdjecie = ?" + "WHERE nazwisko = ‘Kowalska'"); //przypisanie strumienia wejściowego z pliku //do strumienia danych, przesyłanych do bazy pstm.setBinaryStream(1, is, wielkoscPliku); pstm.execute(); //wywołanie wykonania polecenia W celu uzyskania pliku z bazy danych należy napisać kod: //utworzono połączenie, stworzono i zainicjowano obiekt // Connection con i utworzono obiekt Statement w postaci: Statement stm = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); String query = "SELECT zdjecia FROM osoby" + //utworzenie polecenia SQL "WHERE Nazwisko = ‘Kowalska'"; //wykonanie zapytania- otrzymanie referencji do obiektu ResultSet ResultSet rs = stm.executeQuery(query); byte() bufor = new byte[2048]; //utworzenie buforu dla danych wypisanych z bazy //ustawienie kursora obiektu ResultSet przed pierwszym rekordem rs.beforeFirst(); while(rs.next()){ //przypisanie do zmiennej is strumienia wejściowego z bazy InputStream is = rs.getBinaryStream("zdjecie"); int rozmiar = 0; //odczytanie danych ze strumienia while((rozmiar = in.read(bufor)) > 0){ //... } //operacja na danych pobranych z bazy } Sposób obsługi struktur w JDBC ilustruje przykład: import java.sql.*; public Class DodatkoweInformacje implements SQLData { //deklarowanie zmiennej określającej nazwę struktury private String sql_type; //deklarowanie zmiennych, odpowiadających polom struktury public int wzrost; public String dodatkowe_dane; //konstruktor bez paramertów, inicjujący obiekt przez JDBC public DodatkoweInformacje(){ } //drugi konstruktor, niezbędny do utworzenia i zapisu obiektu do bazy public DodatkoweInformacje(String sql_type, int wzrost, String dodatkowe_dane) { this.sql_type = sql_type; this.wzrost = wzrost; this.dodatkowe_dane = dodatkowe_dane; } 14 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania //implementowanie funkcji z interfejsu SQLData zwracającej sql_type public String getSQLTypeName() throws SQLException{ return sql_type; } public void readSQL(SQLInput stream, String typeName) throws SQLException{ //podstawienie do zmiennej sql_type wartości przekazanej //w argumencie typeName sql_type = typeName; //odczytanie ze strumienia wartości pól struktury //w kolejności określonej w definicji struktury w bazie danych wzrost = stream.readlnt(); dodatkowe_dane = stream.readString(); } public void writeSQL(SQLOutput stream) throws SQLException{ //zapisanie do strumienia wartości zmiennych obiektu //w kolejności określonej w definicji struktury w bazie danych stream.writeInt(wzrost); stream.writeString(dodatkowe_dane); } } //nawiązano połączenie z bazą danych oraz stworzono // i zainicjowano obiekt Connection con //pobranie referencji do obiektu Map zawierającego zmapowane typy //SQL do klas Javy java.util.Map map = con.getTypeMap(); //mapowanie struktury do zaimplementowanej klasy map.put("informacje", Class.forName("DodatkoweInformacje")); //utworzenie obiektu Statement Statement stm = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, RsultSet.CONCUR_READ_ONLY) //wykonanie zapytania ResultSet rs = stm.executeQuery("SELECT informacje FROM osoby” +"WHERE nazwisko = ‘Kowalska'"); //w tabeli jest jeden taki rekord, więc rezultat zapytania został //zapisany dla pierwszego wyniku rs.first(); //pobranie obieku DodatkoweInformacje inf = (DodatkoweInformacje)rs.getObject("informacje"); //przetwarzanie zwróconych danych System.out.println("Waga: "+inf.waga); System.out.println("dodatkowe_dane: "+inf. dodatkowe_dane); Struktury w JDBC Sposób dodania nowych wartości do bazy danych do tabeli osoby z wykorzystaniem uprzednio zdefiniowanego obiektu DodatkoweInformacje ilustruje kod: 15 Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems; Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania //utworzenie obiektu PreparedStatement i przypisanie do niego //polecenia SQL modyfikującego dane w kolumnie informacje, jeśli //zostanie spełniony warunek WHERE PreparedStatement pstm = con.prepareStatement("UPDATE osoby " + "SET informacje = ?"+ "WHERE nazwisko = ‘Kowalska'"); //utworzenie obiektu klasy DodatkoweInformacje DodatkoweInformacje inf = new DodatkoweInformacje(196, "Polka, dwie specjalizacje: informatyka, elektrotechnika"); //przypisanie zmiennej inf do znacznika ? pstm.setObject(1, daneOs, Types.STRUCT); //wykonanie polecenia UPDATE pstm.execute(); //... Wywoływanie procedur przechowywanych Javy w JDBC - przykładowy program import java.sql.* ; public class JavaProcPrzyklad { public static void main(String [ ] args) throws SQLException { int kod_bledu ; Connection conn = null ; try { //Załadowanie i rejestracja sterownika Oracle DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver( )); //ustanawiamy połaczenie conn = DriverManager.getConnection („jdbc:oracle:thin:@training: 1521:Oracle”, „oratest”, oratest”) ; //P Procedura usuwa rekordy z tabeli, w których nr = 20 int i_nr = 20 ; CallableStatement pstmt = conn.prepareCall(”{call proc_nazwa (?) }” ) ; pstmt.setInt (1, i_nr) ; pstmt.executeUpdate ( ) ; pstmt.close ( ) ; conn.close( ) } catch (SQLException e) { kod_bledu = e.getErrorCode( ) ; System.err.println(kod_bledu + e.getMessage( ) ) ; conn.close( ) ; } } } 16