1. Ingeniería de Sistemas y Telemática
ResulSet
Marco Aurelio Porro Chulli.
Erlin Darwin Herrera Cieza.
Yosmer Aguilar Cabrera.
V
2. DEFINICION
Un ResultSet contiene todas las filas que satisfacen las condiciones de una
sentencia SQL y proporciona el acceso a los datos de estas filas mediante un
conjunto de métodos get que permiten el acceso a las diferentes columnas de
las filas. El método ResultSet.next se usa para moverse a la siguiente fila del
result set,convirtiendo a ésta en la fila actúal.
Sintaxis
java.sql.Statement stmt = conn.createStatement();
ResultSet r = stmt.executeQuery("SELECT nombre de los campos
FROM Table1");
while (r.next())
{int i = r.getInt("a");
String s = r.getString("b");
float f = r.getFloat("c");
System.out.println("ROW = " + i + " " + s + " " + f);}
3. Filas y Cursores
Un ResultSet mantiene un cursor que apunta a la fila
actúal de datos. El cursor se mueve una fila hacia
abajo cada vez que se llama al método next.
Incialmente se sitúa antes de la primera fila, por lo
que hay que llamar al método next para situarlo en la
primera fila conviertiendola en la fila actúal. Las filas
de ResultSet se recuperan en secuencia desde la fila
más alta a la más baja. Un cursor se mantiene válido
hasta que el objeto Resultset o su objeto padre
Statement se cierra.
4. Columnas
Los métodos getXXX suministran los medios para recuperar los valores de las
columnas de la fila actúal. Dentro de cada fila, los valores de las columnas
puedenrecuperarse en cualquier orden.
Puede usarse o bien el nombre de la columna o el número de columna para
referirse a esta. Por ejemplo: si la columna segunda de un objeto RecordSet rs se
denomina “title” y almacena valores de cadena, cualquiera de los dos ejemplos
siguientes nos devolverá el valor almacenado en la columna.
String s = rs.getString("title");
String s = rs.getString(2);
Nótese que las columnas se numeran de izquierda a derecha comenzando con la
columna 1. Además los nombres usados como input en los métodos getXXX son
insensibles a las mayúsculas.
5. Tipos de datos y conversiones.
Para los métodos getXXX, el driver JDBC intenta convertir los datos subyacentes a
tipos de datos Java . Por ejemplo, si el método getXXX es getString y los tipos de
datos de la base de datos en la base subyacente es VARCHAR, el driver JDBC
convertirá VARCHAR en String de Java. El valor devuelto por getString será un
objeto Java de tipo String.
Por ejemplo, cualquier método getXXX excepto
getBytes o getBinaryStream puede
usarse para recuperar valores de tipo LONGVARCHAR,
pero se recomienda usar
getAsciiStream o getUnicodeStream, dependiendo de
que tipo de dato se devuelve.
7. Valores resultado NULL
Para determinar si un valor resultado dado es JDBC NULL, primero debe
intentarse leer la columna y usar el método ResultSet.wasNull para descubrir si el
valor devuelto es JDBC NULL
Un valor null de Java para
aquellos métodos getXXX
que devuelven objetos
Java (tales como getString,
getBigDecimal, getBytes,
getDate,getTime,getTimest
amp,getAsciiStream,
getUnicodeStream,
getBinaryStream,getObjet)
.
Un valor cero para
getByte, getShort,
getInt, getLong,
getFloat y getDouble
Un valor false para
getBoolean.
8. Soporte de ResultSetMetaData
Cuando se llama al método getMetaData en un objeto ResultSet, el método
devuelve un objeto ResultSetMetaData que describe las columnas de ese
objeto ResultSet. En los casos en que la sentencia SQL que se va a procesar
no se conoce hasta el momento de la ejecución, puede utilizarse
ResultSetMetaData para determinar cuál de los métodos get hay que
emplear para recuperar los datos.
El ejemplo de código siguiente utiliza ResultSetMetaData para determinar
cada uno de los tipos de columna del conjunto de resultados.
ResultSet rs = stmt.executeQuery(sqlString);
ResultSetMetaData rsmd = rs.getMetaData();
int colType [] = new int[rsmd.getColumnCount()];
for (int idx = 0, int col = 1; idx < colType.length; idx++, col++)
colType[idx] = rsmd.getColumnType(col);
9. Características de ResultSet
Por defecto, el tipo de todos los
ResultSets creados es solo de reenvío, la
concurrencia es solo de lectura y los
cursores se retienen en los límites del
compromiso. Una excepción de ello la
presenta WebSphere, que actualmente
cambia el valor predeterminado de la
capacidad de retención de cursores para
que los cursores se cierren
implícitamente al comprometerse. Estas
características pueden configurarse
mediante los métodos accesibles en
objetos Statement, PreparedStatement y
CallableStatement.
10. Tipos de ResultSet
TYPE_FORWARD_ONLY
Un cursor que solo
puede utilizarse para
procesar desde el
principio de un
ResultSet hasta el final
del mismo. Este es el
tipo por omisión.
TYPE_SCROLL_INSENSITIVE
Un cursor que se puede
emplear para desplazares a
través de un ResultSet. Este
tipo de cursor es insensible
a los cambios efectuados en
la base de datos mientras
está abierto.
TYPE_SCROLL_SENSITIV
Un cursor que puede
utilizarse para el
desplazamiento en
diversas formas a través
de un ResultSet. Este tipo
de cursor es sensible a los
cambios efectuados en la
base de datos mientras
está abierto.E
Nota: las propiedades de agrupación por bloques habilitada y de
conexión de tamaño de bloque afectan al grado de sensibilidad de
un cursor TYPE_SCROLL_SENSITIVE. La agrupación por bloques
mejora el rendimiento al almacenar en caché datos de la propia
capa del controlador JDBC.
11. Concurrencia
La concurrencia determina si el ResultSet puede actualizarse. Los tipos se
definen de nuevo mediante constantes de la interfaz ResultSet.
CONCUR_READ_ONLY
Un ResultSet que solo puede
utilizarse para leer datos de la
base de datos. Este es el valor
predeterminado.
CONCUR_UPDATEABLE
Un ResultSet que permite
efectuar cambios en el mismo.
Estos cambios pueden colocarse
en la base de datos subyacente.
Nota: Según la especificación JDBC, el controlador
JDBC puede cambiar el tipo de ResultSet del valor
de concurrencia de ResultSet si los valores no
pueden utilizarse conjuntamente
12. Capacidad de retención
La característica de capacidad de retención determina si la llamada al
compromiso en el objeto Connection cierra el ResultSet. La API de JDBC
destinada a trabajar con la característica de capacidad de retención es nueva
en la versión 3.0. Sin embargo, el controlador JDBC nativo ha proporcionado
una propiedad de conexión para varios releases que le permite especificar
ese valor predeterminado para todos los ResultSets creados bajo la conexión
HOLD_CURSOR_OVER_COMMIT
Todos los cursores abiertos permanecen así
cuando se llama a la cláusula commit. Este es el
valor predeterminado del controlador JDBC
nativo.
CLOSE_CURSORS_ON_COMMIT
Todos los cursores abiertos se cierran cuando se llama a
la cláusula commit.
Nota: Al llamar a la retrotracción en una conexión, siempre
se cierran todos los cursores abiertos. Este es un hecho
poco conocido, pero es una forma común de que las bases
de datos manejen los cursores.