Kampania, która generuje 100 tysięcy leadów w 2 tygodnie - Marcin Michalski
Metody dostępu do danychicis.pcz.pl/~michalski/download/mddd/2019/MDDD03.pdf · Zapytanie...
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);