Tento tutoriál vysvětluje, jak používat JDBC ResultSet k načítání dat. Seznámíme se také s rozhraními ResultSetMetaData a DatabaseMetaData na příkladech:
V JDBC DriverManager výukový program Série výukových kurzů JDBC , jsme se naučili používat JDBC DriverManager a jeho metody JDBC PreparedStatement v aplikacích Java.
V tomto tutoriálu probereme zbývající rozhraní v JDBC. V předchozích tutoriálech jsme se zabývali rozhraními Statement, PreparedStatement a CallableStatement.
Zde se seznámíme s rozhraními JDBC ResultSet, ResultSetMetaData a DatabaseMetaData, jejich metodami a jejich použitím v programu v jazyce Java.
Rozhraní JDBC ResultSet
Rozhraní ResultSet se nachází v balíčku java.sql. Slouží k ukládání dat, která jsou vrácena z databázové tabulky po provedení příkazů SQL v programu Java. Objekt ResultSet udržuje kurzor na výsledných datech. Ve výchozím nastavení se kurzor nachází před prvním řádkem výsledných dat.
Metoda next() slouží k přesunu kurzoru na další pozici směrem dopředu. Vrátí FALSE, pokud již nejsou žádné další záznamy. Data získá voláním metody executeQuery() pomocí některého z objektů příkazu. Může to být objekt Statement nebo PreparedStatement nebo CallableStatement. Rozhraní PreparedStatement a CallableStatement jsou dílčími rozhraními objektu Statement.rozhraní.
Rozhraní prohlášení
Příkaz statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery("Select * from EMPLOYEE_DETAILS");
Rozhraní PreparedStatement
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS");
Při iteraci výsledků můžeme použít metodu getX() pro získání dat sloupců, kde X - je datový typ sloupce. Pro získání hodnot pomocí metody getX() můžeme použít buď názvy sloupců, nebo index.
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); }
V metodách getX() můžeme také místo názvu sloupce uvést indexové číslo sloupce.
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 výsledkových sad
Ve výchozím nastavení můžeme iterovat data/hodnoty v souboru ResultSet, které byly vráceny jako výstup provedeného příkazu SQL, směrem dopředu. Hodnoty můžeme iterovat i v jiných směrech pomocí Scrollable ResultSet. Při vytváření objektů Statement, PreparedStatement a CallableStatement můžeme určit typ a souběžnost souboru ResultSet.
V souboru ResultSet existují 3 typy. Jsou to:
- TYPE_FORWARD_ONLY: Jedná se o výchozí možnost, kdy se kurzor pohybuje od začátku do konce, tj. směrem dopředu.
- TYPE_SCROLL_INSENSITIVE: U tohoto typu se bude kurzor pohybovat jak dopředu, tak dozadu. Pokud při iteraci uložených dat provedeme v datech nějaké změny, nebude se v datasetu aktualizovat, pokud někdo změní data v DB. Protože dataset obsahuje data od okamžiku, kdy SQL dotaz vrátí Data.
- TYPE_SCROLL_SENSITIVE: Je to podobné jako TYPE_SCROLL_INSENSITIVE, rozdíl je v tom, že pokud někdo aktualizuje data poté, co SQL dotaz vrátil data, při iteraci se změny promítnou do datové sady.
Současnost sady výsledků
V ResultSet existují 2 režimy Concurrency. Jsou to:
- ResultSet.CONCUR_READ_ONLY: Jedná se o výchozí režim souběhu. Data v ResultSet můžeme pouze číst. Aktualizace se nepoužije.
- ResultSet.CONCUR_UPDATABLE: Můžeme aktualizovat data v objektu ResultSet.
Některé databáze nepodporují souběžný režim pro všechny typy ResultSet. V takovém případě musíme zkontrolovat, zda podporují požadovaný typ a souběžný režim pomocí metody supportsResultSetConcurrency().
Metody v rozhraní ResultSet
Existují 4 kategorie metod ResultSet. Jsou to:
- Navigační metody
- Metody Getter
- Metody setteru
- Různé metody
Nejprve si probereme navigační metody a poté se posuneme dále.
#1) Navigační metody
Tato metoda se používá k pohybu kurzoru po datové sadě.
- Boolean absolute(int row): Slouží k přesunu kurzoru na zadaný řádek, který je uveden v parametru, a vrací true, pokud je operace úspěšná, jinak vrací false.
- Void afterLast(): To způsobí, že se kurzor ResultSet přesune za poslední řádek.
- Void beforeFirst(): To způsobí, že se kurzor ResultSet přesune před první řádek.
- Boolean first(): Vrátí True, pokud je operace úspěšná, jinak False.
- Boolean last(): Vrátí True, pokud je operace úspěšná, jinak False.
- Boolean next(): Vrátí True, pokud jsou k dispozici další záznamy, a False, pokud nejsou k dispozici žádné další záznamy.
- Boolean previous(): Vrátí True, pokud je operace úspěšná, jinak False.
- Boolean relative(): Přesune kurzor na zadaný počet řádků směrem dopředu nebo dozadu.
- Int getRow(): Vrací číslo aktuálního řádku, na který objekt ResultSet nyní ukazuje.
- Void moveToCurrentRow(): Přesune kurzor zpět na aktuální řádek, pokud se právě nachází ve vkládacím řádku.
- Void moveToInsertRow(): Přesune kurzor na konkrétní řádek pro vložení řádku do Databáze. Pamatuje si aktuální umístění kurzoru. Můžeme tedy použít metodu moveToCurrentRow() pro přesun kurzoru na aktuální řádek po vložení.
V tomto tutoriálu jsou všechny programy napsány v jazyce Java. Použili jsme verzi Java 8 a DB Oracle.
>>Software Oracle si můžete stáhnout zde
>>Verzi Java 8 si můžete stáhnout odtud.
Obsahuje postup instalace Javy krok za krokem.
Příklad programu JDBC ResultSet:(Použití navigačních metod)
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 Automaticky generovaný stub metody //Select query String select_query = "select * fromemployee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Připojení k Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:X E")) { //Vytvoření objektu DatabaseMetaData DatabaseMetaData dbmd = conn.getMetaData(); //Kontrola, zda ovladač podporuje typ citlivý na svitky a souběžnou aktualizaci boolean isSupportResultSetType =dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Vytvoření připraveného příkazu PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(); //Přesun kurzoru na první řádek 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("Kurzor ukazuje před první řádek. Použijte next() pro pohyb směrem dopředu"); /Přesun kurzoru na první řádek pomocí next() rs.next(); System.out.println("PRVNÍ ŘÁDEK \n EMP NUM = " + rs.getInt("empNum") + "\n POSLEDNÍ JMÉNO = " + rs.getString(2)+"\n PRVNÍ JMÉNO = " + rs.getString(3)); /Přesun kurzoru na bod za posledním řádkem rs.afterLast(); System.out.println("Kurzor ukazuje na první řádek.pro pohyb směrem zpět použijte previous()"); /Přesun kurzoru na poslední řádek pomocí previous() rs.previous(); System.out.println("POSLEDNÍ ŘÁDEK \n EMP NUM = " + rs.getInt("empNum") + "\n POSLEDNÍ JMÉNO = "+ rs.getString(2)+"\n PRVNÍ JMÉNO = " + rs.getString(3)); /Přesun kurzoru na třetí řádek rs.absolute(3); System.out.println("Kurzor ukazuje na 3.řádek"); System.out.println("TŘETÍ ŘADA \n EMP NUM = " + rs.getInt("empNum") + "\n POSLEDNÍ JMÉNO = "+ rs.getString(2)+"\n PRVNÍ JMÉNO = " + rs.getString(3)); /Přesun kurzoru na předchozí řádek třetího řádku rs.relative(-1); System.out.println("Kurzor ukazuje na 1 řádek před 3. řádkem"); System.out.println("DRUHÝ ŘÁDEK \n EMP NUM = " + rs.getInt("empNum") + "\n POSLEDNÍ JMÉNO = "+rs.getString(2)+"\n PRVNÍ JMÉNO = " + rs.getString(3)); /Přesun kurzoru na 4. řádek za 2. řádek rs.relative(4); System.out.println("Kurzor ukazuje na 4. řádek za 2. řádkem"); System.out.println("ŠESTÝ ŘÁDEK \n EMP NUM = " + rs.getInt("empNum") + "\n POSLEDNÍ JMÉNO = "+ rs.getString(2)+"\n PRVNÍ JMÉNO = " + rs.getString(3)); /Přesun kurzoru na aktuální řádekSystem.out.println(" Aktuální řádek = " + rs.getRow()); } } catch (SQLException e) { e.printStackTrace(); } } } }
VÝSTUP:
Data v tabulce Employee_details
Vysvětlení:
Ve výše uvedeném programu jsme v souboru ResultSet implementovali metody first(), last(), beforeFirst(), afterLast(), next(), previous(), absolute(), relative() a getRow(). Pro použití těchto metod jsme v metodě prepareStatement nastavili hodnoty ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE.
Dále se budeme zabývat metodami Getter v ResultSet:
#2) Metody Getter
V souboru ResultSet jsou uložena data tabulky z databáze. Metody Getter slouží k získání hodnot tabulky v souboru ResultSet. K tomu potřebujeme předat buď hodnotu indexu sloupce, nebo název sloupce.
Následují metody getter v ResultSet:
- int getInt(int ColumnIndex): Slouží k získání hodnoty zadaného sloupce Index jako datového typu int.
- float getFloat(int ColumnIndex): Slouží k získání hodnoty zadaného sloupce Index jako datového typu float.
- java.sql.date getDate(int ColumnIndex): Slouží k získání hodnoty zadaného sloupce Index jako hodnoty data.
- int getInt(String ColumnName): Slouží k získání hodnoty zadaného sloupce jako datového typu int.
- float getFloat(String ColumnName): Slouží k získání hodnoty zadaného sloupce jako datového typu float.
- Java.sql.date getDate(String ColumnName): Slouží k získání hodnoty zadaného sloupce jako hodnoty data.
V rozhraní ResultSet jsou metody getter pro všechny primitivní datové typy (Boolean, long, double) a také String. Z databáze můžeme získat také pole a binární typ dat. I pro to má metody.
#3) Metody Setter/Updater
Hodnotu v Databázi můžeme aktualizovat pomocí metod ResultSet Updater. Je to podobné jako u metod Getter, ale zde musíme předat hodnoty/data pro konkrétní sloupec, který chceme v Databázi aktualizovat.
Následují metody updateru v ResultSet:
- void updateInt(int ColumnIndex, int Value): Slouží k aktualizaci hodnoty zadaného sloupce Index hodnotou int.
- void updateFloat(int ColumnIndex, float f): Slouží k aktualizaci hodnoty zadaného sloupce Index pomocí hodnoty float.
- void updateDate(int ColumnIndex, Date d): Slouží k aktualizaci hodnoty zadaného sloupce Index pomocí hodnoty data.
- void updateInt(String ColumnName, int Value): Slouží k aktualizaci hodnoty zadaného sloupce zadanou hodnotou int.
- void updateFloat(String ColumnName, float f): Slouží k aktualizaci hodnoty zadaného sloupce zadanou hodnotou float.
- Java.sql.date getDate(String ColumnName): Slouží k aktualizaci hodnoty zadaného sloupce pomocí zadané hodnoty data.
V rozhraní ResultSet jsou k dispozici metody Updater pro všechny primitivní datové typy (Boolean, long, double) a String.
Metody Updater pouze aktualizují data v objektu ResultSet. Hodnoty budou v DB aktualizovány po zavolání metody insertRow nebo updateRow.
Aktualizace řádku:
Data v řádku můžeme aktualizovat voláním metody updateX(), předáním názvu sloupce nebo indexu a hodnot, které chceme aktualizovat. V metodě updateX můžeme místo X použít libovolný datový typ. Dosud jsme aktualizovali data v objektu ResultSet. Pro aktualizaci dat v DB musíme zavolat metodu updateRow().
Vložení řádku:
K přesunu kurzoru pro vložení nového řádku musíme použít metodu moveToInsertRow(). Tou jsme se již zabývali v části Navigační metody. Dále musíme zavolat metodu updateX(), abychom do řádku přidali data. Měli bychom zadat data pro všechny sloupce, jinak se použije výchozí hodnota daného sloupce.
Po aktualizaci dat musíme zavolat metodu insertRow(). Poté použijeme metodu moveToCurrentRow(), abychom vrátili pozici kurzoru zpět na řádek, na kterém jsme byli předtím, než jsme začali vkládat nový řádek.
Příklad sady výsledků:
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 Automaticky generovaný stub metody String select_query ="select empnum,lastName,firstName from employee_details"; String insert_query = "insert into employee_details values(?,?,?,?,?,?,?)"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Připojení k DB Oracle try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { //Vytvoření objektu DatabaseMetaData DatabaseMetaData dbmd = conn.getMetaData();//Kontrola, zda ovladač podporuje typ scroll insensitive a concur updatable boolean isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Vytvoření připraveného příkazu PreparedStatement pstatemnt1 =conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(select_query); /Přesun kurzoru na poslední řádek tabulky rs.last(); System.out.println("POSLEDNÍ ŘÁDEK: Před vložením nového zaměstnance"); System.out.println("POSLEDNÍ ŘÁDEK: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\nLAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Nastavení hodnot pro vložení do tabulky EMPLOYEE_DETAILS //Přesun kurzoru na místo vložení řádku do tabulky rs.moveToInsertRow(); //Aktualizace hodnoty EMPNUM rs.updateInt(1, 1017); //Aktualizace hodnoty LAST NAME rs.updateString(2, "Bond"); //Aktualizace hodnoty FIRST NAME rs.updateString(3, "James"); //Vložení nového řádku rs.insertRow();/Přesun kurzoru na bod 5. řádku rs.absolute(5); System.out.println("Před aktualizací EMPNUM 5. řádku"); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n POSLEDNÍ JMÉNO = " + rs.getString(2)+"\n PRVNÍ JMÉNO = " + rs.getString(3)); System.out.println(" Aktualizace EMP id 5. ZAMĚSTNANCE"); //Aktualizace EMPNUM 5. řádku 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(); } }}
VÝSTUP:
Vysvětlení:
Ve výše uvedeném programu jsme nejprve uložili data tabulky Employee_details do objektu ResultSet pomocí dotazu SELECT. Poté jsme zobrazili data posledního řádku tabulky employee_details pomocí metody last() souboru ResultSet. metoda moveToInsertRow() způsobí, že kurzor ukáže na aktuální řádek, nyní je aktuální řádek posledním řádkem.
Metody updateXXX() sloužily k aktualizaci hodnot do řádku a metoda insertRow() vložila data do nového řádku. Pomocí metody absolute() jsme vytvořili kurzor tak, aby ukazoval na 5. řádek. Metoda UpdateInt() byla použita k aktualizaci EMPNUM s novým id 5. zaměstnance v tabulce. Poté se zobrazily údaje, aby se zkontrolovalo, zda je EMPNUM aktualizováno nebo ne.
Pomocí funkce last() jsme kurzor nasměrovali na poslední řádek tabulky a zobrazili jej. Pro provedení výše uvedené logiky musíme v metodě prepareStatement nastavit hodnoty ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE.
#4) Různé metody
- void close(): Slouží k uzavření instance sady ResultSet a uvolnění prostředků přidružených k instanci sady ResultSet.
- ResultSetMetaData getMetaData(): Vrací instanci ResultSetMetaData. Obsahuje informace o typu a vlastnostech sloupců výstupu dotazu. Více se o ResultSetMetaData dozvíme v další části.
ResultSetMetaData
Co jsou to metadata?
Metadata znamenají údaje o datech. Pomocí tohoto rozhraní získáme další informace o ResultSetu. Je k dispozici v balíčku java.sql. Ke každému objektu ResultSetu je přiřazen jeden objekt ResultSetMetaData.
Tento objekt bude obsahovat podrobnosti o vlastnostech sloupců, jako je datový typ sloupce, název sloupce, počet sloupců, název tabulky, název schématu atd., Objekt ResultSetMetaData můžeme získat pomocí metody getMetaData() souboru ResultSet.
Syntaxe souboru ResultSetMetaData:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS"); ResultSetMetaData rsmd = rs.getMetaData();
Důležité metody rozhraní ResultSetMetaData:
Název metody | Popis |
---|---|
String getColumnName(int column) | Vrací název sloupce konkrétního sloupce |
String getColumnTypeName(int column) | Vrátí datový typ konkrétního sloupce, který jsme předali jako parametr. |
String getTableName(int column) | Vrací název tabulky sloupce |
String getSchemaName(int column) | Vrací název schématu tabulky sloupce. |
int getColumnCount() | Vrací počet sloupců souboru ResultSet |
boolean isAutoIncrement(int Sloupec) | Vrací true, pokud je daný sloupec Auto Increment, jinak false |
boolean isCaseSensitive(int Sloupec) | Vrací true, pokud je daný sloupec Case Sensitive, jinak false |
Příklad 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 Automaticky generovaný stub metody 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(" We are using ResultSetMetaData ");System.out.println("Počet: sloupců: " + rsmd.getColumnCount()); System.out.println("Název sloupce 1: " + rsmd.getColumnName(1)); System.out.println("Typ dat sloupce 2: " + rsmd.getColumnTypeName(2)); System.out.println("Název tabulky sloupce 1: " + rsmd.getTableName(1)); System.out.println("Název schématu sloupce 1: " + rsmd.getSchemaName(1)); } } }
VÝSTUP:
Vysvětlení:
Ve výše uvedeném programu jsme v rozhraní ResultSetMetaData implementovali metody getColumnCount(),getColumnName(), getColumnTypeName(), getTableName() a getSchemaName().
DatabaseMetaData
Rozhraní DatabaseMetaData poskytuje informace o databázi, jako je název databáze, verze databáze atd.
Důležité metody rozhraní DatabaseMetaData:
Název metody | Popis |
---|---|
String getDriverName() | Vrátí název ovladače JDBC, který používáme v našem programu v jazyce Java. |
String getDriverVersion() | Vrací číslo verze ovladače JDBC |
String getUserName() | Vrátí uživatelské jméno databáze, kterou používáme. |
String getDatabaseProductName() | Vrací název databáze, kterou používáme. |
String getDatabaseProductVersion() | Vrací číslo verze databáze, kterou používáme. |
ResultSet getSchemas() | Vrátí názvy schémat dostupných v připojené databázi. |
String getStringFunctions() | Vrací seznam řetězcových funkcí dostupných v připojené databázi. |
String getTimeDateFunctions() | Vrátí seznam funkcí času a data dostupných v připojené databázi. |
String getURL() | Vrací adresu URL databáze |
Boolean isReadOnly() | Vrací, zda je databáze v režimu pouze pro čtení. |
Boolean supportsBatchUpdates() | Vrací, zda databáze podporuje dávkové aktualizace |
Boolean supportsSavepoints() | Vrací, zda databáze podporuje body uložení. |
Boolean supportsStatementPooling() | Vrací, zda databáze podporuje sdružování příkazů. |
Boolean supportsStoredProcedures() | Vrací, zda databáze podporuje uložené procedury. |
Boolean supportsOuterJoins() | Vrací, zda databáze podporuje funkci Outer Join |
Zde jsme uvedli některé důležité metody rozhraní DatabaseMetaData. Můžete se podívat na oficiální stránky rozhraní Oracle kde si můžete prohlédnout všechny metody dostupné v rozhraní DatabaseMetaData.
DatabaseMetaData Příklad:
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 Automaticky generovaný stub metodyClass.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE"); DatabaseMetaData dbmd = conn.getMetaData(); System.out.println("Použití DatabaseMetaData"); System.out.println("Název ovladače: " + dbmd.getDriverName()); System.out.println("Verze ovladače: "+ dbmd.getDriverVersion()); System.out.println("Uživatelský názevDatabase: " + 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("URL databáze: " + dbmd.getURL()); System.out.println("Databáze je pouze pro čtení? " + dbmd.isReadOnly()); System.out.println("Podpora dávkových aktualizací? " + dbmd.supportsBatchUpdates()); System.out.println("Podpora savepointů? " + dbmd.supportsSavepoints()); System.out.println("Podpora Statement Pooling? " + dbmd.supportsStatementPooling()); System.out.println("Podpora uložených dat? " + dbmd.supportsStatementPooling()); System.out.println("Podpora uložených dat? " + dbmd.isReadOnly()))Procedures? " + dbmd.supportsStoredProcedures()); System.out.println("Support Outer Join? "+ dbmd.supportsOuterJoins()); } }
VÝSTUP:
Vysvětlení:
Ve výše uvedeném programu jsme použili/implementovali metody getDriverName(), getDriverVersion(), getUserName(), getDatabaseProductName(), getDatabaseProductVersion(), getStringFunctions(), getTimeDateFunctions(), getURL(), isReadOnly(), supportsBatchUpdates(), supportsStatementPooling(), supportsSavepoints(), supportsStoredProcedures() a supportsOuterJoins() v rozhraní DatabaseMetaData.
Body, které je třeba vzít na vědomí:
- Rozhraní JDBC ResultSet slouží k ukládání dat z databáze a jejich použití v našem programu v jazyce Java.
- K aktualizaci dat můžeme také použít metodu updateXXX().
- Objekt ResultSet nasměruje kurzor před první řádek výsledných dat. Pomocí metody next() můžeme iterovat po souboru ResultSet.
- Pro další pohyb v objektu ResultSet máme k dispozici navigační metody ResultSet.
- ResultMetaData slouží k získání dalších informací o souboru ResultSet, jako je název sloupce, počet sloupců, datový typ sloupce atd.
- DatabaseMetData slouží k získání informací o databázi, kterou jsme připojili.
Často kladené otázky
Q #1) K čemu slouží ResultSet?
Odpověď: Metoda ResultSet slouží k ukládání a načítání dat z DB. Po provedení metody executeQuery() vrátí objekt ResultSet. Tento objekt ResultSet můžeme použít v našem programu k provádění logických operací.
Q #2) Jak zkontrolovat, zda je ResultSet prázdný nebo ne?
Odpověď: Pro kontrolu IsResultSet Empty nejsou k dispozici žádné předdefinované metody jako length(), size(). Pro iteraci můžeme použít metodu next() a pokud vrátí True, pak není prázdný, pokud vrátí False, znamená to, že ResultSet je prázdný.
Q #3) Je možné, aby byl ResultSet nulový?
Odpověď: Ne, metoda executeQuery() vrací objekt ResultSet, který nesmí být nikdy nulový.
Q #4) Co je to aktualizovatelný ResultSet?
Odpověď: Aktualizovatelný objekt ResultSet slouží k aktualizaci dat ve sloupci, vkládání dat do sloupců a mazání řádků. Aby byl objekt ResultSet aktualizovatelný, musíme nastavit typ rolování jako citlivý nebo necitlivý a typ CONCUR jako aktualizovatelný.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
Q #5) Jak získat název připojené databáze?
Odpověď: Můžeme použít metodu getDatabaseProductName() objektu DatabaseMetaData.
Závěr
V tomto tutoriálu jsme si řekli, co jsou to rozhraní ResultSet, ResultSetMetaData a DatabaseMetaData a jejich důležité metody, které se běžně používají v programech JDBC. Také jsme si ukázali, jak aktualizovat data v DB pomocí ResultSet. ResultSetMetadata obsahují informace o ResultSet, jako je například název sloupce, počet sloupců a podobně.
DatabaseMetaData obsahuje informace o databázi.
<