In diesem Tutorial wird erklärt, wie man JDBC ResultSet zum Abrufen von Daten verwendet. Wir werden auch die Schnittstellen ResultSetMetaData und DatabaseMetaData anhand von Beispielen kennenlernen:
In der JDBC-TreiberManager Tutorium des JDBC-Lehrgangsreihe haben wir gelernt, wie man JDBC DriverManager und seine Methoden, JDBC PreparedStatement in Java-Anwendungen verwendet.
In diesem Tutorium werden wir die verbleibenden Schnittstellen in JDBC besprechen. Wir haben die Schnittstellen Statement, PreparedStatement und CallableStatement in unseren vorherigen Tutorien behandelt.
Hier lernen wir die JDBC-Schnittstellen ResultSet, ResultSetMetaData und DatabaseMetaData kennen, ihre Methoden und wie man die Methoden in Java-Programmen verwendet.
JDBC ResultSet-Schnittstelle
Die Schnittstelle ResultSet ist im java.sql-Paket enthalten. Sie wird verwendet, um die Daten zu speichern, die nach der Ausführung der SQL-Anweisungen im Java-Programm aus der Datenbanktabelle zurückgegeben werden. Das ResultSet-Objekt enthält einen Cursor, der auf die Ergebnisdaten zeigt. Standardmäßig steht der Cursor vor der ersten Zeile der Ergebnisdaten.
Die next()-Methode wird verwendet, um den Cursor vorwärts zur nächsten Position zu bewegen. Sie gibt FALSE zurück, wenn keine weiteren Datensätze vorhanden sind. Sie ruft Daten ab, indem sie die executeQuery()-Methode unter Verwendung eines beliebigen Statement-Objekts aufruft. Dabei kann es sich um ein Statement- oder PreparedStatement- oder CallableStatement-Objekt handeln. PreparedStatement- und CallableStatement-Schnittstellen sind die Unterschnittstellen von StatementSchnittstelle.
Anweisung Schnittstelle
Statement statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery("Select * from EMPLOYEE_DETAILS");
PreparedStatement-Schnittstelle
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS");
Wir können die Methode getX() verwenden, um die Daten der Spalten zu erhalten, während wir durch die Ergebnisse iterieren, wobei X - der Datentyp der Spalte ist. Wir können entweder Spaltennamen oder Index verwenden, um die Werte mit getX() Methoden zu erhalten.
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); }
Wir können auch die Indexnummer der Spalte anstelle des Spaltennamens in den getX()-Methoden angeben.
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); }
ResultSet-Typen
Standardmäßig können wir die Daten/Werte in ResultSet iterieren, die als Ausgabe der ausgeführten SQL-Anweisung in Vorwärtsrichtung zurückgegeben wurden. Wir können die Werte in andere Richtungen iterieren, indem wir Scrollable ResultSet verwenden. Wir können den Typ und die Gleichzeitigkeit von ResultSet beim Erstellen von Statement-, PreparedStatement- und CallableStatement-Objekten angeben.
Es gibt 3 Typen von ResultSet, und zwar:
- TYPE_FORWARD_ONLY: Dies ist die Standardoption, bei der sich der Cursor vom Anfang bis zum Ende bewegt, d. h. in Vorwärtsrichtung.
- TYPE_SCROLL_INSENSITIVE: Bei diesem Typ bewegt sich der Cursor sowohl vorwärts als auch rückwärts. Wenn wir während der Iteration der gespeicherten Daten Änderungen an den Daten vornehmen, werden diese nicht im Dataset aktualisiert, wenn jemand die Daten in der DB ändert. Denn das Dataset enthält die Daten ab dem Zeitpunkt, an dem die SQL-Abfrage die Daten zurückgibt.
- TYPE_SCROLL_SENSITIVE: Es ist ähnlich wie TYPE_SCROLL_INSENSITIVE, der Unterschied ist, wenn jemand die Daten aktualisiert, nachdem die SQL-Query die Daten zurückgegeben hat, während der Iteration wird es die Änderungen an den Datensatz zu reflektieren.
ErgebnisSet Gleichzeitigkeit
Es gibt 2 Arten der Gleichzeitigkeit in ResultSet, und zwar:
- ResultSet.CONCUR_READ_ONLY: Dies ist der Standard-Gleichzeitigkeitsmodus. Die Daten im ResultSet können nur gelesen werden. Aktualisierungen sind nicht möglich.
- ResultSet.CONCUR_UPDATABLE: Wir können die Daten im ResultSet-Objekt aktualisieren.
Einige Datenbanken unterstützen nicht den Gleichzeitigkeitsmodus für alle ResultSet-Typen. In diesem Fall müssen wir mit der Methode supportsResultSetConcurrency() prüfen, ob sie den gewünschten Typ und den Gleichzeitigkeitsmodus unterstützen.
Methoden der ResultSet-Schnittstelle
Es gibt 4 Kategorien von ResultSet-Methoden, und zwar:
- Methoden zur Navigation
- Getter-Methoden
- Setter-Methoden
- Verschiedene Methoden
Zunächst werden wir die Navigationsmethoden besprechen und dann weitergehen.
#1) Navigationsmethoden
Diese Methode wird verwendet, um den Cursor im Datensatz zu bewegen.
- Boolean absolute(int row): Sie wird verwendet, um den Cursor in die angegebene Zeile zu bewegen, die im Parameter angegeben ist, und gibt true zurück, wenn die Operation erfolgreich war, andernfalls false.
- Void afterLast(): Dadurch wird der ResultSet-Cursor nach der letzten Zeile bewegt.
- Void beforeFirst(): Dadurch wird der ResultSet-Cursor vor die erste Zeile gesetzt.
- Boolean first(): Er bewirkt, dass der ResultSet-Cursor in die erste Zeile springt und gibt True zurück, wenn der Vorgang erfolgreich war, andernfalls False.
- Boolean last(): Er bewirkt, dass der ResultSet-Cursor zur letzten Zeile springt und gibt True zurück, wenn der Vorgang erfolgreich war, andernfalls False.
- Boolean next(): Sie veranlasst den ResultSet-Cursor, sich zur nächsten Zeile zu bewegen und gibt True zurück, wenn es weitere Datensätze gibt, und False, wenn es keine weiteren Datensätze gibt.
- Boolean previous(): Sie bewirkt, dass der ResultSet-Cursor in die vorherige Zeile springt und gibt True zurück, wenn der Vorgang erfolgreich war, andernfalls False.
- Boolean relative(): Sie bewegt den Cursor um die angegebene Anzahl von Zeilen entweder vorwärts oder rückwärts.
- Int getRow(): Sie gibt die aktuelle Zeilennummer zurück, auf die das ResultSet-Objekt gerade zeigt.
- Void moveToCurrentRow(): Er bewegt den Cursor zurück in die aktuelle Zeile, wenn er sich gerade in der Einfügezeile befindet.
- Void moveToInsertRow(): Sie bewegt den Cursor zu einer bestimmten Zeile, um die Zeile in die Datenbank einzufügen. Sie merkt sich die aktuelle Position des Cursors. Wir können also die Methode moveToCurrentRow() verwenden, um den Cursor nach dem Einfügen in die aktuelle Zeile zu bewegen.
In diesem Tutorial sind alle Programme in Java geschrieben, wir haben die Version Java 8 und Oracle DB verwendet.
Sie können die Oracle-Software von hier herunterladen
Sie können die Java-Version 8 von hier herunterladen
Die Java-Installation wird Schritt für Schritt durchgeführt.
JDBC ResultSet Beispielprogramm:(Verwendung von Navigationsmethoden)
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"); //Verbinden mit Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:X E")) { //Erzeugen des DatabaseMetaData-Objekts DatabaseMetaData dbmd = conn.getMetaData(); //Prüfen, ob der Treiber scrollsensitive type und concur updatable unterstützt boolean isSupportResultSetType =dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Erstellen einer vorbereiteten Anweisung PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(); //Verschieben des Cursors auf die erste Zeile 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("Der Cursor zeigt auf vor der ersten Zeile. Verwenden Sie next(), um sich vorwärts zu bewegen"); //Verschieben des Cursors auf die erste Zeile mit next() rs.next(); System.out.println("ERSTE ZEILE \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Verschieben des Cursors auf die letzte Zeile rs.afterLast(); System.out.println("Cursoruse previous() to move in backward direction"); //Verschieben des Cursors auf die letzte Zeile mit previous() rs.previous(); System.out.println("LAST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Verschieben des Cursors auf die dritte Zeile rs.absolute(3); System.out.println("Cursor zeigt auf 3rdrow"); System.out.println("THIRD ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Verschieben des Cursors auf die vorherige Zeile der dritten Zeile rs.relative(-1); System.out.println("Cursor zeigt auf die 1 Zeile vor der dritten Zeile"); System.out.println("Second ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+rs.getString(2)+"\n VORNAME = " + rs.getString(3)); /Verschieben des Cursors auf die vierte Zeile nach der zweiten Zeile rs.relative(4); System.out.println("Cursor zeigt auf die vierte Zeile nach der zweiten Zeile"); System.out.println("SECHSTE ZEILE \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n VORNAME = " + rs.getString(3)); /Verschieben des Cursors auf die aktuelle ZeileSystem.out.println(" Aktuelle Zeile = " + rs.getRow()); } } } catch (SQLException e) { e.printStackTrace(); } } }
OUTPUT:
Daten in der Tabelle Employee_details
Erläuterung:
Im obigen Programm haben wir die Methoden first(), last(), beforeFirst(), afterLast(), next(), previous(), absolute(), relative() und getRow() in ResultSet implementiert. Um diese Methoden zu verwenden, setzen wir die Werte ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE in der Methode prepareStatement.
Als nächstes werden wir besprechen, was die Getter-Methoden in ResultSet sind:
#2) Getter-Methoden
ResultSet hat die Daten der Tabelle aus der Datenbank gespeichert. Getter-Methoden werden verwendet, um die Werte der Tabelle in ResultSet zu erhalten. Dafür müssen wir entweder den Spaltenindexwert oder den Spaltennamen übergeben.
Im Folgenden werden die Getter-Methoden in ResultSet beschrieben:
- int getInt(int ColumnIndex): Sie wird verwendet, um den Wert der angegebenen Spalte Index als Datentyp int zu erhalten.
- float getFloat(int ColumnIndex): Sie wird verwendet, um den Wert der angegebenen Spalte Index als Float-Datentyp zu erhalten.
- java.sql.date getDate(int ColumnIndex): Sie wird verwendet, um den Wert der angegebenen Spalte Index als Datumswert zu erhalten.
- int getInt(String ColumnName): Sie wird verwendet, um den Wert der angegebenen Spalte als Datentyp int zu erhalten.
- float getFloat(String ColumnName): Sie wird verwendet, um den Wert der angegebenen Spalte als Float-Datentyp zu erhalten.
- Java.sql.date getDate(String ColumnName): Sie wird verwendet, um den Wert der angegebenen Spalte als Datumswert zu erhalten.
Es gibt Getter-Methoden für alle primitiven Datentypen (Boolean, long, double) und String auch in ResultSet-Schnittstelle. Wir können ein Array und binären Typ von Daten auch aus der Datenbank erhalten. Es hat Methoden auch für das.
#3) Setter/Updater-Methoden
Wir können den Wert in der Datenbank mit ResultSet Updater-Methoden aktualisieren. Es ist ähnlich wie Getter-Methoden, aber hier müssen wir die Werte / Daten für die bestimmte Spalte in der Datenbank zu aktualisieren übergeben.
Im Folgenden werden die Aktualisierungsmethoden in ResultSet beschrieben:
- void updateInt(int ColumnIndex, int Value): Sie wird verwendet, um den Wert der angegebenen Spalte Index mit einem int-Wert zu aktualisieren.
- void updateFloat(int ColumnIndex, float f): Sie wird verwendet, um den Wert der angegebenen Spalte Index mit dem Float-Wert zu aktualisieren.
- void updateDate(int ColumnIndex, Date d): Sie wird verwendet, um den Wert der angegebenen Spalte Index mit dem Datumswert zu aktualisieren.
- void updateInt(String ColumnName, int Value): Sie wird verwendet, um den Wert der angegebenen Spalte mit dem angegebenen int-Wert zu aktualisieren.
- void updateFloat(String ColumnName, float f): Sie wird verwendet, um den Wert der angegebenen Spalte mit dem angegebenen Float-Wert zu aktualisieren.
- Java.sql.date getDate(String ColumnName): Sie wird verwendet, um den Wert der angegebenen Spalte mit dem angegebenen Datumswert zu aktualisieren.
Es gibt Updater-Methoden für alle primitiven Datentypen (Boolean, long, double) und String auch in ResultSet-Schnittstelle.
Updater-Methoden aktualisieren lediglich die Daten im ResultSet-Objekt. Die Werte werden in der DB nach dem Aufruf der insertRow- oder updateRow-Methode aktualisiert.
Aktualisieren einer Zeile:
Wir können die Daten in einer Zeile aktualisieren, indem wir die updateX()-Methode aufrufen und den Spaltennamen oder den Index und die zu aktualisierenden Werte übergeben. Wir können jeden Datentyp anstelle von X in der updateX-Methode verwenden. Bis jetzt haben wir die Daten im ResultSet-Objekt aktualisiert. Um die Daten in der DB zu aktualisieren, müssen wir die updateRow()-Methode aufrufen.
Einfügen einer Zeile:
Wir müssen moveToInsertRow() verwenden, um den Cursor zum Einfügen einer neuen Zeile zu bewegen. Wir haben dies bereits im Abschnitt Navigationsmethoden behandelt. Als nächstes müssen wir die Methode updateX() aufrufen, um die Daten zur Zeile hinzuzufügen. Wir sollten Daten für alle Spalten bereitstellen, da sonst der Standardwert der jeweiligen Spalte verwendet wird.
Nach der Aktualisierung der Daten müssen wir die Methode insertRow() aufrufen und dann die Methode moveToCurrentRow() verwenden, um die Cursorposition auf die Zeile zurückzusetzen, in der wir uns vor dem Einfügen einer neuen Zeile befanden.
ResultSet Beispiel:
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"); //Verbindung zur Oracle DB herstellen try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { //DatenbankMetaData-Objekt erstellen DatabaseMetaData dbmd = conn.getMetaData();//Prüfen, ob der Treiber scroll-insensitive und concur-aktualisierbare Typen unterstützt boolean isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Erstellen von PreparedStatement PreparedStatement pstatemnt1 =conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(select_query); //Verschieben des Cursors auf den Punkt letzte Zeile der Tabelle 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)); // Festlegen der Werte, die in die Tabelle EMPLOYEE_DETAILS eingefügt werden sollen //Bewegen des Cursors, um eine Zeile in die Tabelle einzufügen rs.moveToInsertRow(); //Aktualisieren des Werts EMPNUM rs.updateInt(1, 1017); //Aktualisieren des Werts LAST NAME rs.updateString(2, "Bond"); //Aktualisieren des Werts FIRST NAME rs.updateString(3, "James"); //Einfügen einer neuen Zeile rs.insertRow();//Verschieben des Cursors zum Punkt der 5. Zeile rs.absolute(5); System.out.println("Befor Aktualisieren der EMP NUM der 5. Zeile"); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); System.out.println(" Aktualisieren der EMP id der 5.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: 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(); } }}
OUTPUT:
Erläuterung:
Im obigen Programm haben wir zunächst die Daten der Tabelle Employee_details mit der SELECT-Abfrage im ResultSet-Objekt gespeichert und dann die Daten der letzten Zeile in der Tabelle Employee_details mit der last()-Methode von ResultSet angezeigt. Die moveToInsertRow()-Methode bewirkt, dass der Cursor auf die aktuelle Zeile zeigt, die nun die letzte Zeile ist.
updateXXX()-Methoden werden verwendet, um die Werte in der Zeile zu aktualisieren, und die insertRow()-Methode hat die Daten in eine neue Zeile eingefügt. Mit der absolute()-Methode haben wir den Cursor auf die 5. Zeile gesetzt. Die updateInt()-Methode wurde verwendet, um die EMPNUM mit einer neuen ID des 5. Angestellten in der Tabelle zu aktualisieren. Danach wurden die Daten angezeigt, um zu überprüfen, ob die EMPNUM aktualisiert wurde oder nicht.
Der Cursor wurde mit last() auf die letzte Zeile der Tabelle gesetzt und angezeigt. Um die obige Logik auszuführen, müssen wir in der Methode prepareStatement die Werte ResultSet.TYPE_SCROLL_INSENSITIVE und ResultSet.CONCUR_UPDATABLE festlegen.
#4) Verschiedene Methoden
- void close(): Sie wird verwendet, um die ResultSet-Instanz zu schließen und die mit der ResultSet-Instanz verbundenen Ressourcen freizugeben.
- ResultSetMetaData getMetaData(): Sie gibt die ResultSetMetaData-Instanz zurück. Sie enthält Informationen über den Typ und die Eigenschaften der Spalten der Abfrageausgabe. Im nächsten Abschnitt werden wir mehr über ResultSetMetaData erfahren.
ResultSetMetaData
Was sind Metadaten?
Metadaten sind Daten über Daten. Über diese Schnittstelle erhalten wir weitere Informationen über ResultSet. Sie ist im java.sql-Paket verfügbar. Jedes ResultSet-Objekt ist mit einem ResultSetMetaData-Objekt verbunden.
Dieses Objekt enthält Details zu den Eigenschaften der Spalten wie Datentyp der Spalte, Spaltenname, Anzahl der Spalten, Tabellenname, Schemaname usw. Wir können das ResultSetMetaData-Objekt mit der Methode getMetaData() von ResultSet erhalten.
Syntax der ResultSetMetaData:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS"); ResultSetMetaData rsmd = rs.getMetaData();
Wichtige Methoden der ResultSetMetaData-Schnittstelle:
Name der Methode | Beschreibung |
---|---|
String getColumnName(int column) | Sie gibt den Spaltennamen der jeweiligen Spalte zurück |
String getColumnTypeName(int column) | Sie gibt den Datentyp der bestimmten Spalte zurück, die wir als Parameter übergeben haben |
String getTableName(int column) | Sie gibt den Tabellennamen der Spalte |
String getSchemaName(int column) | Sie gibt den Schemanamen der Tabelle der Spalte zurück |
int getColumnCount() | Sie gibt die Anzahl der Spalten des ResultSet zurück |
boolean isAutoIncrement(int Column) | Gibt true zurück, wenn die angegebene Spalte Auto Increment ist, sonst false |
boolean isCaseSensitive(int Column) | Es gibt true zurück, wenn die angegebene Spalte Case Sensitive ist, sonst false |
ResultSetMetaData Beispiel
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(" Wir verwenden ResultSetMetaData ");System.out.println("Anzahl: der Spalten: "+ rsmd.getColumnCount()); System.out.println("Spaltenname der Spalte 1: "+ rsmd.getColumnName(1)); System.out.println("Datentyp der Spalte 2: " + rsmd.getColumnTypeName(2)); System.out.println("Tabellenname der Spalte 1: " + rsmd.getTableName(1)); System.out.println("Schemaname der Spalte 1: " + rsmd.getSchemaName(1)); } } }
OUTPUT:
Erläuterung:
Im obigen Programm haben wir die Methoden getColumnCount(), getColumnName(), getColumnTypeName(), getTableName() und getSchemaName() in der Schnittstelle ResultSetMetaData implementiert.
DatenbankMetaDaten
Die DatabaseMetaData-Schnittstelle liefert Informationen über die Datenbank wie DatabaseName, Datenbankversion usw.
Wichtige Methoden der DatabaseMetaData-Schnittstelle:
Name der Methode | Beschreibung |
---|---|
String getDriverName() | Sie gibt den Namen des JDBC-Treibers zurück, den wir in unserem Java-Programm verwenden |
String getDriverVersion() | Sie gibt die Versionsnummer des JDBC-Treibers zurück |
String getUserName() | Es gibt den Benutzernamen der Datenbank zurück, die wir verwenden |
String getDatabaseProductName() | Es gibt den Namen der Datenbank zurück, die wir verwenden |
String getDatabaseProductVersion() | Sie gibt die Versionsnummer der Datenbank zurück, die wir verwenden |
ErgebnisSet getSchemas() | Sie gibt die Namen der Schemas zurück, die in der verbundenen Datenbank verfügbar sind |
String getStringFunctions() | Gibt die Liste der in der verbundenen Datenbank verfügbaren String-Funktionen zurück |
String getTimeDateFunctions() | Gibt die Liste der Zeit- und Datumsfunktionen zurück, die in der verbundenen Datenbank verfügbar sind |
String getURL() | Sie gibt die URL für die Datenbank zurück |
Boolean isReadOnly() | Gibt zurück, ob die Datenbank im Nur-Lese-Modus ist. |
Boolean supportsBatchUpdates() | Gibt zurück, ob die Datenbank Batch-Updates unterstützt. |
Boolean supportsSavepoints() | Sie gibt zurück, ob die Datenbank Savepoints unterstützt. |
Boolean unterstütztStatementPooling() | Sie gibt zurück, ob die Datenbank Statement Pooling unterstützt. |
Boolean supportsStoredProcedures() | Sie gibt zurück, ob die Datenbank Stored Procedures unterstützt. |
Boolean supportsOuterJoins() | Sie gibt zurück, ob die Datenbank Outer Join unterstützt. |
Hier haben wir einige wichtige Methoden der DatabaseMetaData-Schnittstelle aufgelistet. Sie können auf der offiziellen Seite der Oracle wo Sie alle in der DatabaseMetaData-Schnittstelle verfügbaren Methoden sehen können.
DatabaseMetaData Beispiel:
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 theDatenbank: " + dbmd.getUserName()); System.out.println("Datenbank-Produktname:" + dbmd.getDatabaseProductName()); System.out.println("Datenbank-Produktversion: " + dbmd.getDatabaseProductVersion()); System.out.println("Liste der String-Funktionen in der Datenbank: " + dbmd.getStringFunctions()); System.out.println("Liste der Zeit- & Datumsfunktionen in der Datenbank: " + dbmd.getTimeDateFunctions());System.out.println("URL der Datenbank: " + dbmd.getURL()); System.out.println("Datenbank ist nur lesbar? " +dbmd.isReadOnly()); System.out.println("Unterstützt Batch-Updates? " + dbmd.supportsBatchUpdates()); System.out.println("Unterstützt Savepoints? " + dbmd.supportsSavepoints()); System.out.println("Unterstützt Statement Pooling? "+ dbmd.supportsStatementPooling()); System.out.println("Unterstützt StoredProcedures?" + dbmd.supportsStoredProcedures()); System.out.println("Support Outer Join? "+ dbmd.supportsOuterJoins()); } }
OUTPUT:
Erläuterung:
Im obigen Programm haben wir die Methoden getDriverName(), getDriverVersion(), getUserName(), getDatabaseProductName(), getDatabaseProductVersion(), getStringFunctions(), getTimeDateFunctions(), getURL(), isReadOnly(), supportsBatchUpdates(), supportsStatementPooling(), supportsSavepoints(), supportsStoredProcedures() und supportsOuterJoins() in der DatabaseMetaData-Schnittstelle verwendet/implementiert.
Zu beachtende Punkte:
- Die JDBC ResultSet-Schnittstelle wird verwendet, um die Daten aus der Datenbank zu speichern und sie in unserem Java-Programm zu verwenden.
- Wir können auch ResultSet verwenden, um die Daten mit updateXXX()-Methoden zu aktualisieren.
- ResultSet-Objekt zeigt den Cursor vor der ersten Zeile der Ergebnisdaten. Mit der next()-Methode können wir durch das ResultSet iterieren.
- Wir haben Navigationsmethoden von ResultSet, um uns weiter im ResultSet-Objekt zu bewegen
- ResultMetaData wird verwendet, um weitere Informationen über das ResultSet zu erhalten, wie z. B. den Spaltennamen, die Anzahl der Spalten, den Datentyp der Spalte, usw.
- DatabaseMetData wird verwendet, um Informationen über die Datenbank zu erhalten, die wir verbunden haben
Häufig gestellte Fragen
F #1) Wozu dient das ResultSet?
Antwort: ResultSet wird verwendet, um die Daten aus der DB zu speichern und abzurufen. Wenn die Methode executeQuery() ausgeführt wurde, gibt sie das ResultSet-Objekt zurück. Wir können dieses ResultSet-Objekt in unserem Programm verwenden, um die Logik auszuführen.
F #2) Wie kann man überprüfen, ob das ResultSet leer ist oder nicht?
Antwort: Es gibt keine vordefinierten Methoden wie length(), size(), um IsResultSet Empty zu überprüfen. Wir können die next()-Methode verwenden, um zu iterieren, und wenn sie True zurückgibt, dann ist sie nicht leer, wenn sie False zurückgibt, bedeutet dies, dass das ResultSet leer ist.
F #3) Ist es möglich, dass ResultSet null sein kann?
Antwort: Nein, die Methode executeQuery() gibt das ResultSet-Objekt zurück, das niemals null sein darf.
F #4) Was ist ein aktualisierbares ResultSet?
Antwort: Ein aktualisierbares ResultSet-Objekt wird verwendet, um die Daten in der Spalte zu aktualisieren, Daten in Spalten einzufügen und Zeilen zu löschen. Um ein ResultSet zu einem aktualisierbaren Objekt zu machen, müssen wir den Scroll-Typ als sensitiv oder unsensitiv und den CONCUR-Typ als aktualisierbar festlegen.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
F #5) Wie erhalte ich den Namen der Datenbank, die verbunden wurde?
Antwort: Wir können die Methode getDatabaseProductName() des DatabaseMetaData-Objekts verwenden.
Schlussfolgerung
In diesem Tutorial haben wir besprochen, was die Schnittstellen ResultSet, ResultSetMetaData und DatabaseMetaData sind und ihre wichtigen Methoden, die häufig in JDBC-Programmen verwendet werden. Wir haben auch gesehen, wie man Daten in DB mit ResultSet aktualisiert. ResultSetMetadata enthält Informationen über ResultSet wie Spaltenname, Spaltenanzahl usw.
DatabaseMetaData enthält Datenbankinformationen.
<