1 / 43

Programowanie sieciowe w Javie

Programowanie sieciowe w Javie. Michał Kuciapski m.kuciapski@univ.gda.pl. Bazy danych. Bazy danych. Metody dostępu. JDBC.

ura
Télécharger la présentation

Programowanie sieciowe w Javie

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programowanie sieciowe w Javie Michał Kuciapski m.kuciapski@univ.gda.pl

  2. Bazy danych

  3. Bazy danych Metody dostępu

  4. JDBC • JDBC (Java Database Connectivity) jest interfejsem(sterownikiem) niskiego poziomu języka Java przeznaczony do bezpośredniego wykonywania poleceń SQL (Structured QueryLanguage). • JDBC jest odpowiedzialny za: • tworzenie połączenia z bazą danych • wysłanie polecenia (poleceń) SQL • przetwarzanie otrzymanych wyników

  5. ODBC • ODBC (Open DataBase Connectivity) jest interfejsem Microsoftu umożliwiającym również korzystanie z baz danych, co wiąże się jednak z szeregiem nieodgodności: specyficzność i ograniczenie metod programowania, konieczność ręcznego konfigurowania parametrów połączenia na każdej platformie. • Dla ułatwienia programowania dostępu do baz z połączeniami ODBC utworzony został most JDBC-ODBC automatycznie …

  6. DBMS • DBMS (DataBase Management System) jest systemem zarządzania bazami danych, którego rolą jest: tworzenie struktury bazy, wypełnianie bazy danych, usuwanie, aktualizacja rekordów, nadawanie praw dostępu, itp. • DBMS najczęściej instalowany jest najczęściej wraz z instalacją sterowników.

  7. Bazy danych Połączenia

  8. Sterowniki • Sterowniki, są pakietami zawierającymi implementację deklarowanych klas, atrybutów i metod związanych z obsługą dostępu i zarządzania bazą danych odnośnie: • inicjowania i zamykania połączeń • wykonywania zapytań (interfejs Statement) • zwracania i przetwarzania wyników zapytań (interfejs ResultSet) • Sterowniki muszą występować po stronie dokonującej połączenie z bazą danych a w przypadku appletów sterownik musi być zainstalowany na serwerze WWW tam, skąd pochodzi applet.

  9. Sterowniki • Dla połączenia z bazą danych konieczne jest zainstalowanie odpowiedniego dla niej sterownika. Dokonuje się tego poprzez: • program instalacyjny • rejestracje klasy lub pakietu • Klasę lub pakiet sterownika rejestrujemy poprzez umieszczenie go w odpowiednim podkatalogu jdk oraz podanie nazwy jako parametru metody statycznej Class.forName() – np. dla MySQLa Class.forName("com.mysql.jdbc.Driver")

  10. Koncepcja • Utworzenie połączenia z bazą danych polega utworzeniu odpowiedniego obiektu klasy Connection. W tym celu stosuje się jedną z przeciążonych statycznych metod getConnection klasy DriverManager. • Każda metoda getConnection zawiera jako argument adres URL dostępu do bazy - jdbc:sterownik:lokalizacja

  11. Koncepcja c.d. • jdbc:sterownik:lokalizacja, gdzie: • jdbc – element stały określa nazwę protokołu • sterownik – określa nazwę sterownika lub mechanizmu połączenia, np.: odbc, mysql • lokalizacja – opis lokalizacji bazy danych w postaci //host:port/ścieżka • Przykłady: • jdbc:odbc:baza_testowa • jdbc:mysql://bsvc.univ.gda.pl:4000/baza_testowa

  12. Tworzenie połączenia • Połączenie dokonywane jest za pomocą metody statycznej getConnection() klasy DriverManager: • Connection getConnection(String url) • Connection getConnection(String url, String info) • Connection getConnection(String url, String użytkownik, String hasło) • Aby móc skorzystać ze statycznej metody getConnection() należy zaimportować klasy pakietu java.sql.*. Ponadto wymaga ona obsłużenia błędu SQLException.

  13. Przykład • import java.sql.*; • public class BazaPoloczenie { • public static void main(String args[]){ • try{ • Class.forName("com.mysql.jdbc.Driver"); • System.out.println("Połączenie za pomocą wyłącznie url"); • Connection poloczenie1 = DriverManager.getConnection("jdbc:mysql://localhost/firmatest?user=root&password=p@ssw0rd"); • System.out.println("Połączenie za pomocą: url, loginu i hasła"); • Connection poloczenie2 = DriverManager.getConnection("jdbc:mysql://localhost/firmatest","root","p@ssw0rd");

  14. Przykład c.d. • } • catch(ClassNotFoundException e) • { • System.out.println("Brak klasy: " + e.getMessage()); • } • catch(SQLException e) • { • System.out.println("Błąd połączenia: " + e.getMessage()); • } • } • }

  15. Bazy danych Tworzenie obiektów poleceń

  16. Wykorzystywane interfejsy • W celu wysłania polecenia SQL należy stworzyć jeden z typów obiektów: • Statementstanowi kontener dla wykonywanych poleceń SQL i umożliwia wysyłanie poleceń SQL nie zawierających parametrów • PreparedStatement używany jest do wykonywania przygotowanych poleceń SQL, zawierających jedno lub więcej pól parametrów, oznaczanych znakiem "?" • CallableStatement jest wykorzystywany do tworzenia odwołań do przechowywanych w bazie danych procedur

  17. Tworzenie interfejsów • W celu utworzenia obiektu dla wykonywania poleceń należy wywołać w zależności od typu tworzonego obiektu jedną z metod statycznych dla obiektu klasy Connection: • createStatement() – dla utworzenia obiektu klasy • Statement • prepareStatement()- dla utworzenia obiektu klasy • PreparedStatement • prepareCall() - dla utworzenia obiektu klasy • CallableStatement

  18. Definiowanie typów wywoływania poleceń • Metoda createStatement posiada 3 przeciążenia: • Statement createStatement()– tworzy obiekt klasy Statement dla przesyłania zapytań SQL do bazy • Statement createStatement(int resultSetType, int resultSetConcurrency) – tworzy obiekt klasy Statement, dla którego generowane wyniki zapytań będą mieć odpowiedni format oraz modyfikowalność • Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) – tworzy obiekt klasy Statement, dla którego generowane wyniki zapytań będą mieć odpowiedni format, modyfikowalność oraz zachowania kursora

  19. Wartości parametrów tworzenia obiektów poleceń • Dla resultSetType: • ResultSet.TYPE_FORWARD_ONLY - kursor może poruszać się wyłącznie do przodu • ResultSet.TYPE_SCROLL_INSENSITIVE - kursor może się swobodnie poruszać i nie jest wrażliwy na zmiany dokonywane przez inne kursory • ResultSet.TYPE_SCROLL_SENSITIVE - kursor może się swobodnie poruszać i jest wrażliwy na zmiany dokonywane przez inne kursory

  20. Wartości parametrów tworzenia obiektów poleceń c.d. • DlaresultSetConcurrency • ResultSet.CONCUR_READ_ONLY – zwrócone wartości pól rekordów mogą być wyłącznie odczytywane • ResultSet.CONCUR_UPDATABLE -zwrócone wartości pól rekordów mogą być zmieniane i aktualizowane dla bazy • Dla resultSetHoldability: • ResultSet.HOLD_CURSORS_OVER_COMMIT – obiekt klasy ResultSet reprezentujący zwrócone dane w wyniku zapytania po wykonaniu metody Connection.commit nie ma zostać zamknięty • ResultSet.CLOSE_CURSORS_AT_COMMIT - – obiekt klasy ResultSet reprezentujący zwrócone dane w wyniku zapytania po wykonaniu metody Connection.commit ma zostać zamknięty

  21. Przykład • import java.sql.*; • public class BazaPoloczenie { • public static void main(String args[]){ • try{ • Class.forName("com.mysql.jdbc.Driver"); • System.out.println("Połączenie za pomocą wyłącznie url"); • Connection poloczenie1 = DriverManager.getConnection("jdbc:mysql://localhost/firmatest?user=root&password=p@ssw0rd"); • System.out.println("Tworzenie obiektu połączenia"); • Statement polecenie = poloczenie.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

  22. Metody wykonywania poleceń • Do podstawowych metod wykonywania poleceń należą: • executeQuery() – umożliwia wywoływanie poleceń typu select i zwraca wynik zapytania jako obiekt ResultSet • executeUpdate() - umożliwia wywoływanie poleceń typu: insert , update , create , drop , alter i zwraca liczbę zmienionych wierszy • execute() - przygotowana do obsługi poleceń zwracających większą ilość zbiorów danych (obiektów klasy ResultSet) • W przypadku obiektu PreparedStatement wyrażenie SQL musi być odpowiednio przygotowane – obiekt zawiera prekompilowane wyrażenie SQL. Wymaga to podania wartości parametrów za pomocą metod set.

  23. Przykład • polecenie.executeUpdate("insert into miasto(miasto,gmina,powiat,wojewodztwo) values('Tczew','Tczew','Tczewski','Pomorskie')"); • PreparedStatement poleceniePS = poloczenie.prepareStatement( • "insert into miasto(miasto,wojewodztwo) values(?,?)"); • poleceniePS.setString(1,"Poznań"); • poleceniePS.setString(2,"Wielkopolskie"); • poleceniePS.executeUpdate();

  24. Bazy danych Rezultaty i ich przetwarzanie

  25. Koncepcja • W wyniku zapytania typu executeQuery() jako wynik zwracany jest obiekt klasy ResultSet zawierający będące wynikiem zapytania rekordy. • Możliwe jest wykonywanie szeregu operacji na obiekcie tej klasy: • Przechodzenie kursorem pomiędzy rekordami i pobieranie wartości dla poszczególnych pól rekordu • Dodawanie, usuwanie, aktualizowanie rekordów zarówno dla ResultSet jak i bazy danych – wyłącznie jeśli polecenie dla, którego został utworzony ResultSet było ustawione jako typ ResultSet.CONCUR_UPDATABLE

  26. Metody nawigacji pomiędzy rekordami • Metody służące przechodzeniu pomiędzy rekordami w ramach zwróconego jako wynik zapytania obiektu klasy ResultSet: • previous() – powoduje przejście do rekordu • poprzedniego • next() – powoduje przejście do rekordu następnego • first() – powoduje przejście do rekordu pierwszego • last() – powoduje przejście do rekordu ostatniego • absolute(int rekord) – powoduje przejście do • wskazanego rekordu podanego jako parametr metody

  27. Metody nawigacji pomiędzy rekordami c.d. • W trakcie przechodzenia pomiędzy rekordami metodami previous() i next() konieczne jest sprawdzenie odpowiednio warunków: • isFirst() – zwraca czy bieżący rekord jest pierwszym rekordem w ResultSet • isLast() - zwraca czy bieżący rekord jest ostatnim rekordem w ResultSet

  28. Metody informacyjne dla rekordów i ResultSet • Najważniejsze metody służące pobieraniu informacji o rekordach i obiekcie klasy ResultSet: • getRow()– zwraca indeks bieżącego rekordu • refreshRow()– powoduje odświeżenie wartości wiersza zgodnie z aktualną wartością w bazie danych • getMetaData()– zwraca metadane o definicji rekordu • getType()– pobiera informacje o typie ResultSet • getStatement() – pobiera tekst polecenia, które spowodowało utworzenie obiektu ResultSet • findColumn(String nazwa)– umożliwia sprawdzenie występowania określonej kolumny

  29. Pobieranie danych z ResultSet • Dane z obiektu klasy ResultSet pobieramy za pomocą metody get z przyrostkiem typu danych podając jako parametr bądź indeks kolumny lub jej nazwę: • String getString(int indeksKolumny) • Float getFloat(String nazwaKolumny) • Przykłady: • jtxbImie.setText(rezultat. getString(2)) ; • jtxbPensja.setText(rezultat.getFloat("pensja").toString() );

  30. Przykład • Class.forName("com.mysql.jdbc.Driver"); • poloczenie = DriverManager.getConnection("jdbc:mysql://localhost/firmatest?user=root&password=p@ssw0rd"); • zapytanie = poloczenie.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, • ResultSet.CONCUR_UPDATABLE); • rezultat = zapytanie.executeQuery("select * from towar;"); • rezultat.next(); • wyswietlDane();

  31. Przykład c.d. • try • { • jtfSymbol.setText(rezultat.getString("symbol_towaru")); • jtfNazwa.setText(rezultat.getString("nazwa_towaru")); • jtfOpis.setText(rezultat.getString("opis_towaru")); • jtfCena.setText(rezultat.getString("cena_towaru")); • } • catch(SQLException e) • { • JFrame ramka = new JFrame(); • JOptionPane.showMessageDialog(ramka, "Błąd wyświetlenia • danych: " + e.getMessage(), "Błąd polecenia!", • JOptionPane.ERROR_MESSAGE); • }

  32. Dodawanie rekordów • Dodania rekordu możemy dokonać wyłącznie, jeśli parametr resultSetConcurency jest ustawiony na ResultSet.CONCUR_UPDATABLE. • Procedura dodania rekordu: • Przejście do specjalnego rekordu „wstawiania” za pomocą metody moveToInsertRow() • Ustawienie wartości poszczególnych pól z pomocą metody update z przyrostkiem wskazującym typ wprowadzanych danych i parametrami indeks lub nazwa pola oraz wartość • updateString(StringnazwaKolumny, Stringwartość) • updateFloat(int indeks, Floatwartość)

  33. Dodawanie rekordów c.d. • Procedura dodania rekordu c. d.: • dodanie rekordu do ResultSet oraz bazy danych za pomocą metody insertRow() • Przejście do bieżącego rekordu (czyt. rekordu w którym byliśmy przed przejściem do rekordu wstawiania) za pomocą metody moveToCurrentRow()

  34. Dodawanie rekordów - przykład • rezultat.moveToInsertRow(); • rezultat.updateString("symbol_towaru",jtfSymbol.getText()); • rezultat.updateString("nazwa_towaru",jtfNazwa.getText()); • rezultat.updateString("opis_towaru",jtfOpis.getText()); • rezultat.updateFloat("cena_towaru", Float.parseFloat(jtfCena.getText())); • rezultat.insertRow(); • rezultat.moveToCurrentRow(); • nowyRekord = false;

  35. Usuwanie rekordów • Usunięcia rekordu możemy dokonać wyłącznie, jeśli parametr resultSetConcurency jest ustawiony na ResultSet.CONCUR_UPDATABLE. • Procedura usunięcia rekordu: • Wywołanie metody deleteRow() usuwającej rekord • Przejście do rekordu poprzedniego

  36. Usuwanie rekordów - przykład • try • { • rezultat.deleteRow(); • rezultat.previous(); • wyswietlDane(); • } • catch(Exception e) • { • JFrame ramka = new JFrame(); • JOptionPane.showMessageDialog(ramka, "Błąd dla przycisku • \"Usuń\": " + e.getMessage(), "Błąd polecenia!", • JOptionPane.ERROR_MESSAGE); • }

  37. Aktualizowanie rekordów • Aktualizacja rekordu jest możliwa wyłącznie, jeśli parametr resultSetConcurency jest ustawiony na ResultSet.CONCUR_UPDATABLE. • Procedura aktualizacji rekordu: • Ustawienie wartości poszczególnych pól z pomocą metody update z przyrostkiem wskazującym typ wprowadzanych danych i parametrami indeks lub nazwa pola oraz wartość • updateString(StringnazwaKolumny, Stringwartość) • updateFloat(int indeks, Floatwartość) • Wywołanie metody updateRow()

  38. Aktualizowanie rekordów - przykład • if(rezultat.getString("symbol_towaru") != jtfSymbol.getText()) rezultat.updateString("symbol_towaru",jtfSymbol.getText()); • if(rezultat.getString("nazwa_towaru") != jtfNazwa.getText()) • rezultat.updateString("nazwa_towaru", jtfNazwa.getText()); • if(rezultat.getString("nazwa_towaru") != jtfNazwa.getText()) • rezultat.updateString("opis_towaru", jtfOpis.getText()); • if(rezultat.getString("cena_towaru") != jtfCena.getText()) rezultat.updateFloat("cena_towaru", Float.parseFloat(jtfCena.getText())); • rezultat.updateRow();

  39. Bazy danych Transakcje

  40. Koncepcja • Transakcja składa się z jednego lub więcej poleceń, które zostały wywołane, wykonane i potwierdzone (Commit) lub odrzucone (RollBack). • Transakcja stanowi więc jednostkową operację. Zarządzanie transakcją jest szczególnie ważne gdy chcemy wykonać naraz kilka operacji traktując je od strony logicznej jako jedną.

  41. Procedura • ustawienie pracy w stanie bez potwierdzania za pomocą • połączenie.setAutoCommit(false), gdzie wartość domyślna ustawiona jest na automatyczne potwierdzanie, • wykonanie wyrażeń SQL • potwierdzenie wykonania operacji za pomocą połączenie.commit() , które powoduje, że zmiany spowodowane wyrażeniem SQL stają się stałe. • w przypadku błędu można wysłać polecenie przerwania połączenie.rollback() powodujące odtworzenie stanu przed wykonaniem wyrażenia.

  42. Przykład • Connection poloczenie1 = DriverManager.getConnection("jdbc:mysql://localhost/firmatest?user=root&password=p@ssw0rd"); • System.out.println("Tworzenie obiektu połączenia"); • Statement polecenie = poloczenie.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); • poloczenie.setAutoCommit(false);

  43. Przykład c.d. • polecenie.executeUpdate("insert into miasto values('Tczew','Tczew','Tczewski','Pomorskie')"); • PreparedStatement poleceniePS = poloczenie.prepareStatement( • "insert into miasto values(?,?,?,?)"); poleceniePS.setString(2,"Poznań"); • poleceniePS.setString(5,"Wielkopolskie"); • poleceniePS.executeUpdate(); • poloczenie.commit(); • catch(SQLException e) • { • poloczenie.rollback(); • }

More Related