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

Post on 27-Jul-2020

0 views 0 download

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

Metody dostępu do danych

MODUŁ 03

DR INŻ. GRZEGORZ MICHALSKI

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.

• 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

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

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

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.

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.

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

}

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.

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.

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.

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

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

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.

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

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

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

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, ?)}");

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