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);