Łączenie z bazą danych przykładowa klasa infpolaczenie import java.sql.drivermanager; import java.sql.connection; import java.sql.

Podobne dokumenty
Połączenie z bazą danych

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

JDBC (Java Database Connectivity vit )

JAVA I BAZY DANYCH. MATERIAŁY:

JAVA bazy danych. na bazie: Język Java - Podstawy Programowania - Jacek Rumiński

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

Programowanie w języku Java. Bazy danych SQLite w Javie

Typy sterowników. Rozdział 21 JDBC. Podstawowe kroki aplikacji. Historia. Program napisany w języku Java JDBC API. Menadżer sterowników JDBC

Bazy danych wykład dwunasty

JDBC. Plan ćwiczenia. Wywoływanie poleceń SQL z języków programowania. Plan ćwiczenia cd. Wprowadzenie do laboratorium

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Programowanie komputerów. Wykład 10: Dostęp do baz danych z poziomu aplikacji Java. (JDBC Database Access)

Rozdział 9 Obsługa baz danych w języku Java

Podejście obiektowe do relacyjnych baz danych Hibernate.

Java Database Connectivity

Aplikacje Internetowe

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

JDBC - Obsługa baz danych w języku Java

PL/SQL. Zaawansowane tematy PL/SQL

Bartosz Jachnik - Kino

Plan wykładu. Dostęp do bazy danych. Architektura JDBC. Dostęp do baz danych z aplikacji Java EE

Metody dostępu do danych

PODSTAWY BAZ DANYCH 13. PL/SQL

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Java Database Connectivity

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

DB+frontend Inne języki H2. Bazy Danych i Systemy informacyjne Wykład 9. Piotr Syga

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

akademia androida Składowanie danych część VI

przygotował: Bazy danych Paweł Kasprowski Wersja 2006Z

Podstawy otwartych języków programowania Java Database Connectivity (JDBC)

Podstawy i języki programowania

Bloki anonimowe w PL/SQL

Informatyka I. Standard JDBC Programowanie aplikacji bazodanowych w języku Java

Połączenia między bazami danych i programem w języku Java część 2

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Aplikacje WWW - laboratorium

Protokół JDBC współpraca z relacyjnymi bazami danych lab4. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Wykład 4: Klasy i Metody

Protokół JDBC współpraca z relacyjnymi bazami danych lab3

Oracle PL/SQL. Paweł Rajba.

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

Wzorce logiki dziedziny

Pakiety podprogramów Dynamiczny SQL

Programowanie w języku Java

Bazy danych SQLite w Javie

SQL 4 Structured Query Lenguage

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Dokumentacja do API Javy.

Programowanie Obiektowe Java

Zaawansowane aplikacje WWW - laboratorium

Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski. Zaawansowane Systemy Decyzyjne. Laboratorium

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Java rozszerzenie. dr. A. Dawid

Składowane procedury i funkcje

Programowanie obiektowe

Programowanie Obiektowe Java

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Oracle PL/SQL. Paweł Rajba.

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

BAZA DANYCH SIECI HOTELI

Metody Metody, parametry, zwracanie wartości

15. Funkcje i procedury składowane PL/SQL

Metody dostępu do danych

Java i bazy danych. 1. JDBC podstawy, transakcje. 2. Mapowanie relacyjno obiektowe. Hibernate, przykład.

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Programowanie obiektowe

Protokół JDBC współpraca z relacyjnymi bazami danych

Ćwiczenie 10 JDBC. Wywoływanie poleceń SQL z języków programowania. Ćwiczenie 10 JDBC. Wymagania: Bazy Danych

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Podstawy programowania III WYKŁAD 2

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Kurs WWW. Paweł Rajba.

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

DAO. tworzenie tabeli

Generowanie dokumentów XML z tabel relacyjnych - funkcje SQLX

Kurs programowania aplikacji bazodanowych

Podstawy i języki programowania

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Procedury i funkcje składowane

Programowanie obiektowe

Rozdział 4 KLASY, OBIEKTY, METODY

Klasy i obiekty cz II

Wykład 2: Podstawy Języka

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3

Kursor jawny. Rozdział 10a Kursory. Deklarowanie kursora (1) Deklarowanie kursora (2)

Kurs programowania. Wykład 9. Wojciech Macyna

Transkrypt:

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

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

Class.forName(jdbcDriver); Kody do wykładu Programowanie baz danych JDBC Maria Dems; 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; 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

FROM osoby"); //przetworzenie otrzymanych danych //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, oraz int resultsetconcurrency Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy zadeklarować instrukcję: // 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; 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 //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ę: 4

// 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); 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; 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 //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ę: // utworzenie obiektu ResultSet z przewijaniem typu insensitive 5

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

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

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

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

//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 ; //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 //Wyłączamy tryb automatycznego zatwierdzania conn = setautocommit( false) ; 10

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( ) ; //zatwierdzamy efekt instrukcji INSERT conn.commit( ) ; conn.close( ) catch (SQLException e) //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

//połączenie i wykonanie transakcji catch(sqlexception e) { //obsługa wyjątku final { if(con!= null){ 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

proc.close(); Kody do wykładu Programowanie baz danych JDBC Maria Dems; 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

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

//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

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