Laboratorium nr 11 - JDBC


Teoria

Podstawowe interfejsy/klasy

Błędy

Błędy krytyczne dziedziczą z java.sql.SQLException (metoda getNextException() daje dostęp do wszystkich błędów). Błędy niekrytyczne dziedziczą po java.sql.SQLWarning (podklasa java.sql.SQLException), ale nie są wyrzucane tylko dodawane do listy obiektu (np. ResultSet). Można się do nich dostać przez getWarnings(). Na przykład java.sql.DataTruncation przy odczycie występuje jako warning, a przy pisaniu jako exception.

Podstawowe operacje

Podstawowe operacje wykonujemy przy pomocy java.sql.Statement i jednej z metod:

Dostęp do wyników zapytania

Wyniki zapytania lądują w obiekcie typu ResultSet. Należy o nim myśleć jak o kursorze. Dla każdego Statement powinien być otwarty co najwyżej jeden kursor. Podstawowe metody to:

Jeżeli skorzystamy z przeciążonej wersji createStatement() możemy sprawić, iż po otrzymywanych ResultSet można się poruszać również wstecz. Wersja bezparametrowa odpowiada wywołaniu createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY). Pozostałe dozwolone wartości dla pierwszego parametru: ResultSet.TYPE_SCROLL_SENSITIVE i ResultSet.TYPE_SCROLL_INSENSITIVE umożliwiają poruszanie się wstecz (różnica między nimi i trzeci parametr są opisane dalej). Przeciążone wersje posiadają również metody prepareStatement() i prepareCall().

Kilka przydatnych metod ResultSet to: previous(), absolute(), relative(), getRow(), afterLast(), beforeFirst(), first(), last(), isFirst(), isLast(), isBeforeFirst(), isAfterLast().

Transakcje

Domyślnie jest autocommit. Jest to własność sesji z bazą danych (Connection). Zmieniamy przy pomocy setAutoCommit(). Ręczna obsługa poprzez: commit() i rollback().

Można używać punkty nawrotu setSavePoint() i releaseSavePoint() i posługiwać się przeciążoną wersje commit() i rollback().

Zamykanie

Connection, Statement i ResultSet mają close(). Od implementacji JDBC zależy, czy trzeba ją stosować. Zamknięcie Connection powinno zamknąć Statement i analogicznie zamknięcie Statement powinno zamknąć ResultSet.

Optymalizacja

Modyfikacja danych

  • Widoczność zmian poprzez ResultSet zależy od poziomu izolacji oraz parametrów podanych metodom createStatement(), prepareStatement(), czy prepareCall().

    Tablice

    JDBC umożliwia obsługę tablic sql dzięki interfejsowi java.sql.Array. Obiekty implementujące ten interfejs dostajemy przez metodzię getArray() z klasy ResultSet. Z metod zapewnionych przez interfejs warte wspomnienia są:

    Niestety nie ma sposobu na skonstruowanie obiektu implementującego Array w sposób niezależnego od drivera, aby wykorzystać go w setArray().


    JDBC zapewnia również obsługę typów Bloby i Cloby.

    Mapowanie typów

    Poza domyślnym mapowaniem typów można przy pomocy java.util.Map wprowadzić swoje własne. Kluczami mapy są napisy zawierające nazwy typów jdbc, a wartościami odpowiadające im obiekty java.lang.Class. Własne mapowanie może mieć zasięg całej sesji - metoda setTypeMap() obiektu Connection lub pojedyńczego wywołania metody getXXX(), np. getObject(1, mojeMapowanie).

    Każda klasa pojawiająca się w takiej mapie typów musi implementować interfejs java.sql.SQLData.

    Meta dane

    Dostęp do informacji o informacjach jest przez obiekty implementujące: Informacje o driverze możemy uzyskać dzięki klasie DriverPropertyClass.

    Przykłady

    Przed kompilacją przykładów należy zmienić stałe USERNAME i PASSWORD w klasie Common.java!

    Ćwiczenia

    API