Title: Programowanie sieciowe w Javie
1Programowanie sieciowe w Javie
- Michal Kuciapski
- m.kuciapski_at_univ.gda.pl
2Bazy danych
3Bazy danych
4JDBC
- JDBC (Java Database Connectivity) jest
interfejsem(sterownikiem) niskiego poziomu jezyka
Java przeznaczony do bezposredniego wykonywania
polecen SQL (Structured Query Language). - JDBC jest odpowiedzialny za
- tworzenie polaczenia z baza danych
- wyslanie polecenia (polecen) SQL
- przetwarzanie otrzymanych wyników
5ODBC
- ODBC (Open DataBase Connectivity) jest
interfejsem Microsoftu umozliwiajacym równiez
korzystanie z baz danych, co wiaze sie jednak z
szeregiem nieodgodnosci specyficznosc i
ograniczenie metod programowania, koniecznosc
recznego konfigurowania parametrów polaczenia na
kazdej platformie. - Dla ulatwienia programowania dostepu do baz z
polaczeniami ODBC utworzony zostal most JDBC-ODBC
automatycznie
6DBMS
- DBMS (DataBase Management System) jest systemem
zarzadzania bazami danych, którego rola jest
tworzenie struktury bazy, wypelnianie bazy
danych, usuwanie, aktualizacja rekordów,
nadawanie praw dostepu, itp. - DBMS najczesciej instalowany jest najczesciej
wraz z instalacja sterowników.
7Bazy danych
8Sterowniki
- Sterowniki, sa pakietami zawierajacymi
implementacje deklarowanych klas, atrybutów i
metod zwiazanych z obsluga dostepu i zarzadzania
baza danych odnosnie - inicjowania i zamykania polaczen
- wykonywania zapytan (interfejs Statement)
- zwracania i przetwarzania wyników zapytan
(interfejs ResultSet) - Sterowniki musza wystepowac po stronie
dokonujacej polaczenie z baza danych a w
przypadku appletów sterownik musi byc
zainstalowany na serwerze WWW tam, skad pochodzi
applet.
9Sterowniki
- Dla polaczenia z baza danych konieczne jest
zainstalowanie odpowiedniego dla niej sterownika.
Dokonuje sie tego poprzez - program instalacyjny
- rejestracje klasy lub pakietu
- Klase 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")
10Koncepcja
- Utworzenie polaczenia z baza danych polega
utworzeniu odpowiedniego obiektu klasy
Connection. W tym celu stosuje sie jedna z
przeciazonych statycznych metod getConnection
klasy DriverManager. - Kazda metoda getConnection zawiera jako argument
adres URL dostepu do bazy - jdbcsterowniklokaliz
acja
11Koncepcja c.d.
- jdbcsterowniklokalizacja, gdzie
- jdbc element staly okresla nazwe protokolu
- sterownik okresla nazwe sterownika lub
mechanizmu polaczenia, np. odbc, mysql - lokalizacja opis lokalizacji bazy danych w
postaci //hostport/sciezka - Przyklady
- jdbcodbcbaza_testowa
- jdbcmysql//bsvc.univ.gda.pl4000/baza_testowa
12Tworzenie polaczenia
- Polaczenie dokonywane jest za pomoca metody
statycznej getConnection() klasy DriverManager - Connection getConnection(String url)
- Connection getConnection(String url, String info)
- Connection getConnection(String url, String
uzytkownik, String haslo) - Aby móc skorzystac ze statycznej metody
getConnection() nalezy zaimportowac klasy pakietu
java.sql.. Ponadto wymaga ona obsluzenia bledu
SQLException.
13Przyklad
- import java.sql.
- public class BazaPoloczenie
- public static void main(String args)
- try
- Class.forName("com.mysql.jdbc.Driver")
- System.out.println("Polaczenie za pomoca
wylacznie url") - Connection poloczenie1 DriverManager.getConn
ection("jdbcmysql//localhost/firmatest?userroot
passwordp_at_ssw0rd") - System.out.println("Polaczenie za pomoca
url, loginu i hasla") - Connection poloczenie2 DriverManager.getConn
ection("jdbcmysql//localhost/firmatest","root","
p_at_ssw0rd") -
14Przyklad c.d.
-
- catch(ClassNotFoundException e)
-
- System.out.println("Brak klasy "
e.getMessage()) -
- catch(SQLException e)
-
- System.out.println("Blad polaczenia
" e.getMessage()) -
-
15Bazy danych
- Tworzenie obiektów polecen
16Wykorzystywane interfejsy
- W celu wyslania polecenia SQL nalezy stworzyc
jeden z typów obiektów - Statement stanowi kontener dla wykonywanych
polecen SQL i umozliwia wysylanie polecen SQL nie
zawierajacych parametrów - PreparedStatement uzywany jest do wykonywania
przygotowanych polecen SQL, zawierajacych jedno
lub wiecej pól parametrów, oznaczanych znakiem
"?" - CallableStatement jest wykorzystywany do
tworzenia odwolan do przechowywanych w bazie
danych procedur
17Tworzenie interfejsów
- W celu utworzenia obiektu dla wykonywania polecen
nalezy wywolac w zaleznosci od typu tworzonego
obiektu jedna 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
18Definiowanie typów wywolywania polecen
- Metoda createStatement posiada 3 przeciazenia
- Statement createStatement() tworzy obiekt klasy
Statement dla przesylania zapytan SQL do bazy - Statement createStatement(int resultSetType, int
resultSetConcurrency) tworzy obiekt klasy
Statement, dla którego generowane wyniki
zapytan beda miec odpowiedni format oraz
modyfikowalnosc - Statement createStatement(int resultSetType, int
resultSetConcurrency, int resultSetHoldability)
tworzy obiekt klasy Statement, dla którego
generowane wyniki zapytan beda miec odpowiedni
format, modyfikowalnosc oraz zachowania kursora
19Wartosci parametrów tworzenia obiektów polecen
- Dla resultSetType
- ResultSet.TYPE_FORWARD_ONLY - kursor moze
poruszac sie wylacznie do przodu - ResultSet.TYPE_SCROLL_INSENSITIVE - kursor moze
sie swobodnie poruszac i nie jest wrazliwy na
zmiany dokonywane przez inne kursory - ResultSet.TYPE_SCROLL_SENSITIVE - kursor moze sie
swobodnie poruszac i jest wrazliwy na zmiany
dokonywane przez inne kursory
20Wartosci parametrów tworzenia obiektów polecen
c.d.
- Dla resultSetConcurrency
- ResultSet.CONCUR_READ_ONLY zwrócone wartosci
pól rekordów moga byc wylacznie odczytywane - ResultSet.CONCUR_UPDATABLE -zwrócone wartosci pól
rekordów moga byc zmieniane i aktualizowane dla
bazy - Dla resultSetHoldability
- ResultSet.HOLD_CURSORS_OVER_COMMIT obiekt klasy
ResultSet reprezentujacy zwrócone dane w wyniku
zapytania po wykonaniu metody Connection.commit
nie ma zostac zamkniety - ResultSet.CLOSE_CURSORS_AT_COMMIT - obiekt
klasy ResultSet reprezentujacy zwrócone dane w
wyniku zapytania po wykonaniu metody
Connection.commit ma zostac zamkniety
21Przyklad
- import java.sql.
- public class BazaPoloczenie
- public static void main(String args)
- try
- Class.forName("com.mysql.jdbc.Driver")
- System.out.println("Polaczenie za pomoca
wylacznie url") - Connection poloczenie1 DriverManager.getConn
ection("jdbcmysql//localhost/firmatest?userroot
passwordp_at_ssw0rd") - System.out.println("Tworzenie obiektu
polaczenia") - Statement polecenie poloczenie.createStateme
nt(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CON
CUR_UPDATABLE)
22Metody wykonywania polecen
- Do podstawowych metod wykonywania polecen naleza
- executeQuery() umozliwia wywolywanie polecen
typu select i zwraca wynik zapytania jako obiekt
ResultSet - executeUpdate() - umozliwia wywolywanie polecen
typu insert , update , create , drop , alter i
zwraca liczbe zmienionych wierszy - execute() - przygotowana do obslugi polecen
zwracajacych wieksza ilosc zbiorów danych
(obiektów klasy ResultSet) - W przypadku obiektu PreparedStatement wyrazenie
SQL musi byc odpowiednio przygotowane obiekt
zawiera prekompilowane wyrazenie SQL. Wymaga to
podania wartosci parametrów za pomoca metod set.
23Przyklad
- 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,"Poznan")
- poleceniePS.setString(2,"Wielkopolskie
") - poleceniePS.executeUpdate()
24Bazy danych
- Rezultaty i ich przetwarzanie
25Koncepcja
- W wyniku zapytania typu executeQuery() jako wynik
zwracany jest obiekt klasy ResultSet zawierajacy
bedace wynikiem zapytania rekordy. - Mozliwe jest wykonywanie szeregu operacji na
obiekcie tej klasy - Przechodzenie kursorem pomiedzy rekordami i
pobieranie wartosci dla poszczególnych pól
rekordu - Dodawanie, usuwanie, aktualizowanie rekordów
zarówno dla ResultSet jak i bazy danych
wylacznie jesli polecenie dla, którego zostal
utworzony ResultSet bylo ustawione jako typ
ResultSet.CONCUR_UPDATABLE
26Metody nawigacji pomiedzy rekordami
- Metody sluzace przechodzeniu pomiedzy rekordami w
ramach zwróconego jako wynik zapytania obiektu
klasy ResultSet - previous() powoduje przejscie do rekordu
- poprzedniego
- next() powoduje przejscie do rekordu
nastepnego - first() powoduje przejscie do rekordu
pierwszego - last() powoduje przejscie do rekordu
ostatniego - absolute(int rekord) powoduje przejscie do
- wskazanego rekordu podanego jako
parametr metody
27Metody nawigacji pomiedzy rekordami c.d.
- W trakcie przechodzenia pomiedzy rekordami
metodami previous() i next() konieczne jest
sprawdzenie odpowiednio warunków - isFirst() zwraca czy biezacy rekord jest
pierwszym rekordem w ResultSet - isLast() - zwraca czy biezacy rekord jest
ostatnim rekordem w ResultSet
28Metody informacyjne dla rekordów i ResultSet
- Najwazniejsze metody sluzace pobieraniu
informacji o rekordach i obiekcie klasy
ResultSet - getRow() zwraca indeks biezacego rekordu
- refreshRow() powoduje odswiezenie wartosci
wiersza zgodnie z aktualna wartoscia w bazie
danych - getMetaData() zwraca metadane o definicji
rekordu - getType() pobiera informacje o typie ResultSet
- getStatement() pobiera tekst polecenia, które
spowodowalo utworzenie obiektu ResultSet - findColumn(String nazwa) umozliwia sprawdzenie
wystepowania okreslonej kolumny
29Pobieranie danych z ResultSet
- Dane z obiektu klasy ResultSet pobieramy za
pomoca metody get z przyrostkiem typu danych
podajac jako parametr badz indeks kolumny lub jej
nazwe - String getString(int indeksKolumny)
- Float getFloat(String nazwaKolumny)
- Przyklady
- jtxbImie.setText(rezultat. getString(2) )
- jtxbPensja.setText(rezultat.getFloat("pensja").toS
tring() )
30Przyklad
- Class.forName("com.mysql.jdbc.Driver")
-
- poloczenie DriverManager.getConnection("
jdbcmysql//localhost/firmatest?userrootpasswor
dp_at_ssw0rd") - zapytanie poloczenie.createStatement(Res
ultSet.TYPE_SCROLL_INSENSITIVE, -
ResultSet.CONCUR_UPDATABLE) - rezultat zapytanie.executeQuery("select
from towar") - rezultat.next()
- wyswietlDane()
31Przyklad c.d.
- try
-
- jtfSymbol.setText(rezultat.getString(
"symbol_towaru")) - jtfNazwa.setText(rezultat.getString("
nazwa_towaru")) - jtfOpis.setText(rezultat.getString("o
pis_towaru")) - jtfCena.setText(rezultat.getString("c
ena_towaru")) -
- catch(SQLException e)
-
- JFrame ramka new JFrame()
- JOptionPane.showMessageDialog(ramka,
"Blad wyswietlenia - danych " e.getMessage(),
"Blad polecenia!", - JOptionPane.ERROR_MESSAGE)
-
32Dodawanie rekordów
- Dodania rekordu mozemy dokonac wylacznie, jesli
parametr resultSetConcurency jest ustawiony na
ResultSet.CONCUR_UPDATABLE. - Procedura dodania rekordu
- Przejscie do specjalnego rekordu wstawiania za
pomoca metody moveToInsertRow() - Ustawienie wartosci poszczególnych pól z pomoca
metody update z przyrostkiem wskazujacym typ
wprowadzanych danych i parametrami indeks lub
nazwa pola oraz wartosc - updateString(String nazwaKolumny, String
wartosc) - updateFloat(int indeks, Float wartosc)
33Dodawanie rekordów c.d.
- Procedura dodania rekordu c. d.
- dodanie rekordu do ResultSet oraz bazy danych za
pomoca metody insertRow() - Przejscie do biezacego rekordu (czyt. rekordu w
którym bylismy przed przejsciem do rekordu
wstawiania) za pomoca metody moveToCurrentRow()
34Dodawanie rekordów - przyklad
- rezultat.moveToInsertRow()
- rezultat.updateString("symbol_towaru",jtfSymbol.ge
tText()) - rezultat.updateString("nazwa_towaru",jtfNazwa.getT
ext()) - rezultat.updateString("opis_towaru",jtfOpis.getTex
t()) - rezultat.updateFloat("cena_towaru",
Float.parseFloat(jtfCena.getText())) -
- rezultat.insertRow()
- rezultat.moveToCurrentRow()
- nowyRekord false
35Usuwanie rekordów
- Usuniecia rekordu mozemy dokonac wylacznie, jesli
parametr resultSetConcurency jest ustawiony na
ResultSet.CONCUR_UPDATABLE. - Procedura usuniecia rekordu
- Wywolanie metody deleteRow() usuwajacej rekord
- Przejscie do rekordu poprzedniego
36Usuwanie rekordów - przyklad
- try
-
- rezultat.deleteRow()
- rezultat.previous()
- wyswietlDane()
-
- catch(Exception e)
-
- JFrame ramka new JFrame()
- JOptionPane.showMessageDialog(ramka,
"Blad dla przycisku - \"Usun\" " e.getMessage(),
"Blad polecenia!", - JOptionPane.ERROR_MESSAGE)
-
37Aktualizowanie rekordów
- Aktualizacja rekordu jest mozliwa wylacznie,
jesli parametr resultSetConcurency jest
ustawiony na ResultSet.CONCUR_UPDATABLE. - Procedura aktualizacji rekordu
- Ustawienie wartosci poszczególnych pól z pomoca
metody update z przyrostkiem wskazujacym typ
wprowadzanych danych i parametrami indeks lub
nazwa pola oraz wartosc - updateString(String nazwaKolumny, String
wartosc) - updateFloat(int indeks, Float wartosc)
- Wywolanie metody updateRow()
38Aktualizowanie rekordów - przyklad
- if(rezultat.getString("symbol_towaru") !
jtfSymbol.getText())
rezultat.updateString("symbol_towaru",jtfSymbol.ge
tText()) -
- 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()
39Bazy danych
40Koncepcja
- Transakcja sklada sie z jednego lub wiecej
polecen, które zostaly wywolane, wykonane i
potwierdzone (Commit) lub odrzucone (RollBack). - Transakcja stanowi wiec jednostkowa operacje.
Zarzadzanie transakcja jest szczególnie wazne gdy
chcemy wykonac naraz kilka operacji traktujac je
od strony logicznej jako jedna.
41Procedura
- ustawienie pracy w stanie bez potwierdzania za
pomoca - polaczenie.setAutoCommit(false), gdzie
wartosc domyslna ustawiona jest na automatyczne
potwierdzanie, - wykonanie wyrazen SQL
- potwierdzenie wykonania operacji za pomoca
polaczenie.commit() , które powoduje, ze zmiany
spowodowane wyrazeniem SQL staja sie stale. - w przypadku bledu mozna wyslac polecenie
przerwania polaczenie.rollback() powodujace
odtworzenie stanu przed wykonaniem wyrazenia.
42Przyklad
- Connection poloczenie1 DriverManager.getConnecti
on("jdbcmysql//localhost/firmatest?userrootpas
swordp_at_ssw0rd") - System.out.println("Tworzenie obiektu
polaczenia") - Statement polecenie poloczenie.createStateme
nt(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CON
CUR_UPDATABLE) - poloczenie.setAutoCommit(false)
43Przyklad c.d.
- polecenie.executeUpdate("insert into miasto
values('Tczew','Tczew','Tczewski','Pomorskie')") -
- PreparedStatement poleceniePS
poloczenie.prepareStatement( - "insert into miasto
values(?,?,?,?)") poleceniePS.setString
(2,"Poznan") - poleceniePS.setString(5,"Wielkopolskie")
- poleceniePS.executeUpdate()
- poloczenie.commit()
- catch(SQLException e)
-
- poloczenie.rollback()