Ten samouczek wyjaśnia, jak używać JDBC ResultSet do pobierania danych. Dowiemy się również o interfejsach ResultSetMetaData i DatabaseMetaData z przykładami:
W JDBC DriverManager samouczek Seria samouczków JDBC Dowiedzieliśmy się, jak używać JDBC DriverManager i jego metod, JDBC PreparedStatement w aplikacjach Java.
W tym poradniku omówimy pozostałe interfejsy JDBC. W poprzednich poradnikach omówiliśmy interfejsy Statement, PreparedStatement i CallableStatement.
Tutaj dowiemy się o interfejsach JDBC ResultSet, ResultSetMetaData i DatabaseMetaData, ich metodach i sposobach ich wykorzystania w programie Java.
Interfejs zestawu wyników JDBC
Interfejs ResultSet jest obecny w pakiecie java.sql. Służy do przechowywania danych, które są zwracane z tabeli bazy danych po wykonaniu instrukcji SQL w programie Java. Obiekt ResultSet utrzymuje punkt kursora na danych wynikowych. Domyślnie kursor znajduje się przed pierwszym wierszem danych wynikowych.
Metoda next() służy do przesuwania kursora do następnej pozycji w kierunku do przodu. Zwróci FALSE, jeśli nie ma więcej rekordów. Pobiera dane poprzez wywołanie metody executeQuery() przy użyciu dowolnego obiektu statement. Może to być obiekt Statement, PreparedStatement lub CallableStatement. Interfejsy PreparedStatement i CallableStatement są podinterfejsami Statementinterfejs.
Interfejs oświadczenia
Statement statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery("Select * from EMPLOYEE_DETAILS");
Interfejs PreparedStatement
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS");
Możemy użyć metody getX(), aby uzyskać dane kolumn podczas iteracji przez wyniki, gdzie X - jest typem danych kolumny. Możemy użyć nazwy kolumny lub indeksu, aby uzyskać wartości za pomocą metod getX().
while(rs1.next()) { int empNum = rs1.getInt("empNum"); String lastName = rs1.getString("lastName"); String firstName = rs1.getString("firstName"); String email = rs1.getString("email"); String deptNum = rs1.getString("deptNum"); String salary = rs1.getString("salary"); System.out.println(empNum + "," +lastName+ "," +firstName+ "," +email +", "+deptNum +"," +salary); }
Możemy również podać numer indeksu kolumny zamiast nazwy kolumny w metodach getX ().
while(rs1.next()) { int empNum = rs1.getInt(1); String lastName = rs1.getString(2); String firstName = rs1.getString(3); String email = rs1.getString(4); String deptNum = rs1.getString(5); String salary = rs1.getString(6); System.out.println(empNum + "," +lastName+ "," +firstName+ "," +email +", "+deptNum +"," +salary); }
Typy ResultSet
Domyślnie możemy iterować dane / wartości w ResultSet, które zostały zwrócone jako wynik wykonanej instrukcji SQL w kierunku do przodu. Możemy iterować wartości w innych kierunkach za pomocą Scrollable ResultSet. Możemy określić typ i współbieżność ResultSet podczas tworzenia obiektów Statement, PreparedStatement i CallableStatement.
Istnieją 3 typy ResultSet, są to:
- TYPE_FORWARD_ONLY: Jest to opcja domyślna, w której kursor porusza się od początku do końca, tj. w kierunku do przodu.
- TYPE_SCROLL_INSENSITIVE: W tym typie kursor będzie poruszał się zarówno w kierunku do przodu, jak i do tyłu. Jeśli wprowadzimy jakiekolwiek zmiany w danych podczas iteracji przechowywanych danych, nie zostaną one zaktualizowane w zbiorze danych, jeśli ktokolwiek zmieni dane w DB. Ponieważ zbiór danych zawiera dane od momentu, gdy zapytanie SQL zwróci dane.
- TYPE_SCROLL_SENSITIVE: Jest to podobne do TYPE_SCROLL_INSENSITIVE, różnica polega na tym, że jeśli ktoś zaktualizuje dane po zwróceniu danych przez zapytanie SQL, podczas iteracji odzwierciedli zmiany w zestawie danych.
Współbieżność ResultSet
Istnieją 2 tryby współbieżności w ResultSet, są to:
- ResultSet.CONCUR_READ_ONLY: Jest to domyślny tryb współbieżności. Możemy tylko odczytywać dane w ResultSet. Aktualizacja nie ma zastosowania.
- ResultSet.CONCUR_UPDATABLE: Możemy zaktualizować dane w obiekcie ResultSet.
Niektóre bazy danych nie obsługują trybu współbieżności dla wszystkich typów ResultSet. W takim przypadku musimy sprawdzić, czy obsługują one nasz pożądany typ i tryb współbieżności za pomocą metody supportsResultSetConcurrency().
Metody w interfejsie ResultSet
Istnieją 4 kategorie metod ResultSet, są to:
- Metody nawigacji
- Metody Getter
- Metody ustawiające
- Różne metody
Najpierw omówimy metody nawigacji, a następnie przejdziemy dalej.
#1) Metody nawigacji
Ta metoda służy do przesuwania kursora po zbiorze danych.
- Boolean absolute(int row): Służy do przeniesienia kursora do określonego wiersza, który jest wymieniony w parametrze i zwraca wartość true, jeśli operacja się powiedzie, w przeciwnym razie zwraca wartość false.
- Void afterLast(): Sprawia, że kursor ResultSet przesuwa się po ostatnim wierszu.
- Void beforeFirst(): Powoduje to przesunięcie kursora ResultSet przed pierwszy wiersz.
- Boolean first(): Sprawia, że kursor ResultSet przechodzi do pierwszego wiersza. Zwraca True, jeśli operacja się powiedzie, w przeciwnym razie False.
- Boolean last(): Sprawia, że kursor ResultSet przechodzi do ostatniego wiersza. Zwraca True, jeśli operacja się powiedzie, w przeciwnym razie False.
- Boolean next(): Sprawia, że kursor ResultSet przechodzi do następnego wiersza. Zwraca True, jeśli jest więcej rekordów i False, jeśli nie ma więcej rekordów.
- Boolean previous(): Sprawia, że kursor ResultSet przechodzi do poprzedniego wiersza. Zwraca True, jeśli operacja się powiedzie, w przeciwnym razie False.
- Boolean relative(): Przesuwa kursor do podanej liczby wierszy w kierunku do przodu lub do tyłu.
- Int getRow(): Zwraca bieżący numer wiersza, na który wskazuje obiekt ResultSet.
- Void moveToCurrentRow(): Przesuwa kursor z powrotem do bieżącego wiersza, jeśli aktualnie znajduje się on w wierszu wstawiania.
- Void moveToInsertRow(): Przesuwa kursor do określonego wiersza, aby wstawić wiersz do bazy danych. Zapamiętuje bieżącą lokalizację kursora. Możemy więc użyć metody moveToCurrentRow(), aby przesunąć kursor do bieżącego wiersza po wstawieniu.
W tym samouczku wszystkie programy są napisane w Javie. Użyliśmy wersji Java 8 i Oracle DB.
>>Oprogramowanie Oracle można pobrać stąd
>>Javę w wersji 8 można pobrać stąd
Zawiera proces instalacji Java krok po kroku.
Przykładowy program JDBC ResultSet (z wykorzystaniem metod nawigacji)
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class ResultSet_Example { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub //Select query String select_query = "select * fromemployee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Connecting to Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:X E")) { //Creating DatabaseMetaData object DatabaseMetaData dbmd = conn.getMetaData(); //Checking whether driver supports scroll sensitive type and concur updatable boolean isSupportResultSetType =dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Tworzenie przygotowanej instrukcji PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(); / /Przesunięcie kursora do pierwszego wiersza rs.first();System.out.println("FIRST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point last row rs.last(); System.out.println("LAST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point before first row rs.beforeFirst();System.out.println("Kursor wskazuje przed pierwszym wierszem. Użyj next(), aby przejść do przodu"); //Przesunięcie kursora do pierwszego wiersza za pomocą next() rs.next(); System.out.println("PIERWSZY WIERSZ \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Przesunięcie kursora do ostatniego wiersza rs.afterLast(); System.out.println("KursorUżyj previous(), aby poruszać się w kierunku wstecz"); //Przesunięcie kursora do ostatniego wiersza za pomocą previous() rs.previous(); System.out.println("OSTATNI WIERSZ \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Przesunięcie kursora do trzeciego wiersza rs.absolute(3); System.out.println("Kursor wskazuje na trzeci wiersz.row"); System.out.println("THIRD ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving cursor to point previous row of third row rs.relative(-1); System.out.println("Cursor is indicating to the 1 row previous to the 3rd row"); System.out.println("Second ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Przesunięcie kursora do 4. wiersza po 2. wierszu rs.relative(4); System.out.println("Kursor wskazuje 4. wiersz po 2. wierszu"); System.out.println("SIXTH ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = " + rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Przesunięcie kursora do bieżącego wierszaSystem.out.println(" Current Row = " + rs.getRow()); } } catch (SQLException e) { e.printStackTrace(); } } }
WYJŚCIE:
Dane w tabeli Employee_details
Wyjaśnienie:
W powyższym programie zaimplementowaliśmy metody first(), last(), beforeFirst(), afterLast(), next(), previous(), absolute(), relative() i getRow() w ResultSet. Aby użyć tych metod, ustawiamy wartości ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE w metodzie prepareStatement.
Następnie omówimy metody Getter w ResultSet:
#2) Metody Getter
ResultSet przechowuje dane tabeli z bazy danych. Metody Getter służą do pobierania wartości tabeli w ResultSet. W tym celu musimy przekazać wartość indeksu kolumny lub nazwę kolumny.
Poniżej przedstawiono metody pobierające w ResultSet:
- int getInt(int ColumnIndex): Służy do pobierania wartości określonej kolumny Index jako typu danych int.
- float getFloat(int ColumnIndex): Służy do uzyskania wartości określonej kolumny Index jako typu danych float.
- java.sql.date getDate(int ColumnIndex): Służy do pobierania wartości określonej kolumny Index jako wartości daty.
- int getInt(String ColumnName): Służy do pobierania wartości określonej kolumny jako typu danych int.
- float getFloat(String ColumnName): Służy do pobierania wartości określonej kolumny jako typu danych float.
- Java.sql.date getDate(String ColumnName): Służy do pobierania wartości określonej kolumny jako wartości daty.
W interfejsie ResultSet dostępne są metody pobierające dla wszystkich prymitywnych typów danych (Boolean, long, double) i String. Z bazy danych możemy również pobrać tablicę i dane typu binarnego, które również mają swoje metody.
#3) Metody ustawiające/aktualizujące
Możemy zaktualizować wartość w bazie danych za pomocą metod ResultSet Updater. Jest to podobne do metod Getter, ale tutaj musimy przekazać wartości / dane dla konkretnej kolumny do aktualizacji w bazie danych.
Poniżej przedstawiono metody aktualizacji w ResultSet:
- void updateInt(int ColumnIndex, int Value): Służy do aktualizacji wartości określonej kolumny Index z wartością int.
- void updateFloat(int ColumnIndex, float f): Służy do aktualizacji wartości określonej kolumny Index z wartością zmiennoprzecinkową.
- void updateDate(int ColumnIndex, Date d): Służy do aktualizacji wartości określonej kolumny Index z wartością daty.
- void updateInt(String ColumnName, int Value): Służy do aktualizacji wartości określonej kolumny z podaną wartością int.
- void updateFloat(String ColumnName, float f): Służy do aktualizacji wartości określonej kolumny z podaną wartością zmiennoprzecinkową.
- Java.sql.date getDate(String ColumnName): Służy do aktualizacji wartości określonej kolumny z podaną wartością daty.
Istnieją metody Updater dla wszystkich prymitywnych typów danych (Boolean, long, double) i String również w interfejsie ResultSet.
Metody Updater po prostu aktualizują dane w obiekcie ResultSet. Wartości zostaną zaktualizowane w DB po wywołaniu metody insertRow lub updateRow.
Aktualizacja wiersza:
Możemy zaktualizować dane w wierszu, wywołując metodę updateX(), przekazując nazwę kolumny lub indeks oraz wartości do aktualizacji. Możemy użyć dowolnego typu danych zamiast X w metodzie updateX. Do tej pory zaktualizowaliśmy dane w obiekcie ResultSet. Aby zaktualizować dane w DB, musimy wywołać metodę updateRow().
Wstawianie wiersza:
Musimy użyć moveToInsertRow(), aby przesunąć kursor w celu wstawienia nowego wiersza. Omówiliśmy to już w sekcji Metody nawigacji. Następnie musimy wywołać metodę updateX(), aby dodać dane do wiersza. Powinniśmy podać dane dla wszystkich kolumn, w przeciwnym razie zostanie użyta domyślna wartość danej kolumny.
Po zaktualizowaniu danych musimy wywołać metodę insertRow(), a następnie użyć metody moveToCurrentRow(), aby przenieść pozycję kursora z powrotem do wiersza, w którym znajdowaliśmy się przed rozpoczęciem wstawiania nowego wiersza.
Przykład ResultSet:
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ResultSet_Example1 { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub String select_query ="select empnum,lastName,firstName from employee_details"; String insert_query = "insert into employee_details values(?,?,?,?,?,?)"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Connecting to Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { //Creating DatabaseMetaData object DatabaseMetaData dbmd = conn.getMetaData();//Checking whether driver supports scroll insensitive type and concur updatable boolean isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Creating prepared Statement PreparedStatement pstatemnt1 = = // Tworzenie przygotowanego zestawienia.conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(select_query); //Moving cursor to point last row of the table rs.last(); System.out.println("LAST ROW: Before inserting new Employee"); System.out.println("LAST ROW: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\nLAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Ustawienie wartości do wstawienia w tabeli EMPLOYEE_DETAILS //Przesunięcie kursora w celu wstawienia wiersza do tabeli rs.moveToInsertRow(); //Uaktualnienie wartości EMPNUM rs.updateInt(1, 1017); //Uaktualnienie wartości LAST NAME rs.updateString(2, "Bond"); //Uaktualnienie wartości FIRST NAME rs.updateString(3, "James"); //Wstawienie nowego wiersza rs.insertRow();//Przesunięcie kursora do punktu 5. wiersza rs.absolute(5); System.out.println("Przed aktualizacją EMPNUM 5. wiersza"); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); System.out.println(" Aktualizacja EMP id 5. pracownika"); //Aktualizacja EMPNUM 5. wiersza rs.updateInt(1,3005); rs.updateRow(); System.out.println("\n EMPNUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point last row rs.last(); System.out.println("LAST ROW: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); } } catch (SQLException e) { e.printStackTrace(); } }}
WYJŚCIE:
Wyjaśnienie:
W powyższym programie najpierw zapisaliśmy dane tabeli Employee_details w obiekcie ResultSet za pomocą zapytania SELECT. Następnie wyświetliliśmy dane ostatniego wiersza w tabeli employee_details za pomocą metody last() obiektu ResultSet. Metoda moveToInsertRow() powoduje, że kursor wskazuje bieżący wiersz, teraz bieżący wiersz jest ostatnim wierszem.
Metoda updateXXX() posłużyła do aktualizacji wartości w wierszu, a metoda insertRow() wstawiła dane do nowego wiersza. Za pomocą metody absolute() ustawiliśmy kursor tak, aby wskazywał na 5. wiersz. Metoda UpdateInt() została użyta do aktualizacji EMPNUM nowym identyfikatorem 5. pracownika w tabeli. Następnie wyświetlono dane, aby sprawdzić, czy EMPNUM zostało zaktualizowane, czy nie.
Utworzenie kursora wskazującego ostatni wiersz tabeli za pomocą funkcji last() i wyświetlenie go. Aby wykonać powyższą logikę, musimy ustawić wartości ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE w metodzie prepareStatement.
#4) Różne metody
- void close(): Służy do zamknięcia instancji ResultSet i zwolnienia zasobów powiązanych z instancją ResultSet.
- ResultSetMetaData getMetaData(): Zwraca instancję ResultSetMetaData, która zawiera informacje o typie i właściwościach kolumn wyjściowego zapytania. Więcej informacji na temat ResultSetMetaData poznamy w następnej sekcji.
ResultSetMetaData
Czym są metadane?
Metadane oznaczają dane o danych. Za pomocą tego interfejsu uzyskamy więcej informacji o ResultSet. Jest on dostępny w pakiecie java.sql. Każdy obiekt ResultSet jest powiązany z jednym obiektem ResultSetMetaData.
Ten obiekt będzie zawierał szczegółowe informacje o właściwościach kolumn, takich jak typ danych kolumny, nazwa kolumny, liczba kolumn, nazwa tabeli, nazwa schematu itp. Możemy uzyskać obiekt ResultSetMetaData za pomocą metody getMetaData () ResultSet.
Składnia ResultSetMetaData:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS"); ResultSetMetaData rsmd = rs.getMetaData();
Ważne metody interfejsu ResultSetMetaData:
Nazwa metody | Opis |
---|---|
String getColumnName(int column) | Zwraca ona nazwę konkretnej kolumny |
String getColumnTypeName(int column) | Zwraca typ danych konkretnej kolumny, którą przekazaliśmy jako parametr |
String getTableName(int column) | Zwraca nazwę tabeli kolumny |
String getSchemaName(int column) | Zwraca nazwę schematu tabeli kolumny |
int getColumnCount() | Zwraca liczbę kolumn w ResultSet |
boolean isAutoIncrement(int Column) | Zwraca wartość true, jeśli dana kolumna jest automatycznie inkrementowana, w przeciwnym razie false. |
boolean isCaseSensitive(int Column) | Zwraca wartość true, jeśli dana kolumna jest Case Sensitive, w przeciwnym razie false |
Przykład ResultSetMetaData
package com.STH.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class ResultSetMetaData_Example { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub String QUERY= " select * fromemployee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { Statement statemnt1 = conn.createStatement(); ResultSet rs1 =null; rs1 = statemnt1.executeQuery(QUERY); ResultSetMetaData rsmd = rs1.getMetaData(); System.out.println(" Używamy ResultSetMetaData ");System.out.println("No: of Columns: " + rsmd.getColumnCount()); System.out.println("ColumnName of Column 1: " + rsmd.getColumnName(1)); System.out.println("Data Type of Column 2: " + rsmd.getColumnTypeName(2)); System.out.println("Table Name of the Column 1: " + rsmd.getTableName(1)); System.out.println("Schema Name of the Column 1: " + rsmd.getSchemaName(1)); } }
WYJŚCIE:
Wyjaśnienie:
W powyższym programie zaimplementowaliśmy metody getColumnCount(), getColumnName(), getColumnTypeName(), getTableName() i getSchemaName() w interfejsie ResultSetMetaData.
DatabaseMetaData
Interfejs DatabaseMetaData dostarcza informacji o bazie danych, takich jak nazwa bazy danych, wersja bazy danych itp.
Ważne metody interfejsu DatabaseMetaData:
Nazwa metody | Opis |
---|---|
String getDriverName() | Zwróci ona nazwę sterownika JDBC, którego używamy w naszym programie Java |
String getDriverVersion() | Zwraca numer wersji sterownika JDBC |
String getUserName() | Zwraca nazwę użytkownika bazy danych, z której korzystamy |
String getDatabaseProductName() | Zwraca nazwę bazy danych, z której korzystamy |
String getDatabaseProductVersion() | Zwraca numer wersji bazy danych, z której korzystamy |
ResultSet getSchemas() | Zwraca nazwy schematów dostępnych w połączonej bazie danych |
String getStringFunctions() | Zwraca listę funkcji łańcuchowych dostępnych w połączonej bazie danych |
String getTimeDateFunctions() | Zwraca listę funkcji czasu i daty dostępnych w połączonej bazie danych |
String getURL() | Zwraca adres URL bazy danych |
Boolean isReadOnly() | Zwraca, czy baza danych jest w trybie tylko do odczytu |
Boolean supportsBatchUpdates() | Zwraca, czy baza danych obsługuje aktualizacje wsadowe |
Boolean supportsSavepoints() | Zwraca, czy baza danych obsługuje punkty zapisu |
Boolean supportsStatementPooling() | Zwraca informację, czy baza danych obsługuje funkcję Statement Pooling |
Boolean supportsStoredProcedures() | Zwraca, czy baza danych obsługuje procedury składowane |
Boolean supportsOuterJoins() | Zwraca, czy baza danych obsługuje Outer Join |
Tutaj wymieniliśmy kilka ważnych metod interfejsu DatabaseMetaData. Możesz odnieść się do oficjalnej strony internetowej Oracle gdzie można zobaczyć wszystkie metody dostępne w interfejsie DatabaseMetaData.
DatabaseMetaData Przykład:
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class DatabaseMetaData_Example { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stubClass.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE"); DatabaseMetaData dbmd = conn.getMetaData(); System.out.println("Using DatabaseMetaData"); System.out.println("Driver Name: " + dbmd.getDriverName()); System.out.println("Driver Version: "+ dbmd.getDriverVersion()); System.out.println("UserName of theDatabase: " + dbmd.getUserName()); System.out.println("Database Product Name:" + dbmd.getDatabaseProductName()); System.out.println("Database Product Version: " + dbmd.getDatabaseProductVersion()); System.out.println("List of String Functions in the Database: " + dbmd.getStringFunctions()); System.out.println("List of Time & Date functions in the Database: " + dbmd.getTimeDateFunctions());System.out.println("Adres URL bazy danych: " + dbmd.getURL()); System.out.println("Baza danych jest tylko do odczytu? " + dbmd.isReadOnly()); System.out.println("Obsługujesz aktualizacje wsadowe? " + dbmd.supportsBatchUpdates()); System.out.println("Obsługujesz punkty zapisu? " + dbmd.supportsSavepoints()); System.out.println("Obsługujesz Statement Pooling? " + dbmd.supportsStatementPooling()); System.out.println("Obsługujesz StoredProcedures? " + dbmd.supportsStoredProcedures()); System.out.println("Support Outer Join? "+ dbmd.supportsOuterJoins()); } }
WYJŚCIE:
Wyjaśnienie:
W powyższym programie użyliśmy/zaimplementowaliśmy metody getDriverName(), getDriverVersion(), getUserName(), getDatabaseProductName(), getDatabaseProductVersion(), getStringFunctions(), getTimeDateFunctions(), getURL(), isReadOnly(), supportsBatchUpdates(), supportsStatementPooling(), supportsSavepoints(), supportsStoredProcedures() i supportsOuterJoins() w interfejsie DatabaseMetaData.
Punkty do odnotowania:
- Interfejs JDBC ResultSet służy do przechowywania danych z bazy danych i używania ich w naszym programie Java.
- Możemy również użyć ResultSet do aktualizacji danych za pomocą metod updateXXX().
- Obiekt ResultSet wskazuje kursor przed pierwszym wierszem danych wynikowych. Za pomocą metody next() możemy iterować po ResultSet.
- Mamy metody nawigacyjne ResultSet, aby poruszać się dalej w obiekcie ResultSet
- ResultMetaData służy do uzyskiwania dodatkowych informacji o ResultSet, takich jak nazwa kolumny, liczba kolumn, typ danych kolumny itp.
- DatabaseMetData służy do pobierania informacji o bazie danych, z którą się połączyliśmy
Często zadawane pytania
P #1) Jakie jest zastosowanie ResultSet?
Odpowiedź: ResultSet służy do przechowywania i pobierania danych z bazy danych. Po wykonaniu metody executeQuery() zwróci ona obiekt ResultSet. Możemy użyć tego obiektu ResultSet w naszym programie do wykonania logiki.
Q #2) Jak sprawdzić czy ResultSet jest pusty czy nie?
Odpowiedź: Nie ma predefiniowanych metod, takich jak length(), size() dostępnych do sprawdzenia IsResultSet Empty. Możemy użyć metody next() do iteracji i jeśli zwróci True, to nie jest pusty, jeśli zwróci False, oznacza to, że ResultSet jest pusty.
P #3) Czy jest możliwe, że ResultSet może mieć wartość null?
Odpowiedź: Nie, metoda executeQuery() zwraca obiekt ResultSet, który nigdy nie może mieć wartości null.
P #4) Co to jest aktualizowalny ResultSet?
Odpowiedź: Aktualizowalny obiekt ResultSet służy do aktualizacji danych w kolumnie, wstawiania danych do kolumn i usuwania wierszy. Aby utworzyć aktualizowalny ResultSet, musimy ustawić typ przewijania jako wrażliwy lub niewrażliwy oraz typ CONCUR jako aktualizowalny.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
Q #5) Jak uzyskać nazwę bazy danych, z którą nawiązano połączenie?
Odpowiedź: Możemy użyć metody getDatabaseProductName() obiektu DatabaseMetaData.
Wnioski
W tym samouczku omówiliśmy interfejsy ResultSet, ResultSetMetaData i DatabaseMetaData oraz ich ważne metody powszechnie stosowane w programach JDBC. Widzieliśmy również, jak aktualizować dane w bazie danych za pomocą ResultSet. ResultSetMetadata zawiera informacje o ResultSet, takie jak nazwa kolumny, liczba kolumn i tak dalej.
DatabaseMetaData zawiera informacje o bazie danych.
<