Este titorial explica como usar JDBC ResultSet para recuperar datos. Tamén aprenderemos sobre as interfaces ResultSetMetaData e DatabaseMetaData con exemplos:
No tutorial JDBC DriverManager da serie de titoriais JDBC , aprendemos a usar JDBC DriverManager e os seus métodos, JDBC PreparedStatement en aplicacións Java.
Neste titorial, comentaremos as interfaces restantes en JDBC. Cubrimos as interfaces Statement, PreparedStatement e CallableStatement nos nosos titoriais anteriores.
Aquí aprenderemos sobre as interfaces JDBC ResultSet, ResultSetMetaData e DatabaseMetaData, os seus métodos e como usar os métodos no programa Java.
Interface ResultSet JDBC
A interface ResultSet está presente no paquete java.sql. Utilízase para almacenar os datos que se devolven da táboa da base de datos despois da execución das instrucións SQL no programa Java. O obxecto de ResultSet mantén o punto do cursor nos datos do resultado. De xeito predeterminado, o cursor sitúase antes da primeira fila dos datos do resultado.
O método next() úsase para mover o cursor á seguinte posición cara adiante. Devolverá FALSE se non hai máis rexistros. Recupera datos chamando ao método executeQuery() usando calquera dos obxectos de instrución. Pode ser un obxecto Statement ou PreparedStatement ou CallableStatement. Declaración preparada edevolve o nome do esquema da táboa da columna
ResultSetMetaData Exemplo
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)); } } }
SAÍDA:
Explicación:
No programa anterior, implementamos métodos getColumnCount(),getColumnName(), getColumnTypeName(), getTableName() e getSchemaName() na interface ResultSetMetaData.
DatabaseMetaData
A interface DatabaseMetaData dá información sobre a base de datos como DatabaseName, versión da base de datos, etc.
Métodos importantes da interface DatabaseMetaData:
Nome do método | Descrición |
---|---|
String getDriverName() | Devolverá o nome do controlador JDBC que estamos a usar no noso programa Java |
String getDriverVersion() | Devolve o número de versión do controlador JDBC |
String getUserName() | Devolve o nome de usuario da base de datos que estamos a usar |
String getDatabaseProductName() | Devolve o nome da base de datos que somosusing |
String getDatabaseProductVersion() | Devolve o número de versión da base de datos que estamos a usar |
ResultSet getSchemas() | Devolve os nomes dos esquemas dispoñibles na base de datos conectada |
String getStringFunctions() | Devolve a lista de funcións de cadea dispoñibles na base de datos conectada |
String getTimeDateFunctions() | It devolve a lista das funcións de data e hora dispoñibles na base de datos conectada |
String getURL() | Devolve o URL para a base de datos |
Boolean isReadOnly() | Devolve se a base de datos está en modo de só lectura |
Boolean supportsBatchUpdates() | Devolve se a base de datos admite actualizacións por lotes |
Boolean supportsSavepoints() | Devolve se a base de datos admite puntos de salvamento |
Boolean supportsStatementPooling() | Devolve se a base de datos admite Statement Pooling |
Boolean supportsStoredProcedures() | Devolve se a base de datos admite StoredProcedures |
Boolean supportsOuterJoins() | Devolve se a base de datos admite Outer Join |
Aquí enumeramos algúns métodos importantes da interface DatabaseMetaData. Podes consultar ositio oficial de Oracle onde podes ver todos os métodos dispoñibles na interface DatabaseMetaData.
DatabaseMetaData Exemplo:
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()); } }
SAÍDA:
Explicación:
No programa anterior, usamos/implementamos getDriverName(), getDriverVersion() , getUserName(), getDatabaseProductName(), getDatabaseProductVersion(), getStringFunctions(), getTimeDateFunctions(), getURL(), isReadOnly(), supportsBatchUpdates(), supportsStatementPooling(), supportsSavepoints(), supportsStoredProcedures()Joins e métodos de soporte()StoredProcedures() Interface DatabaseMetaData.
Puntos a ter en conta:
- A interface JDBC ResultSet úsase para almacenar os datos da base de datos e utilizalos no noso programa Java.
- Tamén podemos usar ResultSet para actualizar os datos usando os métodos updateXXX().
- O obxecto ResultSet apunta o cursor antes da primeira fila dos datos do resultado. Usando o método next(), podemos iterar a través do ResultSet.
- Temos métodos de navegación de ResultSet para avanzar no obxecto ResultSet
- ResultMetaData úsase para obter máis información sobre o ResultSet como nome da columna, número de columnas, tipo de datos da columna, etc.
- DatabaseMetData utilízase para obter información sobre a base de datos que conectamos
Preguntas frecuentes
P #1) Para que serveResultSet?
Resposta: ResultSet utilízase para almacenar e recuperar os datos da base de datos. Cando se execute o método executeQuery(), devolverá o obxecto ResultSet. Podemos usar ese obxecto ResultSet no noso programa para realizar a lóxica.
P #2) Como comprobar se o ResultSet está baleiro ou non?
Resposta: Non hai métodos predefinidos como length(), size() dispoñibles para comprobar o IsResultSet Empty. Podemos usar o método next() para iterar e se devolve True, entón non está baleiro, se devolve False significa que o ResultSet está baleiro.
Q #3) É posible que ResultSet pode ser nulo?
Resposta: Non, o método executeQuery() devolve o obxecto ResultSet que nunca pode ser nulo.
Q #4) Que é ResultSet actualizable?
Resposta: Utiliza un obxecto ResultSet actualizable para actualizar os datos da columna, inserir datos en columnas e eliminar filas. Para facer que un ResultSet sexa actualizable, necesitamos facer que o tipo de desprazamento sexa sensible ou insensible e o tipo CONCUR como actualizable.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
P #5) Como obter o nome da base de datos que se conectou?
Resposta: Podemos usar o método getDatabaseProductName() do obxecto DatabaseMetaData.
Conclusión
Neste tutorial, comentamos cales son as interfaces ResultSet, ResultSetMetaData e DatabaseMetaData e os seus importantes métodos de uso habitual nos programas JDBC. Tamén vimoscomo actualizar datos na base de datos usando ResultSet. ResultSetMetadata contén información sobre ResultSet, como o nome da columna, o reconto de columnas, etc.
DatabaseMetaData contén información da base de datos.
Interface Statement
Statement statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
Interface PreparedStatement
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
Podemos use o método getX() para obter os datos das columnas mentres itera os resultados onde X – é o tipo de datos da columna. Podemos usar Nomes de Columna ou Índice para obter os valores mediante os métodos 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); }
Tamén podemos mencionar o número de índice da Columna en lugar do Nome da Columna nos métodos 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); }
Tipos de ResultSet
Por defecto, podemos iterar os datos/valores en ResultSet que devolveron como saída da instrución SQL executada na dirección cara adiante. Podemos iterar os valores noutras direccións usando Scrollable ResultSet. Podemos especificar o tipo e concorrencia de ResultSet ao crear obxectos Statement, PreparedStatement e CallableStatement.
Hai 3 tipos en ResultSet. Son:
- TYPE_FORWARD_ONLY: É a opción predeterminada, onde o cursor se move de principio a fin, é dicir, na dirección cara adiante.
- TYPE_SCROLL_INSENSITIVE: Neste tipo, fará que o cursor se mova tanto cara adiante como cara atrás. Se facemos algún cambio nos datos mentres iteramos os datos almacenados, non se actualizará no conxunto de datos se alguén cambia os datos na base de datos. Porque o conxunto de datos ten os datos desde o momento en que a consulta SQL devolve oDatos.
- TYPE_SCROLL_SENSITIVE: É semellante a TYPE_SCROLL_INSENSITIVE, a diferenza é se alguén actualiza os datos despois de que a consulta SQL devolveu os datos, mentres que a iteración reflectirá os cambios no conxunto de datos.
Concorrencia de ResultSet
Hai 2 modos de concorrencia en ResultSet. Son:
- ResultSet.CONCUR_READ_ONLY: É o modo de concorrencia predeterminado. Só podemos ler os datos no ResultSet. A actualización non é aplicable.
- ResultSet.CONCUR_UPDATABLE: Podemos actualizar os datos do obxecto ResultSet.
Algunhas bases de datos non admiten o modo de concorrencia para todas Tipos de conxuntos de resultados. Nese caso, necesitamos comprobar se admiten o noso tipo e modo de concorrencia desexado mediante o método supportsResultSetConcurrency().
Métodos na interface ResultSet
Hai 4 categorías de métodos ResultSet. Son:
- Métodos de navegación
- Métodos Getter
- Métodos Setter
- Métodos varios
En primeiro lugar, discutiremos os métodos de navegación e despois avanzaremos.
#1) Métodos de navegación
Este método úsase para mover o cursor polo conxunto de datos.
- Absoluto booleano(fila int): Úsase para mover o cursor á fila especificada que se menciona no parámetro e devolver verdadeiro se a operación é exitosa ou devolver false.
- NulafterLast(): Fai que o cursor ResultSet se mova despois da última fila.
- Void beforeFirst(): Fai que o cursor ResultSet se mova antes da primeira fila.
- Boolean first(): Fai que o cursor ResultSet se mova á primeira fila. Devolve True se a operación ten éxito ou non False.
- Boolean last(): Fai que o cursor ResultSet se mova á última fila. Devolve Verdadeiro se a operación é exitosa senón Falso.
- Boolean next(): Fai que o cursor ResultSet se mova á seguinte fila. Devolve True se hai máis rexistros e False se non hai máis rexistros.
- Boolean previous(): Fai que o cursor ResultSet se mova á fila anterior. Devolve Verdadeiro se a operación ten éxito, senón Falso.
- Relativo booleano(): Move o cursor ao número indicado de filas na dirección cara adiante ou cara atrás.
- Int getRow(): Devolve o número de fila actual que apunta agora o obxecto ResultSet.
- Void moveToCurrentRow(): Move o cursor de volta ao fila actual se está actualmente na fila de inserción.
- Void moveToInsertRow(): Move o cursor á fila específica para inserir a fila na base de datos. Lembra a localización actual do cursor. Polo tanto, podemos usar o método moveToCurrentRow() para mover o cursor á fila actual despois da inserción.
Neste tutorial,todos os programas están escritos en Java. Usamos a versión de Java 8 e a base de datos de Oracle.
>>Podes descargar o software de Oracle desde aquí
>>Podes descargar a versión 8 de Java desde aquí
Ten o proceso de instalación de Java paso a paso.
JDBC ResultSet Programa de exemplo: (usando métodos de navegación)
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 \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("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 \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n 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 \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n 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 \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n 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 \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n 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 \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point current row System.out.println(" Current Row = " + rs.getRow()); } } catch (SQLException e) { e.printStackTrace(); } } }
SAÍDA:
Datos na táboa de detalles do empregado
Explicación:
No programa anterior implementamos primeiro(), last(), beforeFirst(), afterLast(), next( ), métodos anterior(), absoluto(), relativo() e getRow() en ResultSet. Para usar estes métodos, establecemos os valores ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE no método prepareStatement.
A continuación, discutiremos cales son os métodos Getter en ResultSet:
#2) Getter Methods
ResultSet almacenou os datos da táboa da base de datos. Os métodos Getter utilízanse para obter os valores da táboa en ResultSet. Para iso, necesitamos pasar o valor do índice da columna ou o nome da columna.
Os seguintes son os métodos de obtención en ResultSet:
- int getInt (int ColumnIndex): Úsase para obter o valor da columna Index especificada como un tipo de datos int.
- float getFloat(int ColumnIndex): Úsase para obter o valor da columna Índice especificada como tipo de datos flotante.
- java.sql.dategetDate(int ColumnIndex): Utilízase para obter o valor da columna Index especificada como valor de data.
- int getInt(String ColumnName): Úsase para obter o valor da columna especificada como tipo de datos int.
- float getFloat(String ColumnName): Utilízase para obter o valor da columna especificada como tipo de datos float.
- Java.sql.date getDate(String ColumnName): Utilízase para obter o valor da columna especificada como un valor de data.
Hai métodos de obtención para todos os tipos de datos primitivos (Boolean, long, double) e String tamén na interface ResultSet. Tamén podemos obter unha matriz e un tipo binario de datos da Base de Datos. Tamén ten métodos para iso.
#3) Métodos de configuración/actualización
Podemos actualizar o valor na base de datos usando os métodos de actualización de ResultSet. É semellante aos métodos Getter, pero aquí necesitamos pasar os valores/datos para a columna en particular para actualizar na base de datos.
Os seguintes son os métodos de actualización en ResultSet:
- void updateInt(int ColumnIndex, int Value): Úsase para actualizar o valor da columna Index especificada cun valor int.
- void updateFloat(int ColumnIndex, float f): Utilízase para actualizar o valor da columna Index especificada co valor flotante.
- void updateDate(int ColumnIndex, Date d): Utilízase para actualizar o valor da columna Índice especificadaco valor da data.
- void updateInt(String ColumnName, int Value): Utilízase para actualizar o valor da columna especificada co valor int indicado.
- void updateFloat(String ColumnName, float f): Utilízase para actualizar o valor da columna especificada co valor flotante indicado.
- Java.sql.date getDate(String ColumnName): Utilízase para actualizar o valor da columna especificada co valor de data indicado.
Hai métodos de actualización para todos os tipos de datos primitivos (booleano, longo, dobre) e String tamén na interface ResultSet.
Os métodos de actualización só actualizan os datos do obxecto ResultSet. Os valores actualizaranse na base de datos despois de chamar ao método insertRow ou updateRow.
Actualización dunha fila:
Podemos actualizar os datos nunha fila chamando aos métodos updateX() , pasando o nome ou índice da columna e os valores para actualizar. Podemos usar calquera tipo de datos en lugar de X no método updateX. Ata agora, actualizamos os datos do obxecto ResultSet. Para actualizar os datos na base de datos, temos que chamar ao método updateRow().
Inserir unha fila:
Necesitamos usar moveToInsertRow() para mover o cursor para inserir unha nova fila. Xa cubrimos isto na sección Métodos de navegación. A continuación, necesitamos chamar ao método updateX() para engadir os datos á fila. Deberiamos proporcionar datos para todas as columnas, senón que utilizará o valor predeterminado dese en particularcolumna.
Despois de actualizar os datos, necesitamos chamar ao método insertRow(). A continuación, use o método moveToCurrentRow() para levar a posición do cursor de volta á fila na que estabamos antes de comezar a inserir unha nova fila.
Exemplo de conxunto de resultados:
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("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n 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("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n 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("\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: 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(); } } }
SAÍDA:
Explicación:
No programa anterior o que fixemos primeiro é almacenar os datos da táboa Employee_details no obxecto ResultSet mediante a consulta SELECT. A continuación, mostramos os datos da última fila na táboa employee_details usando o método last() de ResultSet. moveToInsertRow() fai que o cursor apunte á fila actual, agora a fila actual é a última fila.
UpdateXXX()métodos utilizados para actualizar os valores da fila e o método insertRow() inseriu os datos en unha nova fila. Usando o método absolute(), fixemos que o cursor apuntase á quinta fila. Utilizouse o método UpdateInt() para actualizar o EMPNUM cun novo ID do 5º empregado na táboa. Despois diso, mostrou os datos para comprobar se o EMPNUM está actualizado ou non.
Fixo o cursor para sinalar a última fila da táboa usando last() e mostrouno. Para realizar a lóxica anterior, necesitamos establecer os valores ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE no método prepareStatement.
#4) Métodos varios
- void close(): Utilízase para pechar a instancia de ResultSet e liberar orecursos asociados á instancia de ResultSet.
- ResultSetMetaData getMetaData(): Devolve a instancia de ResultSetMetaData. Ten a información sobre o tipo e propiedade das columnas da saída da consulta. Na seguinte sección aprenderemos máis sobre ResultSetMetaData.
ResultSetMetaData
Que son os metadatos?
Metadatos significa datos sobre datos. Usando esta interface, obteremos máis información sobre ResultSet. Está dispoñible no paquete java.sql. Cada obxecto ResultSet está asociado cun obxecto ResultSetMetaData.
Este obxecto terá os detalles das propiedades das columnas como o tipo de datos da columna, o nome da columna, o número de columnas, o nome da táboa, o nome do esquema, etc., Podemos obter o obxecto ResultSetMetaData usando o método getMetaData() de ResultSet.
Sintaxe do ResultSetMetaData:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”); ResultSetMetaData rsmd = rs.getMetaData();
Métodos importantes da interface ResultSetMetaData:
Nome do método | Descrición |
---|---|
Cadea getColumnName(int column) | Devolve o nome da columna da columna concreta |
String getColumnTypeName(int column) | Devolve o tipo de datos do columna particular que pasamos como parámetro |
String getTableName(int column) | Devolve o nome da táboa da columna |
Cadea getSchemaName(int column) | It |