Este tutorial explica cómo utilizar JDBC ResultSet para recuperar datos. También aprenderemos sobre las interfaces ResultSetMetaData y DatabaseMetaData con ejemplos:
En el Gestor de controladores JDBC tutorial del Serie de tutoriales JDBC , aprendimos a utilizar JDBC DriverManager y sus métodos, JDBC PreparedStatement en aplicaciones Java.
En este tutorial, hablaremos de las interfaces restantes en JDBC. Hemos cubierto las interfaces Statement, PreparedStatement y CallableStatement en nuestros tutoriales anteriores.
Aquí aprenderemos sobre las interfaces JDBC ResultSet, ResultSetMetaData y DatabaseMetaData, sus métodos y cómo utilizarlos en un programa Java.
Interfaz JDBC ResultSet
La interfaz ResultSet está presente en el paquete java.sql. Se utiliza para almacenar los datos que se devuelven de la tabla de base de datos después de la ejecución de las sentencias SQL en el programa Java. El objeto ResultSet mantiene el cursor en los datos resultantes. Por defecto, el cursor se posiciona antes de la primera fila de los datos resultantes.
El método next() se utiliza para mover el cursor a la siguiente posición en una dirección hacia adelante. Devolverá FALSE si no hay más registros. Recupera datos llamando al método executeQuery() utilizando cualquiera de los objetos statement. Puede ser un objeto Statement o PreparedStatement o CallableStatement. Las interfaces PreparedStatement, y CallableStatement son las subinterfaces de Statementinterfaz.
Declaración Interfaz
Statement statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery("Select * from EMPLOYEE_DETAILS");
Interfaz PreparedStatement
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS");
Podemos utilizar el método getX() para obtener los datos de las columnas mientras iteramos a través de los resultados donde X - es el tipo de dato de la columna. Podemos utilizar Nombres de Columna o Índice para obtener los valores utilizando los 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); }
También podemos mencionar el número de índice de la Columna en lugar del Nombre de la Columna en los 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 los datos/valores en ResultSet que han sido devueltos como salida de la sentencia SQL ejecutada en la dirección hacia adelante. Podemos iterar los valores en otras direcciones utilizando Scrollable ResultSet. Podemos especificar el tipo y la concurrencia de ResultSet mientras creamos objetos Statement, PreparedStatement y CallableStatement.
Existen 3 tipos en ResultSet, que son:
- TYPE_FORWARD_ONLY: Es la opción por defecto, en la que el cursor se desplaza de principio a fin, es decir, en la dirección de avance.
- TYPE_SCROLL_INSENSITIVE: En este tipo, hará que el cursor se mueva en ambas direcciones hacia adelante y hacia atrás. Si hacemos algún cambio en los datos mientras iteramos los datos almacenados no se actualizará en el conjunto de datos si alguien cambia los datos en DB. Porque el conjunto de datos tiene los datos desde el momento en que la consulta SQL devuelve los Datos.
- TYPE_SCROLL_SENSITIVE: Es similar a TYPE_SCROLL_INSENSITIVE, la diferencia es que si alguien actualiza los datos después de que la consulta SQL haya devuelto los datos, mientras se itera reflejará los cambios en el conjunto de datos.
Concurrencia de ResultSet
Existen 2 modos de Concurrencia en ResultSet, que son:
- ResultSet.CONCUR_READ_ONLY: Es el modo de concurrencia por defecto. Sólo podemos leer los datos en el ResultSet. La actualización no es aplicable.
- ResultSet.CONCUR_UPDATABLE: Podemos actualizar los datos en el objeto ResultSet.
Algunas bases de datos no admiten el modo de concurrencia para todos los tipos de ResultSet. En ese caso, debemos comprobar si admiten el tipo y el modo de concurrencia que deseamos mediante el método supportsResultSetConcurrency().
Métodos en la interfaz ResultSet
Existen 4 categorías de métodos ResultSet, que son:
- Métodos de navegación
- Métodos Getter
- Métodos Setter
- Métodos diversos
En primer lugar, hablaremos de los métodos de navegación y, a continuación, seguiremos avanzando.
#nº 1) Métodos de navegación
Este método se utiliza para desplazar el cursor por el conjunto de datos.
- Boolean absoluto(int fila): Se utiliza para mover el cursor a la fila especificada que se menciona en el parámetro y devuelve true si la operación tiene éxito, de lo contrario devuelve false.
- Void afterLast(): Hace que el cursor del ResultSet se mueva después de la última fila.
- Void beforeFirst(): Hace que el cursor del ResultSet se desplace antes de la primera fila.
- Booleano first(): Hace que el cursor del ResultSet se desplace a la primera fila. Devuelve True si la operación se realiza correctamente o False en caso contrario.
- Booleano last(): Hace que el cursor del ResultSet se desplace a la última fila. Devuelve True si la operación se realiza correctamente o False en caso contrario.
- Booleano next(): Hace que el cursor del ResultSet se mueva a la siguiente fila. Devuelve True si hay más registros y False si no hay más registros.
- Boolean anterior(): Hace que el cursor del ResultSet se desplace a la fila anterior. Devuelve True si la operación se realiza correctamente o False en caso contrario.
- Booleano relativo(): Desplaza el cursor hasta el número de filas dado, hacia delante o hacia atrás.
- Int getRow(): Devuelve el número de fila actual al que apunta el objeto ResultSet.
- Void moveToCurrentRow(): Devuelve el cursor a la fila actual si se encuentra en la fila de inserción.
- Void moveToInsertRow(): Mueve el cursor a la fila específica para insertar la fila en la Base de Datos. Recuerda la ubicación actual del cursor. Así que podemos usar el método moveToCurrentRow() para mover el cursor a la fila actual después de la inserción.
En este tutorial, todos los programas están escritos en Java. Hemos utilizado la versión Java 8 y Oracle DB.
Puede descargar el software de Oracle desde aquí
Puede descargar la versión 8 de Java desde aquí
Cuenta con el proceso de instalación de Java paso a paso.
Programa de ejemplo JDBC ResultSet:(Uso de 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 Método autogenerado //Seleccionar consulta String select_query = "select * fromemployee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Connecting to Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:X E")) { //Creating DatabaseMetaData object DatabaseMetaData dbmd = conn.getMetaData(); //Checking whether the driver supports scroll sensitive type and concur updatable boolean isSupportResultSetType =dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Creación de la sentencia preparada PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(); //Mover el cursor al punto de la primera fila rs.first();System.out.println("PRIMERA FILA \n EMP NUM = " + rs.getInt("empNum") + "\n APELLIDO = "+ rs.getString(2)+"\n NOMBRE = " + rs.getString(3)); //Mover el cursor hasta la última fila rs.last(); System.out.println("ÚLTIMA FILA \n EMP NUM = " + rs.getInt("empNum") + "\n APELLIDO = "+ rs.getString(2)+"\n NOMBRE = " + rs.getString(3)); //Mover el cursor hasta la primera fila rs.beforeFirst();System.out.println("El cursor apunta antes de la primera fila. Utilice next() para avanzar"); //Mover el cursor hasta la primera fila utilizando next() rs.next(); System.out.println("PRIMERA FILA \n EMP NUM = " + rs.getInt("empNum") + "\n APELLIDO = "+ rs.getString(2)+"\n NOMBRE = " + rs.getString(3)); //Mover el cursor hasta la última fila rs.afterLast(); System.out.println("CursorUtilice previous() para retroceder"); //Mover el cursor a la última fila utilizando previous() rs.previous(); System.out.println("ÚLTIMA FILA \n NÚMERO EMP = " + rs.getInt("empNum") + "\n ÚLTIMO NOMBRE = "+ rs.getString(2)+"\n PRIMER NOMBRE = " + rs.getString(3)); //Mover el cursor a la tercera fila rs.absolute(3); System.out.println("El cursor apunta a la 3ª fila.fila"); System.out.println("TERCERA FILA \n EMP NUM = " + rs.getInt("empNum") + "\n APELLIDO = "+ rs.getString(2)+"\n NOMBRE = " + rs.getString(3)); //Mover el cursor para apuntar a la fila anterior de la tercera fila rs.relative(-1); System.out.println("El cursor apunta a la fila 1 anterior a la 3ª fila"); System.out.println("SEGUNDA FILA \n EMP NUM = " + rs.getInt("empNum") + "\n APELLIDO = "+rs.getString(2)+"\n NOMBRE = " + rs.getString(3)); //Mover el cursor a la 4ª fila después de la 2ª rs.relative(4); System.out.println("El cursor apunta a la 4ª fila después de la 2ª"); System.out.println("SEXTA FILA \n NÚMERO EMP = " + rs.getInt("empNum") + "\n APELLIDO = "+ rs.getString(2)+"\n NOMBRE = " + rs.getString(3)); //Mover el cursor a la fila actualSystem.out.println(" Fila actual = " + rs.getRow()); } } catch (SQLException e) { e.printStackTrace(); } } }
SALIDA:
Datos de la tabla Employee_details
Explicación:
En el programa anterior hemos implementado los métodos first(), last(), beforeFirst(), afterLast(), next(), previous(), absolute(), relative() y getRow() en ResultSet. Para utilizar estos métodos establecemos los valores ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE en el método prepareStatement.
A continuación, vamos a discutir cuáles son los métodos Getter en ResultSet:
#2) Métodos Getter
ResultSet ha almacenado los datos de la tabla de la base de datos. Los métodos Getter se utilizan para obtener los valores de la tabla en ResultSet. Para ello, tenemos que pasar el valor de la columna Index o Column Name.
Los siguientes son los métodos getter en ResultSet:
- int getInt(int ColumnIndex): Se utiliza para obtener el valor de la columna especificada Índice como un tipo de datos int.
- float getFloat(int ColumnIndex): Se utiliza para obtener el valor de la columna especificada Índice como un tipo de datos float.
- java.sql.date getDate(int ColumnIndex): Se utiliza para obtener el valor de la columna especificada Índice como un valor de fecha.
- int getInt(String NombreColumna): Se utiliza para obtener el valor de la columna especificada como un tipo de datos int.
- float getFloat(String ColumnName): Se utiliza para obtener el valor de la columna especificada como un tipo de datos float.
- Java.sql.date getDate(String ColumnName): Se utiliza para obtener el valor de la columna especificada como valor de fecha.
Existen métodos getter para todos los tipos de datos primitivos (Boolean, long, double) y String también en la interfaz ResultSet. Podemos obtener un array y datos de tipo binario también de la Base de Datos. También tiene métodos para ello.
#3) Métodos Setter/Updater
Podemos actualizar el valor en la Base de Datos usando los métodos ResultSet Updater. Es similar a los métodos Getter, pero aquí necesitamos pasar los valores/datos para la columna particular a actualizar en la Base de Datos.
A continuación se describen los métodos de actualización de ResultSet:
- void updateInt(int ColumnIndex, int Value): Se utiliza para actualizar el valor de la columna especificada Índice con un valor int.
- void updateFloat(int ColumnIndex, float f): Se utiliza para actualizar el valor de la columna especificada Índice con el valor flotante.
- void updateDate(int ColumnIndex, Date d): Se utiliza para actualizar el valor de la columna especificada Índice con el valor de la fecha.
- void updateInt(String ColumnName, int Value): Se utiliza para actualizar el valor de la columna especificada con el valor int dado.
- void updateFloat(String ColumnName, float f): Se utiliza para actualizar el valor de la columna especificada con el valor flotante dado.
- Java.sql.date getDate(String ColumnName): Se utiliza para actualizar el valor de la columna especificada con el valor de fecha dado.
Existen métodos Updater para todos los tipos de datos primitivos (Boolean, long, double) y String también en la interfaz ResultSet.
Los métodos Updater sólo actualizan los datos en el objeto ResultSet. Los valores se actualizarán en la BD después de llamar al método insertRow o updateRow.
Actualizar una fila:
Podemos actualizar los datos de una fila llamando a los métodos updateX(), pasando el nombre o índice de la columna, y los valores a actualizar. Podemos utilizar cualquier tipo de dato en lugar de X en el método updateX. Hasta ahora, hemos actualizado los datos en el objeto ResultSet. Para actualizar los datos en la BD, tenemos que llamar al método updateRow().
Insertar una fila:
Necesitamos utilizar moveToInsertRow() para mover el cursor e insertar una nueva fila. Ya hemos cubierto esto en la sección de métodos de navegación. A continuación, necesitamos llamar al método updateX() para añadir los datos a la fila. Debemos proporcionar datos para todas las columnas, de lo contrario utilizará el valor por defecto de esa columna en particular.
Después de actualizar los datos, tenemos que llamar al método insertRow(). A continuación, utilice el método moveToCurrentRow(), para llevar la posición del cursor de nuevo a la fila en la que estábamos antes de empezar a insertar una nueva fila.
Ejemplo de 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 Método generado automáticamente 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();//Comprobación de si el controlador admite tipos insensibles al desplazamiento y actualizables por concurrencia boolean isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Creación de la sentencia preparada PreparedStatement pstatemnt1 =conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(select_query); //Mover el cursor al punto de la última fila de la tabla rs.last(); System.out.println("ULTIMA FILA: Antes de insertar nuevo empleado"); System.out.println("ULTIMA FILA: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\nLAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Configurar los valores a insertar en la tabla EMPLOYEE_DETAILS //Mover el cursor para apuntar a insertar una fila en la tabla rs.moveToInsertRow(); //Actualizar el valor de EMPNUM rs.updateInt(1, 1017); //Actualizar el valor de LAST NAME rs.updateString(2, "Bond"); //Actualizar el valor de FIRST NAME rs.updateString(3, "James"); //Insertar una nueva fila rs.insertRow();//Mover el cursor a la 5ª fila rs.absolute(5); System.out.println("Antes de actualizar el EMPNUM de la 5ª FILA"); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); System.out.println(" Actualizando el EMP id del 5º EMPLEADO"); //Actualizando el EMPNUM de la 5ª fila 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(); } }}
SALIDA:
Explicación:
En el programa anterior lo que hemos hecho es primero, almacenar los datos de la tabla Employee_details en el objeto ResultSet utilizando la consulta SELECT. Después, mostramos los datos de la última fila de la tabla employee_details utilizando el método last() de ResultSet. El método moveToInsertRow() hace que el cursor apunte a la fila actual, ahora la fila actual es la última fila.
Los métodos updateXXX()se han utilizado para actualizar los valores de la fila y el método insertRow() ha insertado los datos en una nueva fila. Utilizando el método absolute(), hemos hecho que el cursor apunte a la 5ª fila. El método UpdateInt() se ha utilizado para actualizar el EMPNUM con un nuevo id del 5º empleado de la tabla. Después de eso, se han mostrado los datos para comprobar si el EMPNUM se ha actualizado o no.
Hacer que el cursor apunte a la última fila de la tabla utilizando last() y mostrarlo. Para realizar la lógica anterior, necesitamos establecer los valores ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE en el método prepareStatement.
#4) Métodos diversos
- void close(): Se utiliza para cerrar la instancia ResultSet y liberar los recursos asociados a la instancia ResultSet.
- ResultSetMetaData getMetaData(): Devuelve la Instancia ResultSetMetaData. Tiene la información sobre el tipo y la propiedad de las columnas de la salida de la consulta. Aprenderemos más sobre ResultSetMetaData en la siguiente sección.
ResultSetMetaData
¿Qué son los metadatos?
Metadata significa datos sobre datos. Utilizando esta interfaz, obtendremos más información sobre ResultSet. Está disponible en el paquete java.sql. Cada objeto ResultSet está asociado a un objeto ResultSetMetaData.
Este objeto tendrá los detalles de las propiedades de las columnas, como el tipo de datos de la columna, el nombre de la columna, el número de columnas, el nombre de la tabla, el nombre del esquema, etc. Podemos obtener el objeto ResultSetMetaData utilizando el método getMetaData() de ResultSet.
Sintaxis del ResultSetMetaData:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS"); ResultSetMetaData rsmd = rs.getMetaData();
Métodos importantes de la interfaz ResultSetMetaData:
Nombre del método | Descripción |
---|---|
String getColumnName(int columna) | Devuelve el nombre de la columna en cuestión |
String getColumnTypeName(int columna) | Devuelve el tipo de dato de la columna concreta que hemos pasado como parámetro |
String getTableName(int columna) | Devuelve el nombre de tabla de la columna |
String getSchemaName(int columna) | Devuelve el nombre del esquema de la tabla de la columna |
int getColumnCount() | Devuelve el número de columnas del ResultSet |
boolean isAutoIncrement(int Columna) | Devuelve true si la columna dada es Auto Incremento, en caso contrario false |
boolean isCaseSensitive(int Columna) | Devuelve true si la columna dada distingue entre mayúsculas y minúsculas, en caso contrario false |
Ejemplo de 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 Método generado automáticamente 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(" Estamos utilizando ResultSetMetaData ");System.out.println("Nº: de columnas: "+ rsmd.getColumnCount()); System.out.println("Nombre de columna de la columna 1: "+ rsmd.getColumnName(1)); System.out.println("Tipo de datos de la columna 2: " + rsmd.getColumnTypeName(2)); System.out.println("Nombre de tabla de la columna 1: " + rsmd.getTableName(1)); System.out.println("Nombre de esquema de la columna 1: " + rsmd.getSchemaName(1)); } } }
SALIDA:
Explicación:
En el programa anterior, hemos implementado los métodos getColumnCount(),getColumnName(), getColumnTypeName(), getTableName() y getSchemaName() en la interfaz ResultSetMetaData.
DatabaseMetaData
La interfaz DatabaseMetaData proporciona información sobre la base de datos, como DatabaseName, Database version, etc.
Métodos importantes de la interfaz DatabaseMetaData:
Nombre del método | Descripción |
---|---|
String getDriverName() | Nos devolverá el nombre del driver JDBC que estamos utilizando en nuestro programa Java |
String getDriverVersion() | Devuelve el número de versión del controlador JDBC |
Cadena getUserName() | Devuelve el nombre de usuario de la Base de Datos que estamos utilizando |
String getDatabaseNombreProducto() | Devuelve el nombre de la Base de Datos que estamos utilizando |
String getDatabaseProductVersion() | Devuelve el número de versión de la Base de Datos que estamos utilizando |
ResultSet getSchemas() | Devuelve los nombres de los esquemas disponibles en la Base de Datos conectada |
String getStringFunctions() | Devuelve la lista de funciones de cadena disponibles en la Base de Datos conectada |
String getTimeDateFunctions() | Devuelve la lista de funciones de fecha y hora disponibles en la Base de Datos conectada. |
Cadena getURL() | Devuelve la URL de la Base de Datos |
Booleano isReadOnly() | Devuelve si la base de datos está en modo sólo lectura |
Boolean supportsBatchUpdates() | Devuelve si la base de datos admite actualizaciones por lotes |
Boolean supportsSavepoints() | Devuelve si la Base de Datos soporta Savepoints |
Boolean soportaStatementPooling() | Devuelve si la Base de Datos soporta Statement Pooling |
Booleano supportsStoredProcedures() | Devuelve si la Base de Datos soporta Stored procedures |
Boolean supportsOuterJoins() | Devuelve si la base de datos soporta Outer Join |
Aquí hemos enumerado algunos métodos importantes de la interfaz DatabaseMetaData. Puede consultar el sitio oficial de la interfaz Oracle donde puedes ver todos los métodos disponibles en la interfaz DatabaseMetaData.
DatabaseMetaData Ejemplo:
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 Método autogenerado 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("Nombre del controlador: " + dbmd.getDriverName()); System.out.println("Versión del controlador: "+ dbmd.getDriverVersion()); System.out.println("Nombre de usuario delBase de datos: " + dbmd.getUserName()); System.out.println("Nombre del producto de la base de datos:" + dbmd.getDatabaseProductName()); System.out.println("Versión del producto de la base de datos: " + dbmd.getDatabaseProductVersion()); System.out.println("Lista de funciones de cadena en la base de datos: " + dbmd.getStringFunctions()); System.out.println("Lista de funciones de fecha y hora en la base de datos: " + dbmd.getTimeDateFunctions());System.out.println("URL de la base de datos: " + dbmd.getURL()); System.out.println("¿La base de datos es de sólo lectura? " +dbmd.isReadOnly()); System.out.println("¿Admite actualizaciones por lotes? " + dbmd.supportsBatchUpdates()); System.out.println("¿Admite puntos de guardado? " + dbmd.supportsSavepoints()); System.out.println("¿Admite agrupación de sentencias? "+ dbmd.supportsStatementPooling()); System.out.println("¿Admite almacenamiento¿Procedimientos?" + dbmd.supportsStoredProcedures()); System.out.println("¿Soporta Outer Join? "+ dbmd.supportsOuterJoins()); } }
SALIDA:
Explicación:
En el programa anterior, hemos utilizado/implementado los métodos getDriverName(), getDriverVersion(), getUserName(), getDatabaseProductName(), getDatabaseProductVersion(), getStringFunctions(), getTimeDateFunctions(), getURL(), isReadOnly(), supportsBatchUpdates(), supportsStatementPooling(), supportsSavepoints(), supportsStoredProcedures() y supportsOuterJoins() en la Interfaz DatabaseMetaData.
Puntos a tener en cuenta:
- La interfaz JDBC ResultSet se utiliza para almacenar los datos de la base de datos y utilizarlos en nuestro programa Java.
- También podemos utilizar ResultSet para actualizar los datos utilizando los métodos updateXXX().
- El objeto ResultSet apunta el cursor antes de la primera fila de los datos de resultado. Utilizando el método next(), podemos iterar a través del ResultSet.
- Disponemos de métodos de navegación de ResultSet para avanzar en el objeto ResultSet
- ResultMetaData se utiliza para obtener más información sobre el ResultSet, como el nombre de la columna, el número de columnas, el tipo de datos de la columna, etc.
- DatabaseMetData se utiliza para obtener la información sobre la base de datos a la que nos hemos conectado
Preguntas frecuentes
P #1) ¿Para qué sirve ResultSet?
Contesta: ResultSet se utiliza para almacenar y recuperar los datos de la base de datos. Cuando el método executeQuery() se ha ejecutado, devolverá el objeto ResultSet. Podemos utilizar ese objeto ResultSet en nuestro programa para realizar la lógica.
P #2) ¿Cómo comprobar si el ResultSet está vacío o no?
Contesta: No hay métodos predefinidos como length(), size() disponibles para comprobar el IsResultSet Empty. Podemos utilizar el método next() para iterar y si devuelve True, entonces no está vacío, si devuelve False significa que el ResultSet está vacío.
P #3) ¿Es posible que ResultSet sea nulo?
Contesta: No, el método executeQuery() devuelve el objeto ResultSet que nunca puede ser nulo.
P #4) ¿Qué es un ResultSet actualizable?
Contesta: Un objeto ResultSet actualizable se utiliza para actualizar los datos de la columna, insertar datos en columnas y eliminar filas. Para hacer que un ResultSet sea actualizable, necesitamos hacer que el tipo de desplazamiento sea sensible o insensible y que el tipo CONCUR sea actualizable.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
P #5) ¿Cómo obtener el nombre de la base de datos que se ha conectado?
Contesta: Podemos utilizar el método getDatabaseProductName() del objeto DatabaseMetaData.
Conclusión
En este tutorial, hemos discutido qué son las interfaces ResultSet, ResultSetMetaData, y DatabaseMetaData y sus métodos importantes comúnmente utilizados en los programas JDBC. También hemos visto cómo actualizar datos en DB utilizando ResultSet. ResultSetMetadata contiene información sobre ResultSet como Nombre de Columna, Recuento de Columnas, etc.
DatabaseMetaData contiene información sobre la base de datos.
<