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.