Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie...

19
Metody dostępu do danych MODUŁ 03 DR INŻ. GRZEGORZ MICHALSKI

Transcript of Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie...

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

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

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

• 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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