Gestión de la línea actual

Escribimos el primer programa y funcionó perfectamente. Escribimos una consulta, la ejecutamos y, como resultado, el método executeQuery() nos devolvió un objeto.conjunto resultanteque contiene todos los resultados de la consulta. Y ahora intentaremos descubrir cómo obtener estos resultados.

El resultado de la consulta puede contener miles de filas y cientos de columnas de varios tipos, por lo que esta no es una tarea tan trivial como podría pensar. Por ejemplo, las imágenes se pueden almacenar en la base de datos, luego puede obtener una imagen como un conjunto de bytes o un InputStream para descargarla.

Pero comenzaremos con lo más simple: con el concepto de " línea de resultado actual ". Dado que el resultado suele tener muchas filas, el objetoconjunto resultantetiene un puntero a la línea actual dentro. Y cambia secuencialmente las líneas para leerlas usando el método next() .

Este enfoque se realiza principalmente para la optimización. Es posible que el controlador JDBC no cargue cadenas de la base de datos hasta que pueda leerlas secuencialmente. Usted también lee FileInputStream secuencialmente desde el principio hasta el final. Por lo tanto, este enfoque debería resultarle familiar y comprensible.

Sin embargo, si realmente lo necesita, los archivos se pueden leer en cualquier lugar utilizando la clase RandomAccessFile .

La clase ResultSet también permite algo similar y le permite mover la fila actual a lo largo del resultado en cualquier lugar. Para ello, cuenta con los siguientes métodos:

Método Descripción
1 próximo() Cambiar a la siguiente línea
2 anterior() Cambiar a la línea anterior
3 es primero() ¿Línea actual primero?
4 esantesdelprimero() ¿Estamos frente a la primera línea?
5 esÚltimo() ¿La línea actual es la última?
6 esdespuésdelúltimo() ¿Estamos después de la fecha límite?
7 absoluto (int n) Hace que la línea N sea actual
8 relativo (int n) Mueve la línea actual N posiciones hacia adelante. N puede ser <0
9 obtenerFila() Devuelve el número de línea

Los métodos son bastante simples, pero es necesario hacer dos explicaciones. Los resultados están, por así decirlo, enmarcados por líneas vacías en ambos lados. Por lo tanto, inicialmente la línea actual está antes de la primera línea del resultado. Y para obtener la primera fila, debe llamar al método next() al menos una vez .

Si llamó al método next() en la última fila , entonces se movió a la línea después de la última . No puede leer datos de él, pero no se producirá ningún error. Aquí el método isAfterLast() declarará verdadero como resultado.

Ejemplo:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

System.out.println( results.getRow() );        	// 0
System.out.println( results.isBeforeFirst() );  // true
System.out.println( results.isFirst() );          	// false

results.next();

System.out.println( results.getRow() );        	// 1
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// true

results.next();

System.out.println( results.getRow() );        	// 2
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// false

Obtener datos de la fila actual

Has aprendido a gestionar con maestría la línea actual. Ahora veamos cómo obtener datos de él. Para ello, el objetoconjunto resultantehay métodos especiales que pueden ser descritos por una plantilla:

getType(numberColumns)

Sin embargo, si la columna tiene un nombre, también puede obtener el nombre de la columna:

getType(nameColumns)

Ejemplo:

while (results.next()) {
        	Integer id = results.getInt(“id”);
        	String name = results.getString(“name”);
        	System.out.println(results.getRow() + ". " + id + "\t"+ name);
}

A continuación, proporcionaré una tabla que lo ayudará a asociar los tipos de datos SQL y los métodos de ResultSet:

tipo de datos SQL Métodos getXXX()
CARBONIZARSE obtenerCadena()
VARCHAR obtenerCadena()
EN T getInt()
FLOTAR obtenerDoble()
CLUB getClob()
GOTA obtenerBlob()
FECHA obtener la fecha()
TIEMPO consigue tiempo()
MARCA DE TIEMPO getTimestamp()

El punto, creo que lo entiendes.

Obtener diferentes datos sobre ResultSet

Descubrimos cómo leer datos de la línea actual: tanto por el número de columna como por su nombre. Por cierto, ¿cómo puedo averiguar el nombre de la columna por su número? ¿O el número de columnas en el resultado?

Por un lado, si escribe una solicitud, parece que tiene que saber todo esto. Por otro lado, podemos escribir un programa que muestre el resultado de una consulta en la pantalla: la consulta se nos pasa y solo queremos mostrar en la pantalla (en la consola, página web) todo lo que devolvió el servidor SQL. para nosotros.

JDBC tiene un objeto especial para esto, la interfaz ResultSetMetaData . Conseguir un objeto de este tipo es bastante sencillo:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
ResultSetMetaData resultSetMetaData = results.getMetaData();

La interfaz ResultSetMetaData tiene algunos métodos muy interesantes. A continuación se muestran los más populares:

1 obtenerCuentaColumnas() Devuelve el número de columnas de resultados.
2 getColumnName(columna int) Devuelve el nombre de la columna.
3 getColumnLabel(columna int) Devuelve la descripción de la columna.
4 obtenerTipoColumna() Devuelve el tipo de columna: número (código especial)
5 getColumnTypeName() Devuelve el tipo de columna: cadena
6 getColumnClassName() Devuelve el nombre de la clase Java para el tipo de columna.
7 getTableName() Devuelve el nombre de la tabla.
8 getCatalogName() Devuelve el nombre del directorio de la columna.
9 getSchemaName() Devuelve el nombre de esquema de la base de datos.
10 isAutoIncrement(columna int) ¿La columna admite INCREMENTO AUTOMÁTICO?
once es anulable() ¿Puede una columna contener NULL?

Usémoslo para aprender un poco sobre nuestra tabla:

ResultSetMetaData metaData = results.getMetaData();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++)
{
        	String name = metaData.getColumnName(column);
        	String className = metaData.getColumnClassName(column);
        	String typeName = metaData.getColumnTypeName(column);
        	int type = metaData.getColumnType(column);

        	System.out.println(name + "\t" + className + "\t" + typeName + "\t" + type);
}

¡Importante! Preste atención a que las columnas están numeradas a partir del 1. Las filas, por cierto, también. ¿Qué tan inusual es eso, verdad?

Y este es el resultado que obtuve después de ejecutar el programa:

"C:\Archivos de programa\Java\jdk-17.0.3.1\bin\java.exe...
identificación java.lang.Integer EN T 4
nombre java.lang.cadena VARCHAR 12
nivel java.lang.Integer EN T 4
Fecha de creación java.sql.fecha FECHA 91
Proceso finalizado con código de salida 0