metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/mddd03.pdf · zapytanie...
TRANSCRIPT
![Page 1: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/1.jpg)
Metody dostępu do danych
MODUŁ 03
DR INŻ. GRZEGORZ MICHALSKI
![Page 2: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/2.jpg)
Statement – parametry tworzenia obiektu.
Dostępne są trzy metody tworzenia obiektu Statement:
• Statement createStatement()
• Statement createStatement(int resultSetType, int resultSetConcurrency)
• Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
, gdzie:
• resultSetType – określenie sposobu operowania na wyniku,
• resultSetConcurrency – określenie typu modyfikacji danych,
• resultSetHoldability – określenie powiązania kursora z transakcjami.
![Page 3: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/3.jpg)
• ResultSet.TYPE_FORWARD_ONLY przesuwanie się po kursorze jedynie do przodu,
• ResultSet.TYPE_SCROLL_INSENSITIVE przesuwanie się w obie strony, ale kursor jest niewrażliwy
na zmiany dokonywane przez innych użytkowników bazy
• ResultSet.TYPE_SCROLL_SENSITIVE kursor dwukierunkowy, który zachowuje powiązanie z bazą
danych
Domyślna wartością parametru resultSetType jest TYPE_FORWARD_ONLY.
Parametr resultSetType
![Page 4: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/4.jpg)
Wartość parametru resultSetConcurrency określa sposób zarządzania danymi odczytanymi z bazy. Parametr
może przyjmować wartości:
• ResultSet.CONCUR_READ_ONLY - kursor pozwala jedynie na odczyt wartości z bazy danych
• ResultSet.CONCUR_UPDATABLE - zbiór danych pozwala na wykonywanie zmian danych oraz
wprowadzanie nowych danych do bazy.
Domyślną wartością parametru resultSetConcurrency jest CONCUR_READ_ONLY.
Parametr resultSetConcurrency
![Page 5: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/5.jpg)
Wartość parametru resultSetHoldability określa powiązanie obiektu odczytanego zbioru danych z
transakcjami rozpoczętymi na obiekcie Statement. Parametr może przyjmować wartości:
• ResultSet.HOLD_CURSORS_OVER_COMMIT - użycie tego znacznika tworzy obiekt niezależny
transakcyjnie w stosunku do obiektu Statement.
• ResultSet.CLOSE_CURSORS_AT_COMMIT - obiekt ResultSet powinien być zamknięty przed
zakończeniem transakcji na obiekcie Statement.
Parametr resultSetHoldability
![Page 6: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/6.jpg)
Transakcje
Do rozpoczęcia transakcji służy metoda:
void setAutoCommit(boolean autoCommit);
obiektu klasy Connection.
Domyślnie wartość autoCommit jest ustawiona naprawdę co powoduje, że każde zapytanie jest
wykonywane jako niezależna transakcja.
Zmiana parametru autoCommit (setAutoCommit(false)) powoduje rozpoczęcie nowej transakcji, która
może być zakończona jedną z operacji:
• commit,
• rollback.
![Page 7: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/7.jpg)
Metody zakończenia transakcji.
Do poprawnego zakończenia transakcji służy metoda:
• void commit();
Do wycofania wykonanych zmian na bazie danych służy metoda:
• void rollback();
Wykonanie którejkolwiek metody powoduje zakończenie transakcji i rozpoczęcie nowej. Nazwy metod są
tożsame ze znaczeniem znanym z języka SQL.
![Page 8: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/8.jpg)
Transakcje - przykład
try {
// rozpoczęcie bloku transakcji, włączenie konieczności ręcznego zatwierdzenia transakcji
connection.setAutoCommit(false);
// zapytania sql w ramach transakcji
// zakończenie poprawne transakcji
connection.commit();
} catch (SQLException e) {
// wycofanie zmian
connection.rollback();
} finally {
// zakończenie bloku transakcji
connection.setAutoCommit(true);
}
![Page 9: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/9.jpg)
Zapytanie parametryzowane – PreparedStatemet
Obiekt PreparedStatement służy do przygotowania zapytania i wstępnej kompilacji co przyspiesza
wykonywanie tego zapytania. Obiekt służy zarówno do wykonywania zapytań zmieniających,
wprowadzających, jaki i zapytań wybierających dane z bazy danych.
Utworzenie obiektu klasy PreparedStatement odbywa się przez wywołanie metody klasy połączenia
(Connection):
PreparedStatement prepareStatement(String sql);
Proszę zwrócić uwagę na nazwę metody tworzącej zapytanie parametryzowane. Nie jest ona
tożsama z nazwą zwracanego typu i nie jest to błąd edytorski.
![Page 10: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/10.jpg)
Przygotowanie zapytania - PreparedStatement
• W momencie tworzenia obiektu, w klasie Connection, przekazane zapytanie jest wstępnie
przetwarzanie w celu jego optymalizacji.
• W przygotowywanym zapytaniu można zawrzeć parametry, które w kolejnych wykonaniach
zapytania będą odpowiednio przypisywane.
• W zapytaniu parametr oznaczany jest poprzez znak ?
• Kolejne parametry numerowane są wartościami całkowitymi począwszy od wartości 1.
![Page 11: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/11.jpg)
Przypisywanie wartości parametrom
• Do przypisania wartości dla konkretnych parametrów służą odpowiednie metody set przeznaczone dla
konkretnych typów m.in. : setBlob, setByte, setDate, setDouble, setShort, setString, setTime, setTimestamp
• Każda z tych metod przyjmuje dwa parametry, przykładowo:
void setString(int parameterIndex, String x)
, gdzie parameterIndex oznacza numer parametru (poczynając od wartości 1), natomiast drugi parametr określa
wartość która ma zostać przypisana do parametru. Typ drugiego parametru jest ściśle powiązany z nazwą danej
metody.
![Page 12: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/12.jpg)
Wykonanie zapytania
Do wykonania zapytań są przeznaczone trzy metody:
• wykonanie dowolnego rodzaju zapytań,
boolean execute();
• wykonanie zapytań wybierających,
ResultSet executeQuery();
• wykonanie zapytań zmieniających dane.
int executeUpdate();
Zasada działania powyższych funkcji jest tożsama z odpowiednimi funkcjami służącymi do wywoływania
zapytań nie parametryzowanych (Statement).
![Page 13: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/13.jpg)
Przykład zastosowania PreparedStatement
PreparedStatement pdst = connection.prepareStatement("insert into people values (?, ?)");
// Ustawienie wartości prarametrów zapytania oraz jego wywołanie
pdst.setString(1, "Gandhi");
pdst.setString(2, "politics");
pdst.executeUpdate();
// Zmiana wartości parametrów zapytania oraz jego ponowne wywołanie
pdst.setString(1, "Turing");
pdst.setString(2, "computers");
pdst.executeUpdate();
pdst.close();
![Page 14: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/14.jpg)
Klasa CallableStatement
Klasa CallableStatement jest rozszerzeniem klasy PreparedStatement. Klasa służy do wykonywania
procedur bazodanowych. Pozwala na wykonanie procedur typu:
• {? = call <procedure-name>[(<arg1>,<arg2>, ...)]}
• {call <procedure-name>[(<arg1>,<arg2>, …)]}
Parametry typu out muszą zostać zarejestrowane przed wykonaniem procedury.
![Page 15: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/15.jpg)
W obiekcie CallableStatement zostały zaimplementowane metody pozwalające zapisać wartości
poszczególnych parametrów. Metody te są zgodne z metodami zaimplementowanymi w klasie
PreparedStatement m.in. :
• setBlob,
• setByte,
• setDate,
• setDouble,
• setString,
• setTime,
• setTimestamp.
Przypisanie wartości musi nastąpić dla każdego parametru wprowadzonego w zapytaniu.
Ustawienia wartości parametrów CallableStatement
![Page 16: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/16.jpg)
Aby umożliwić odczyt wartości z parametru typu OUT lub INOUT należy zarejestrować taki parametr w
obiekcie CallableStatement. Odpowiedzialna za to jest metoda:
void registerOutParameter(int index, int sqlType, int scale)
sqlType – java.sql.Types.*
Parametry typu INOUT powinny uzyskać wartość przez wykonaniem procedury. Do zapisu wartości służą
odpowiednie dla typy metody, m.in..:
void setString(int index, String x)
Rejestracja parametrów wyjściowych
![Page 17: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/17.jpg)
CallableStatement – Przykład 1
CallableStatement cstmt = connection.prepareCall("{call updatePrices(?, ?)}");
cstmt.setString(1, "Colombian");
cstmt.setFloat(2, 8.49f);
cstmt.executeQuery();
cstmt.setString(1, "Colombian_Decaf");
cstmt.setFloat(2, 9.49f);
cstmt.executeQuery();
![Page 18: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/18.jpg)
CallableStatement – Przykład 2
CallableStatement cstmt = connection.prepareCall("{call getTestData(?, ?)}");
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);
ResultSet rs = cstmt.executeQuery();
byte x = cstmt.getByte(1);
java.math.BigDecimal n = cstmt.getBigDecimal(2);
CallableStatement cstmt = connection.prepareCall("{call getTestData(25, ?)}");
![Page 19: Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie parametryzowane –PreparedStatemet Obiekt PreparedStatement służydo przygotowania zapytania](https://reader035.vdocuments.site/reader035/viewer/2022080719/5f78ea83d170fc2b7d578d5f/html5/thumbnails/19.jpg)
CallableStatement – Przykład 3
CallableStatement cstmt = connection.prepareCall("{call reviseTotal(?)}");
cstmt.setByte(1, (byte)25);
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.executeUpdate();
byte x = cstmt.getByte(1);