Moduł 02

Transkrypt

Moduł 02
Metody dostępu
do danych
dr inż. Grzegorz Michalski
Na podstawie wykładów dra inż. Juliusza Mikody
Statement - parametry
Statement createStatement()
TYPE_FORWARD_ONLY, CONCUR_READ_ONLY.
Statement createStatement(int
resultSetType,int resultSetConcurrency)
Statement createStatement(int
resultSetType, int resultSetConcurrency,
int resultSetHoldability)
resultSetType – sposób operowania na wyniku
resultSetConcurrency – typ modyfikacji danych
resultSetHoldability – powiązanie kursora z
transakcjami
Statement
Parametr resultSetType może przyjmować wartości:
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
Statement
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.
Statement
Wartości parametru resultSetHoldability określają
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.
Transakcje - Connection
Do rozpoczęcia transakcji służy metoda:
void setAutoCommit(boolean autoCommit)
obiektu klasy .
Domyślnie wartość autoCommit jest ustawiona na prawdę
co powoduje, że każde zapytanie jest wykonywane jako
niezależna transakcja.
Zmiana parametru (setAutoCommit(false) )
powoduje rozpoczęcie nowej transakcji, która może być
zakończona jedną z metod: commit lub rollback.
Transakcje - Connection
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.
Transakcje - przykład
try {
// rozpocz cie bloku transakcji
connection.setAutoCommit(false);
// **** zapytania sql
// zako czenie poprawne transakcji
connection.commit();
} catch (SQLException e) {
// wycofanie zmian
connection.rollback();
} finally {
// zako czenie bloku transakcji
connection.setAutoCommit(true);
}
PreparedStatement
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 połączenia (Connection):
PreparedStatement
prepareStatement(String sql)
Przygotowanie zapytania
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
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:
void setString(int parameterIndex,
String x)
Numer parametru (poczynając od wartości 1) oraz wartość
parametru, który ma zostać przypisany.
Wykonanie zapytania
Do wykonania zapytań są przeznaczone trzy metody:
boolean execute()
wykonanie dowolnego rodzaju zapytań,
ResultSet executeQuery()
wykonanie zapytań wybierających,
int executeUpdate()
wykonanie zapytań zmieniających dane.
Przykład zapytania
PreparedStatement pdst =
connection.prepareStatement(
"insert into people values (?, ?)");
pdst.setString(1, "Gandhi");
pdst.setString(2, "politics");
pdst.executeUpdate();
pdst.setString(1, "Turing");
pdst.setString(2, "computers");
pdst.executeUpdate();
pdst.close();
CallableStatement
Klasa CallableStatement jest rozszerzeniem klasy
PreparedStatement.
Klasa służy do wykonywania procedur bazodanowych
Klasa pozwala na wykonanie procedur typu:
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
{call <procedure-name>[(<arg1>,<arg2>, …)]}
Parametry typu out muszą zostać zarejestrowane przed wykonaniem
procedury.
Zapis wartości
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.i. : setBlob, setByte,
setDate, setDouble, setShort, setString,
setTime, setTimestamp
Przypisanie wartości musi nastąpić dla każdego parametru
wprowadzonego w zapytaniu.
Rejestracja parametrów OUT
Aby umożliwić odczyt wartości z parametru typu OUT lub INOUT
należy zarejestrować taki parametr w obiekcie
CallableStatement.
Służy do tego 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żą metody:
void setString(int index, String x), itd..
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();
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, ?)}");
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);

Podobne dokumenty