jdbc resultset how use java resultset retrieve data
Questo tutorial spiega come utilizzare JDBC ResultSet per recuperare i dati. Impareremo anche le interfacce ResultSetMetaData e DatabaseMetaData con esempi:
Nel JDBC DriverManager tutorial di Serie di tutorial JDBC , abbiamo imparato a utilizzare JDBC DriverManager ei suoi metodi, JDBC PreparedStatement nelle applicazioni Java.
In questo tutorial, discuteremo le restanti interfacce in JDBC. Abbiamo trattato le interfacce Statement, PreparedStatement e CallableStatement nei nostri tutorial precedenti.
Qui apprenderemo le interfacce JDBC ResultSet, ResultSetMetaData e DatabaseMetaData, i loro metodi e come utilizzare i metodi nel programma Java.
Cosa imparerai:
Interfaccia ResultSet JDBC
L'interfaccia ResultSet è presente nel pacchetto java.sql. Viene utilizzato per memorizzare i dati restituiti dalla tabella del database dopo l'esecuzione delle istruzioni SQL nel programma Java. L'oggetto di ResultSet mantiene il punto del cursore sui dati del risultato. Per impostazione predefinita, il cursore si posiziona prima della prima riga dei dati del risultato.
Il metodo next () viene utilizzato per spostare il cursore nella posizione successiva in avanti. Restituirà FALSE se non ci sono più record. Recupera i dati chiamando il metodo executeQuery () utilizzando uno qualsiasi degli oggetti istruzione. Può essere un oggetto Statement o PreparedStatement o CallableStatement. Le interfacce PreparedStatement e CallableStatement sono le interfacce secondarie dell'interfaccia Statement.
Interfaccia delle istruzioni
Statement statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
Interfaccia PreparedStatement
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
Possiamo usare il metodo getX () per ottenere i dati delle colonne durante l'iterazione dei risultati dove X - è il tipo di dati della colonna. Possiamo usare i nomi delle colonne o l'indice per ottenere i valori utilizzando i metodi 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); }
Possiamo anche menzionare il numero di indice della colonna invece del nome della colonna nei metodi 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); }
Tipi di ResultSet
Di default, possiamo iterare i dati / valori in ResultSet che sono stati restituiti come output dell'istruzione SQL eseguita nella direzione in avanti. Possiamo iterare i valori in altre direzioni utilizzando il ResultSet scorrevole. È possibile specificare il tipo e la concorrenza di ResultSet durante la creazione di oggetti Statement, PreparedStatement e CallableStatement.
Ci sono 3 tipi in ResultSet. Sono:
- TYPE_FORWARD_ONLY: È l'opzione predefinita, dove il cursore si sposta dall'inizio alla fine, cioè nella direzione in avanti.
- TYPE_SCROLL_INSENSITIVE: In questo tipo, farà muovere il cursore sia in avanti che indietro. Se apportiamo modifiche ai dati durante l'iterazione dei dati memorizzati, non si aggiornerà nel set di dati se qualcuno modifica i dati nel DB. Perché il set di dati contiene i dati dal momento in cui la query SQL restituisce i dati.
- TYPE_SCROLL_SENSITIVE: È simile a TYPE_SCROLL_INSENSITIVE, la differenza è se qualcuno aggiorna i dati dopo che la query SQL ha restituito i dati, mentre l'iterazione rifletterà le modifiche al set di dati.
ResultSet Concurrency
Esistono 2 modalità di concorrenza in ResultSet. Sono:
- ResultSet.CONCUR_READ_ONLY: È la modalità simultanea predefinita. Possiamo solo leggere i dati nel ResultSet. L'aggiornamento non è applicabile.
- ResultSet.CONCUR_UPDATABLE: Possiamo aggiornare i dati nell'oggetto ResultSet.
Alcuni database non supportano la modalità di concorrenza per tutti i tipi di ResultSet. In tal caso, dobbiamo verificare se supportano il tipo e la modalità di concorrenza desiderati utilizzando il metodo supportsResultSetConcurrency ().
Metodi nell'interfaccia ResultSet
Esistono 4 categorie di metodi ResultSet. Sono:
- Metodi di navigazione
- Metodi Getter
- Metodi setter
- Metodi vari
In primo luogo, discuteremo i metodi di navigazione e poi ci sposteremo oltre.
# 1) Metodi di navigazione
Questo metodo viene utilizzato per spostare il cursore nel set di dati.
- Booleano assoluto (int riga): Viene utilizzato per spostare il cursore sulla riga specificata menzionata nel parametro e restituire true se l'operazione ha successo altrimenti restituire false.
- Void afterLast (): Fa in modo che il cursore ResultSet si sposti dopo l'ultima riga.
- Void beforeFirst (): Fa in modo che il cursore ResultSet si sposti prima della prima riga.
- Boolean first (): Fa spostare il cursore ResultSet sulla prima riga. Restituisce True se l'operazione è riuscita altrimenti False.
- Boolean last (): Fa in modo che il cursore ResultSet si sposti sull'ultima riga. Restituisce True se l'operazione è riuscita altrimenti False.
- Booleano successivo (): Fa in modo che il cursore ResultSet si sposti alla riga successiva. Restituisce True se ci sono più record e False se non ci sono più record.
- Booleano precedente (): Fa in modo che il cursore ResultSet si sposti alla riga precedente. Restituisce True se l'operazione è riuscita altrimenti False.
- Parente booleano (): Sposta il cursore sul numero di righe specificato in avanti o indietro.
- Int getRow (): Restituisce il numero di riga corrente a cui punta ora l'oggetto ResultSet.
- Void moveToCurrentRow (): Sposta il cursore di nuovo sulla riga corrente se è attualmente nella riga di inserimento.
- Void moveToInsertRow (): Sposta il cursore sulla riga specifica per inserire la riga nel database. Ricorda la posizione corrente del cursore. Quindi possiamo usare il metodo moveToCurrentRow () per spostare il cursore sulla riga corrente dopo l'inserimento.
In questo tutorial, tutti i programmi sono scritti in Java. Abbiamo utilizzato la versione Java 8 e Oracle DB.
>> È possibile scaricare il software Oracle da Qui
>> È possibile scaricare la versione 8 di Java da Qui
Ha il processo di installazione Java passo passo.
Programma di esempio ResultSet JDBC: (utilizzando metodi di navigazione)
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 * from employee_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 the driver supports scroll sensitive type and concur updatable boolean isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Creating prepared Statement PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(); //Moving the cursor to point first row rs.first(); System.out.println('FIRST ROW
EMP NUM = ' + rs.getInt('empNum') + '
LAST NAME = '+ rs.getString(2)+'
FIRST NAME = ' + rs.getString(3)); //Moving the cursor to point last row rs.last(); System.out.println('LAST ROW
EMP NUM = ' + rs.getInt('empNum') + '
LAST NAME = '+ rs.getString(2)+'
FIRST NAME = ' + rs.getString(3)); //Moving the cursor to point before first row rs.beforeFirst(); System.out.println('Cursor is pointing at before the first row. Use next() to move in forward direction'); //Moving the cursor to point first row using next() rs.next(); System.out.println('FIRST ROW
EMP NUM = ' + rs.getInt('empNum') + '
LAST NAME = '+ rs.getString(2)+'
FIRST NAME = ' + rs.getString(3)); //Moving the cursor to point after last row rs.afterLast(); System.out.println('Cursor is pointing at after the last row. Use previous() to move in backward direction'); //Moving the cursor to point last row using previous() rs.previous(); System.out.println('LAST ROW
EMP NUM = ' + rs.getInt('empNum') + '
LAST NAME = '+ rs.getString(2)+'
FIRST NAME = ' + rs.getString(3)); //Moving the cursor to point third row rs.absolute(3); System.out.println('Cursor is pointing at 3rd row'); System.out.println('THIRD ROW
EMP NUM = ' + rs.getInt('empNum') + '
LAST NAME = '+ rs.getString(2)+'
FIRST NAME = ' + rs.getString(3)); //Moving the cursor to point previous row of third row rs.relative(-1); System.out.println('Cursor is pointing to the 1 row previous to the 3rd row'); System.out.println('Second ROW
EMP NUM = ' + rs.getInt('empNum') + '
LAST NAME = '+ rs.getString(2)+'
FIRST NAME = ' + rs.getString(3)); //Moving the cursor to point 4th row after the 2nd row rs.relative(4); System.out.println('Cursor is pointing to the 4th row after the 2nd row'); System.out.println('SIXTH ROW
EMP NUM = ' + rs.getInt('empNum') + '
LAST NAME = '+ rs.getString(2)+'
FIRST NAME = ' + rs.getString(3)); //Moving the cursor to point current row System.out.println(' Current Row = ' + rs.getRow()); } } catch (SQLException e) { e.printStackTrace(); } } }
PRODUZIONE:
Dati nella tabella Employee_details
Spiegazione:
Nel programma precedente abbiamo implementato i metodi first (), last (), beforeFirst (), afterLast (), next (), previous (), absolute (), relative () e getRow () in ResultSet. Per utilizzare questi metodi, impostiamo i valori ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE nel metodo prepareStatement.
Successivamente, discuteremo quali sono i metodi Getter in ResultSet:
# 2) Metodi Getter
ResultSet ha memorizzato i dati della tabella dal database. I metodi getter vengono utilizzati per ottenere i valori della tabella in ResultSet. Per questo, dobbiamo passare il valore dell'indice della colonna o il nome della colonna.
Di seguito sono riportati i metodi getter in ResultSet:
- int getInt (int ColumnIndex): Viene utilizzato per ottenere il valore della colonna Index specificata come tipo di dati int.
- float getFloat (int ColumnIndex): Viene utilizzato per ottenere il valore della colonna Index specificata come tipo di dati float.
- java.sql.date getDate (int ColumnIndex): Viene utilizzato per ottenere il valore dell'indice di colonna specificato come valore di data.
- int getInt (String ColumnName): Viene utilizzato per ottenere il valore della colonna specificata come tipo di dati int.
- float getFloat (String ColumnName): Viene utilizzato per ottenere il valore della colonna specificata come tipo di dati float.
- Java.sql.date getDate (String ColumnName): Viene utilizzato per ottenere il valore della colonna specificata come valore di data.
Esistono metodi getter per tutti i tipi di dati primitivi (Boolean, long, double) e String anche nell'interfaccia ResultSet. Possiamo ottenere dati di tipo array e binario anche dal database. Ha metodi anche per quello.
# 3) Metodi di settaggio / aggiornamento
È possibile aggiornare il valore nel database utilizzando i metodi di aggiornamento di ResultSet. È simile ai metodi Getter, ma qui è necessario passare i valori / dati per la particolare colonna da aggiornare nel database.
Di seguito sono riportati i metodi di aggiornamento in ResultSet:
- void updateInt (int ColumnIndex, int Value): Viene utilizzato per aggiornare il valore della colonna Index specificata con un valore int.
- void updateFloat (int ColumnIndex, float f): Viene utilizzato per aggiornare il valore della colonna Index specificata con il valore float.
- void updateDate (int ColumnIndex, Date d): Viene utilizzato per aggiornare il valore dell'indice di colonna specificato con il valore della data.
- void updateInt (String ColumnName, int Value): Viene utilizzato per aggiornare il valore della colonna specificata con il valore int dato.
- void updateFloat (String ColumnName, float f): Viene utilizzato per aggiornare il valore della colonna specificata con il valore float specificato.
- Java.sql.date getDate (String ColumnName): Viene utilizzato per aggiornare il valore della colonna specificata con il valore di data specificato.
Esistono metodi di aggiornamento per tutti i tipi di dati primitivi (booleano, lungo, doppio) e stringa anche nell'interfaccia ResultSet.
I metodi di aggiornamento aggiornano semplicemente i dati nell'oggetto ResultSet. I valori verranno aggiornati nel DB dopo aver chiamato il metodo insertRow o updateRow.
Aggiornamento di una riga:
Possiamo aggiornare i dati in una riga chiamando i metodi updateX (), passando il nome o l'indice della colonna e i valori da aggiornare. Possiamo usare qualsiasi tipo di dati al posto di X nel metodo updateX. Fino ad ora, abbiamo aggiornato i dati nell'oggetto ResultSet. Per aggiornare i dati nel DB, dobbiamo chiamare il metodo updateRow ().
Inserimento di una riga:
Dobbiamo usare moveToInsertRow () per spostare il cursore e inserire una nuova riga. Lo abbiamo già trattato nella sezione Metodi di navigazione. Successivamente, dobbiamo chiamare il metodo updateX () per aggiungere i dati alla riga. Dovremmo fornire i dati per tutte le colonne altrimenti utilizzerà il valore predefinito di quella particolare colonna.
Dopo aver aggiornato i dati, dobbiamo chiamare il metodo insertRow (). Quindi utilizzare il metodo moveToCurrentRow (), per riportare la posizione del cursore sulla riga in cui ci trovavamo prima di iniziare a inserire una nuova riga.
Esempio di 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 the 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 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(select_query); //Moving the 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('
EMP NUM = ' + rs.getInt('empNum') + '
LAST NAME = '+ rs.getString(2)+'
FIRST NAME = ' + rs.getString(3)); // Setting the values to insert in the EMPLOYEE_DETAILS Table //Moving the cursor to point insert a row to table rs.moveToInsertRow(); //Update EMPNUM value rs.updateInt(1, 1017); //Update LAST NAME value rs.updateString(2, 'Bond'); //Update FIRST NAME value rs.updateString(3, 'James'); //Insert a new row rs.insertRow(); //Moving the cursor to point 5th row rs.absolute(5); System.out.println('Befor Updating EMPNUM of the 5th ROW'); System.out.println('
EMP NUM = ' + rs.getInt('empNum') + '
LAST NAME = '+ rs.getString(2)+'
FIRST NAME = ' + rs.getString(3)); System.out.println(' Updating EMP id of the 5th EMPLOYEE'); //Updating EMPNUM of 5th row rs.updateInt(1,3005); rs.updateRow(); System.out.println('
EMP NUM = ' + rs.getInt('empNum') + '
LAST NAME = '+ rs.getString(2)+'
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('
EMP NUM = ' + rs.getInt('empNum') + '
LAST NAME = '+ rs.getString(2)+'
FIRST NAME = ' + rs.getString(3)); } } catch (SQLException e) { e.printStackTrace(); } } }
PRODUZIONE:
Spiegazione:
Nel programma precedente ciò che abbiamo fatto è innanzitutto, abbiamo memorizzato i dati della tabella Employee_details nell'oggetto ResultSet utilizzando la query SELECT. Quindi, abbiamo visualizzato i dati dell'ultima riga nella tabella Employee_details utilizzando il metodo last () di ResultSet. Il metodo moveToInsertRow () fa in modo che il cursore punti la riga corrente, ora la riga corrente è l'ultima riga.
I metodi updateXXX () utilizzati per aggiornare i valori nella riga e il metodo insertRow () ha inserito i dati in una nuova riga. Usando il metodo absolute (), abbiamo fatto in modo che il cursore punti al 5thriga. Il metodo UpdateInt () è stato utilizzato per aggiornare EMPNUM con un nuovo ID 5thdipendente nella tabella. Successivamente, visualizzati i dati per verificare se EMPNUM è aggiornato o meno.
Ha fatto in modo che il cursore punti l'ultima riga della tabella usando last () e l'ha visualizzata. Per eseguire la logica precedente, è necessario impostare i valori ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE nel metodo prepareStatement.
# 4) Metodi vari
- void close (): Viene utilizzato per chiudere l'istanza ResultSet e liberare le risorse associate all'istanza ResultSet.
- ResultSetMetaData getMetaData (): Restituisce l'istanza ResultSetMetaData. Contiene le informazioni sul tipo e la proprietà delle colonne dell'output della query. Impareremo di più su ResultSetMetaData nella prossima sezione.
ResultSetMetaData
Cosa sono i metadati?
Per metadati si intendono i dati sui dati. Utilizzando questa interfaccia, otterremo maggiori informazioni su ResultSet. È disponibile nel pacchetto java.sql. Ogni oggetto ResultSet è associato a un oggetto ResultSetMetaData.
Questo oggetto avrà i dettagli delle proprietà delle colonne come il tipo di dati della colonna, il nome della colonna, il numero di colonne, il nome della tabella, il nome dello schema, ecc. Possiamo ottenere l'oggetto ResultSetMetaData utilizzando il metodo getMetaData () di ResultSet.
Sintassi di ResultSetMetaData:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”); ResultSetMetaData rsmd = rs.getMetaData();
Metodi importanti dell'interfaccia ResultSetMetaData:
Nome metodo | Descrizione |
---|---|
booleano isCaseSensitive (int Column) | Restituisce vero se la colonna data fa distinzione tra maiuscole e minuscole, altrimenti false |
String getColumnName (int colonna) | Restituisce il nome della colonna della particolare colonna |
String getColumnTypeName (int colonna) | Restituisce il tipo di dati della particolare colonna che abbiamo passato come parametro |
String getTableName (int colonna) | Restituisce il nome della tabella della colonna |
String getSchemaName (int colonna) | Restituisce il nome dello schema della tabella della colonna |
int getColumnCount () | Restituisce il numero di colonne del ResultSet |
booleano isAutoIncrement (int Column) | Restituisce vero se la colonna data è Incremento automatico, altrimenti falso |
ResultSetMetaData Esempio
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 * from employee_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('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)); } } }
PRODUZIONE:
Spiegazione:
buon blocco pop-up per Chrome
Nel programma sopra, abbiamo implementato i metodi getColumnCount (), getColumnName (), getColumnTypeName (), getTableName () e getSchemaName () nell'interfaccia ResultSetMetaData.
DatabaseMetaData
L'interfaccia DatabaseMetaData fornisce informazioni sul database come DatabaseName, versione del database e così via.
Metodi importanti dell'interfaccia DatabaseMetaData:
Nome metodo | Descrizione |
---|---|
String getStringFunctions () | Restituisce l'elenco delle funzioni stringa disponibili nel Database connesso |
String getDriverName () | Restituirà il nome del driver JDBC che stiamo utilizzando nel nostro programma Java |
String getDriverVersion () | Restituisce il numero di versione del driver JDBC |
String getUserName () | Restituisce il nome utente del database che stiamo utilizzando |
String getDatabaseProductName () | Restituisce il nome del database che stiamo utilizzando |
String getDatabaseProductVersion () | Restituisce il numero di versione del database che stiamo utilizzando |
ResultSet getSchemas () | Restituisce i nomi degli schemi disponibili nel Database connesso |
String getTimeDateFunctions () | Restituisce l'elenco delle funzioni di data e ora disponibili nel database connesso |
String getURL () | Restituisce l'URL per il database |
Boolean isReadOnly () | Restituisce se il database è in modalità di sola lettura |
Boolean supportsBatchUpdates () | Restituisce se il database supporta gli aggiornamenti batch |
Boolean supportsSavepoints () | Restituisce se il database supporta i punti di salvataggio |
Boolean supportsStatementPooling () | Restituisce se il database supporta il pool di istruzioni |
Boolean supportsStoredProcedures () | Restituisce se il database supporta le stored procedure |
Boolean supportsOuterJoins () | Restituisce se il database supporta Outer Join |
Di seguito sono elencati alcuni metodi importanti dell'interfaccia DatabaseMetaData. Puoi fare riferimento al sito ufficiale del Oracolo dove puoi vedere tutti i metodi disponibili nell'interfaccia DatabaseMetaData.
DatabaseMetaData Esempio:
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 stub Class.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 the Database: ' + 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 of the Database: ' + dbmd.getURL()); System.out.println('Database is read - only? ' +dbmd.isReadOnly()); System.out.println('Support Batch Updates? ' + dbmd.supportsBatchUpdates()); System.out.println('Support savepoints? ' + dbmd.supportsSavepoints()); System.out.println('Support Statement Pooling? '+ dbmd.supportsStatementPooling()); System.out.println('Support Stored Procedures? ' + dbmd.supportsStoredProcedures()); System.out.println('Support Outer Join? '+ dbmd.supportsOuterJoins()); } }
PRODUZIONE:
Spiegazione:
Nel programma sopra, abbiamo utilizzato / implementato getDriverName (), getDriverVersion (), getUserName (), getDatabaseProductName (), getDatabaseProductVersion (), getStringFunctions (), getTimeDateFunctions (), getURL (), isReadOnly (supports) , supportsStatementPooling (), supportsSavepoints (), supportsStoredProcedures () e i metodi supportsOuterJoins () nell'interfaccia DatabaseMetaData.
Punti da notare:
- L'interfaccia ResultSet di JDBC viene utilizzata per memorizzare i dati dal database e utilizzarli nel nostro programma Java.
- Possiamo anche utilizzare ResultSet per aggiornare i dati utilizzando i metodi updateXXX ().
- L'oggetto ResultSet punta il cursore sulla prima riga dei dati del risultato. Usando il metodo next (), possiamo iterare attraverso il ResultSet.
- Abbiamo metodi di navigazione di ResultSet per spostarsi ulteriormente nell'oggetto ResultSet
- ResultMetaData viene utilizzato per ottenere ulteriori informazioni sul ResultSet come il nome della colonna, il numero di colonne, il tipo di dati della colonna, ecc.
- DatabaseMetData viene utilizzato per ottenere le informazioni sul database a cui ci siamo collegati
Domande frequenti
D # 1) Qual è l'uso di ResultSet?
Risposta: ResultSet viene utilizzato per memorizzare e recuperare i dati dal DB. Quando il metodo executeQuery () è stato eseguito, restituirà l'oggetto ResultSet. Possiamo usare quell'oggetto ResultSet nel nostro programma per eseguire la logica.
D # 2) Come verificare se il ResultSet è vuoto o no?
Risposta: Non ci sono metodi predefiniti come length (), size () disponibili per controllare IsResultSet Empty. Possiamo usare il metodo next () per iterare e se restituisce True, allora non è vuoto, se restituisce False significa che il ResultSet è vuoto.
D # 3) È possibile che ResultSet sia nullo?
Risposta: No, il metodo executeQuery () restituisce l'oggetto ResultSet che potrebbe non essere mai nullo.
D # 4) Cos'è il ResultSet aggiornabile?
Risposta: Un oggetto ResultSet aggiornabile viene utilizzato per aggiornare i dati nella colonna, inserire dati nelle colonne ed eliminare righe. Per rendere un ResultSet aggiornabile, è necessario rendere il tipo di scorrimento sensibile o insensibile e il tipo CONCUR come aggiornabile.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
D # 5) Come ottenere il nome del database che è stato connesso?
Risposta: Possiamo usare il metodo getDatabaseProductName () dell'oggetto DatabaseMetaData.
Conclusione
In questo tutorial, abbiamo discusso cosa sono le interfacce ResultSet, ResultSetMetaData e DatabaseMetaData e i loro metodi importanti comunemente usati nei programmi JDBC. Abbiamo anche visto come aggiornare i dati nel DB utilizzando ResultSet. ResultSetMetadata contiene informazioni su ResultSet come il nome della colonna, il conteggio delle colonne e così via.
DatabaseMetaData contiene le informazioni del database.
Lettura consigliata
- JDBC DriverManager, JDBC PreparedStatement e Statement
- Tutorial Java JDBC: cos'è JDBC (Java Database Connectivity)
- Gestione transazioni Java JDBC con esempio
- Esercitazione sull'elaborazione batch e sulla stored procedure JDBC
- Tutorial di connessione Java JDBC con esempio di programmazione
- Interfacce comparabili e di confronto in Java
- Test del database del selenio (utilizzando WebDriver e API JDBC)
- Gestione delle eccezioni JDBC - Come gestire le eccezioni SQL