Dostosowanie ResultSet
Nowoczesne API JDBC pozwala na znaczne dostosowywanie obiektów.OświadczenieIzestaw wyników. Na przykład za pomocązestaw wynikówmożesz zmieniać wiersze w bazie danych.
Tworząc obiekt wypowiedzi, możemy przekazać do niego kilka naszych życzeń. Życzenia te można podzielić na trzy grupy:
- Podstawowy typ połączenia
- Jednoczesna kontrola dostępu
- Trwałość i transakcje
Te parametry można przekazać podczas tworzenia obiektuOświadczenieLubPrzygotowane oświadczenie. Przykład:
Statement statement = connection.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.CLOSE_CURSORS_OVER_COMMIT );
PreparedStatement statement = connection.prepareStatement(sql,
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.CLOSE_CURSORS_OVER_COMMIT);
Nie będziemy dogłębnie badać tych rzeczy, ale chcę, żebyś wiedział, że jest to możliwe, jeśli natkniesz się na coś podobnego w czyimś kodzie.
Typy zestawów wyników
ResultSet może być określonego typu. Typ definiuje niektóre cechy i możliwości ResultSet.
Nie wszystkie typy są obsługiwane przez wszystkie bazy danych i sterowniki JDBC. Będziesz musiał sprawdzić swoją bazę danych i sterownik JDBC, aby zobaczyć, czy obsługuje typ, którego chcesz użyć. Metoda DatabaseMetaData.supportsResultSetType(int type) zwraca wartość true lub false w zależności od tego, czy dany typ jest obsługiwany, czy nie.
W chwili pisania tego tekstu istnieją trzy typy ResultSet:
- Zestaw wyników.TYPE_FORWARD_ONLY
- Zestaw wyników.TYPE_SCROLL_INSENSITIVE
- Zestaw wyników.TYPE_SCROLL_SENSITIVE
Typ domyślny to TYPE_FORWARD_ONLY.
TYPE_FORWARD_ONLY oznacza, że ResultSet można przesuwać tylko do przodu. Oznacza to, że możesz poruszać się tylko z wiersza 1, wiersza 2, wiersza 3 itd. W ResultSet nie możesz się cofnąć: nie możesz czytać danych z dziewiątego wiersza po przeczytaniu dziesiątego.
TYPE_SCROLL_INSENSITIVE oznacza, że ResultSet można przesuwać (przewijać) do przodu lub do tyłu. Możesz także przejść do pozycji względem bieżącej pozycji lub przejść do pozycji bezwzględnej.
ResultSet tego typu jest niewrażliwy na zmiany w źródłowym źródle danych, gdy ResultSet jest otwarty. Oznacza to, że jeśli wpis w ResultSet zostanie zmieniony w bazie danych przez inny wątek lub proces, nie zostanie to odzwierciedlone w już otwartymzestaw wynikówtego typu.
TYPE_SCROLL_SENSITIVE oznacza, że ResultSet można przesuwać (przewijać) do przodu lub do tyłu. Możesz także przejść do pozycji względem bieżącej pozycji lub przejść do pozycji bezwzględnej.
ResultSet tego typu jest wrażliwy na zmiany w źródłowym źródle danych, gdy ResultSet jest otwarty. Oznacza to, że jeśli wpis w ResultSet zostanie zmieniony w bazie danych przez inny wątek lub proces, zostanie to odzwierciedlone w już otwartymzestaw wynikówtego typu.
Konkurencja
Współbieżność ResultSet określa, czy ResultSet można aktualizować, czy tylko odczytywać.
Niektóre bazy danych i sterowniki JDBC obsługują aktualizowanie zestawu wyników, ale nie wszystkie. Metoda DatabaseMetaData.supportsResultSetConcurrency(int concurrency) zwraca wartość true lub false w zależności od tego, czy dany tryb współbieżności jest obsługiwany, czy nie.
ResultSet może mieć jeden z dwóch poziomów współbieżności:
- Zestaw wyników.CONCUR_READ_ONLY
- Zestaw wyników.CONCUR_UPDATABLE
CONCUR_READ_ONLY oznacza, że ResultSet można tylko odczytać.
CONCUR_UPDATABLE oznacza, że ResultSet można czytać i modyfikować.
Przykład zmiany danych w bazie danych
Za pomocą tych parametrów możesz kontrolować wygenerowaną instrukcję i jej ResultSet.
Na przykład możesz utworzyć aktualizowalny ResultSet i użyć go do zmiany bazy danych. Podczas tworzenia Wyciągu należy przestrzegać następujących warunków:
- określona jest tylko jedna tabela
- nie zawiera klauzul join ani group by
- kolumny zapytania muszą zawierać klucz podstawowy
Gdy powyższe warunki są spełnione, zaktualizowany ResultSet może służyć do aktualizacji tabeli w bazie danych. Podczas tworzenia obiektu Statement należy określić następujące parametry:
Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)
Wynikiem wykonania takiej instrukcji jest aktualizowalny zestaw wyników. Metoda update polega na przesunięciu kursora ResultSet do wiersza, który chcesz zaktualizować, a następnie wywołaniu metody updateXXX() .
Metoda updateXXX działa podobnie do metody getXXX() . Metoda updateXXX() ma dwa parametry. Pierwszy to numer aktualizowanej kolumny, który może być nazwą kolumny lub numerem seryjnym. Drugi to dane, które należy zaktualizować, a ten typ danych musi być taki sam jak XXX.
Aby faktycznie zaktualizować wiersz w bazie danych, należy wywołać metodę updateRow() zanim kursor ResultSet opuści zmieniony wiersz, w przeciwnym razie zmiany nie zostaną wprowadzone do bazy danych.
Możesz także dodać nowe wiersze do tabeli:
Najpierw musisz przesunąć kursor do pustej linii. W tym celu wywołaj metodę moveToInsertRow() .
Następnie musisz wypełnić ten wiersz danymi za pomocą metody updateXXX() .
Następnie należy wywołać metodę inserterRow() w celu dodania wiersza do bazy.
Na koniec musisz cofnąć kursor, wywołując metodę moveToCurrentRow() .
Ważny! Nie wszystkie DBMS obsługują te opcje rozszerzonej instrukcji. W razie problemów zajrzyj do oficjalnej dokumentacji konkretnego DBMS.
GO TO FULL VERSION