- CRISTHIAN SERGIO KAYAP YAGKIKAT
- INGRID LESLY CORONEL ACUÑA
DOCENTE: PORRO CHULLI, Marco Aurelio
ResultSet
El
objeto ResultSet proporciona varios métodos para obtener los datos de columna
correspondientes a un fila. Todos ellos tienen el formato get<Tipo>,
siendo <Tipo> un tipo de datos Java™. Algunos ejemplos de estos métodos
son getInt, getLong, getString, getTimestamp y getBlob. Casi todos estos
métodos toman un solo parámetro, que es el índice que la columna tiene dentro
del ResultSet o bien el nombre de la columna.
Las
columnas de ResultSet están numeradas, empezando por el 1. Si se emplea el
nombre de la columna y hay más de una columna que tenga ese mismo nombre en el
ResultSet, se devuelve la primera. Algunos de los métodos get<Tipo>
tienen parámetros adicionales, como el objeto opcional Calendar, que se puede
pasar a los métodos getTime, getDate y getTimestamp. Consulte el Javadoc del
paquete java.sql para obtener todos los detalles.
En los
métodos get que devuelven objetos, el valor de retorno es null cuando la
columna del ResultSet es nula. En tipos primitivos, no puede devolverse null.
En estos casos, el valor es 0 o false. Si una aplicación debe distinguir entre
null, y 0 o false, puede utilizarse el método wasNull inmediatamente después de
la llamada. A continuación, este método puede determinar si el valor era un
valor 0 o false real o si ese valor se ha devuelto debido a que el valor de
ResultSet era de hecho null.
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 actual.
El
formato general de un result set es una tabla con cabeceras de columna y los
valores correspondientes devueltos por la ‘query’. Por ejemplo, si la ‘query’
es SELECT a, b, c FROM Table1, el resultado tendrá una forma semejante a:
a b c
--------
--------- --------
12345
Cupertino CA
83472
Redmond WA
83492
Boston MA
El
siguiente fragmento de código es un ejemplo de la ejecución de una sentencia
SQL que devolverá una colección de filas, con la columna 1 como un int, la
columna 2 como una String y la columna 3 como un array de bytes:
java.sql.Statement
stmt = conn.createStatement();
ResultSet
r = stmt.executeQuery("SELECT a, b, c FROM Table1");
while
(r.next())
{
//
print the values for the current row.
int i
= r.getInt("a");
String
s = r.getString("b");
float
f = r.getFloat("c");
System.out.println("ROW
= " + i + " " + s + " " + f);
}
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.
En SQL,
el cursor resultado para una tabla tiene nombre. Si una base de datos permite
upadtes posicionados o deletes posicionados, el nombre del cursor es necesario
y debe ser proporcionado como un parámetro del comando update o delete. El
nombre del cursor puede obtenerse mediante una llamada al método getCursorName.
No
todas las bases de datos soportan updates o deletes posicionados. Los métodos
DatabaseMetaData.supportsPositionedDelete y
DatabaseMetaData.supportsPositionedUpdate nos permiten descubrir si estas
operaciones están soportadas en una conexión dada. Cuando lo están, el driver o
la DBMS deben asegurarse que las filas seleccionadas están apropiadamente
bloquedas y por tanto que estas operaciones no provoquen actualizaciones
anomalas ni otros problemas de concurrencia.
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
pueden recuperarse en cualquier orden, pero para asegurar la máxima portabilidad,
deberían extraerse las columnas de izquierda a derecha y leer los valores de
las columnas una única vez.
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.
La
opción de usar el nombre de columna fue provista para que el usuario que
especifica nombres de columnas en una ‘query’ pueda usar esos nombres como
argumentos de los métodos getXXX. Si, por otro lado, la sentencia select no
especifica nombres de columnas (tal como en “select * from table1” o en casos
donde una columna es derivada), deben usarse los números de columna. En estas
situaciones , no hay forma de que el usuario sepa con seguridad cuales son los
nombres de las columnas.
En
algunos casos, es posible para una query SQL devolver un result set con más de
una columna con el mismo nombre. Si se usa el nombre de columna como argumento
en un método getXXX, éste devolverá el valor de la primera columna que coincida
con el nombre. Por eso, si hay múltiples columnas con el mismo nombre, se
necesita usar un índice de columna para asegurarse que se recupera el valor de
la columna correcta. Esto puede ser ligeramente más eficiente que usar los
números de columna.
Información
acerca de las columnas en un ResultSet es accesible mediante el método
ResultSet.getMetaData. El objeto ResultSetMetaData devuelto nos da el numero,
tipo y propiedades de las columnas de los objetos ResultSet.
Si se
conoce el nombre de una columna, pero no su indice, puede usarse el método
findColumn para encontrar el número de columna.
Los
métodos
Siguiente
fila: next()
public
abstract boolean next() throws SQLException
Pasa a
la siguiente fila, o a la primera cuando se ejecuta por primera vez. Devuelve
true si se consigue y false si no quedan filas.
Cierre
del ResultSet: close()
public
abstract void close() throws SQLException
Cierra
inmediatamente el ResultSet, liberando los recursos utilizados.
Resultados
nulos: wasNull()
public
abstract boolean wasNull() throws SQLException
Se usa
después de obtener un null con un método getXXX() para comprobar que
corresponde a un valor NULL SQL.
Obtención
de valores: getXXX()
public
abstract tipoJava getXXX(int indiceColumna) throws SQLException
public
abstract tipoJava getXXX(String nombreColumna) throws SQLException
Obtienen
el valor contenido en la columna como un tipoJava, o un null si se trataba de
un valor NULL de SQL.
Método getXXX()
|
Tipo Java
|
getString
|
String
|
getBoolean
|
boolean
|
getByte
|
byte
|
getShort
|
short
|
getInt
|
int
|
getLong
|
long
|
getFloat
|
float
|
getDouble
|
double
|
getBigDecimal*
|
BigDecimal
|
getBytes
|
byte[]
|
getDate
|
Date
|
getTime
|
Time
|
getTimestamp
|
Timestamp
|
getAsciiStream**
|
InputStream
|
getUnicodeStream**
|
InputStream
|
getBinaryStream**
|
InputStream
|
**
Traducen el valor a cadenas de caracteres ASCII, Unicode o bytes. Estas
corrientes deben leerse completas antes de continuar con ninguna otra columna,
ya que esto provocaría el cierre automático de la corriente.
public
abstract BigDecimal getBigDecimal (columna, int precision) throws SQLException
Donde
precision indica el número de cifras decimales.
Lectura
de avisos: getWarnings()
public
abstract SQLWarning getWarnings() throws SQLException
Obtiene
el primer aviso de la cadena de avisos SQL producidos durante el trabajo con
este ResultSet o null si no hay ninguno. La cadena de avisos se renueva con
cada fila.
Borrado
de avisos: clearWarnings()
public
abstract void clearWarnings() throws SQLException
Borra
todos los avisos de la cadena.
Obtención
del nombre del cursor: getCursorName()
public
abstract String getCursorName() throws SQLException
Obtiene
el nombre del cursor asignado a este ResultSet.
Propiedades
del ResultSet: getMetaData()
public
abstract ResultSetMetaData getMetaData() throws SQLException
Obtiene
en un objeto ResultSetMetaData información sobre el número de columnas y su
estructura.
Obtención
de Objetos: getObject()
public
abstract Object getObject(int indiceColumna) throws SQLException
public
abstract Object getObject(int nombreColumna) throws SQLException
Obtiene
el valor contenido en la columna como un objeto Java cuyo tipo sigue la traducción
estándar JDBC de tipos SQL a tipos Java. Este método es válido para tipos
específicos de la base de datos.
Indices
de las columnas: findColumn()
public
abstract int findColumn(String nombreColumna) throws SQLException
Obtiene
el índice de una columna conocido su nombre.
Recuperar
datos de ResultSet
Las
columnas de ResultSet están numeradas, empezando por el 1. Si se emplea el
nombre de la columna y hay más de una columna que tenga ese mismo nombre en el
ResultSet, se devuelve la primera. Algunos de los métodos get<Tipo>
tienen parámetros adicionales, como el objeto opcional Calendar, que se puede
pasar a los métodos getTime, getDate y getTimestamp. Consulte el Javadoc del
paquete java.sql para obtener todos los detalles.
En los
métodos get que devuelven objetos, el valor de retorno es null cuando la
columna del ResultSet es nula. En tipos primitivos, no puede devolverse null.
En estos casos, el valor es 0 o false. Si una aplicación debe distinguir entre
null, y 0 o false, puede utilizarse el método wasNull inmediatamente después de
la llamada. A continuación, este método puede determinar si el valor era un
valor 0 o false real o si ese valor se ha devuelto debido a que el valor de
ResultSet era de hecho null.
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);
Propiedades
del objeto ResultSet
En la
lista siguiente se resumen las propiedades del objeto ResultSet:
Nombre
de propiedad
MaxMultiLineTextLength
Establece
o devuelve el límite actual de longitud de datos obtenido de un campo de texto
de varias líneas. El límite se aplica a los campos de serie cortos así como
también a los campos de texto de varias líneas.
MaxResultSetRows
Establece
o devuelve el límite inicial sobre el número de registros que se incluirá en el
conjunto de resultados cuando se ejecuta una consulta.
RecordCount
Devuelve
el recuento de registros (número de filas) del conjunto de resultados.
EJEMPLOS
1. Este programa hace una demostración
de cómo utilizar un ResultSetMetaData y un ResultSet para visualizar todos los
metadatos de ResultSet creado al consultar una tabla. El usuario pasa el valor
de la tabla y la biblioteca.
import
java.sql.*;
ResultSetMetaDataExample.java
Este
programa muestra la utilización de ResultSetMetaData y
ResultSet
para visualizar todos los metadatos relacionados con un ResultSet
creado
al consultar una tabla. El usuario pasa el valor correspondiente a
la
tabla y a la biblioteca.
**/
public
class ResultSetMetaDataExample {
public static void main(java.lang.String[]
args)
{
if (args.length != 2) {
System.out.println("Uso: java ResultSetMetaDataExample
<biblioteca> <tabla>");
System.out.println("siendo
<biblioteca> la biblioteca que contiene la <tabla>");
System.exit(0);
}
Connection con = null;
Statement s = null;
ResultSet rs = null;
ResultSetMetaData rsmd = null;
try {
// Obtener una conexión a base de
datos y preparar una sentencia.
Class.forName("com.ibm.db2.jdbc.app.DB2Driver");
con =
DriverManager.getConnection("jdbc:db2:*local");
s = con.createStatement();
rs = s.executeQuery("SELECT *
FROM " + args[0] + "." + args[1]);
rsmd = rs.getMetaData();
int
colCount = rsmd.getColumnCount();
int
rowCount = 0;
for
(int i = 1; i <= colCount; i++) {
System.out.println("Información
acerca de la columna " + i);
System.out.println(" Nombre........: " +
rsmd.getColumnName(i));
System.out.println(" Tipo de datos.....: " +
rsmd.getColumnType(i) +" ( " + rsmd.getColumnTypeName(i) + "
)");
System.out.println(" Precisión.....: " +
rsmd.getPrecision(i));
System.out.println(" Escala........: " + rsmd.getScale(i));
System.out.print ("
Permitir nulos: ");
if
(rsmd.isNullable(i)==0)
System.out.println("false");
else
System.out.println("true");
}
} catch (Exception e) {
// Manejar los errores.
System.out.println("Tenemos un
error... ");
e.printStackTrace();
} finally {
// Hay que asegurarse de que siempre se haga
// el
borrado. Si la conexión se cierra, la
//
sentencia que hay debajo de ella también se cerrará.
if
(con != null) {
try {
con.close();
} catch (SQLException e) {
System.out.println("Error
grave: no se puede cerrar el objeto conexión");
}
}
}
}
}
2. package
chuidiang.ejemplos.base_datos;
import
java.sql.*;
/**
* Clase de prueba de conexión con una base de
datos MySQL
*/
public
class PruebaMySQL {
/**
* Crea una instancia de la clase MySQL y
realiza todo el código
* de conexión, consulta y muestra de
resultados.
*/
public PruebaMySQL()
{
// Se mete todo en un try por los
posibles errores de MySQL
try
{
// Se registra el Driver de MySQL
DriverManager.registerDriver(new
org.gjt.mm.mysql.Driver());
// Se obtiene una conexión con la
base de datos. Hay que
// cambiar el usuario
"root" y la clave "la_clave" por las
// adecuadas a la base de datos que
estemos usando.
Connection conexion =
DriverManager.getConnection (
"jdbc:mysql://localhost/prueba","root",
"la_clave");
// Se crea un Statement, para
realizar la consulta
Statement s =
conexion.createStatement();
// Se realiza la consulta. Los resultados
se guardan en el
// ResultSet rs
ResultSet rs = s.executeQuery
("select * from persona");
// Se recorre el ResultSet,
mostrando por pantalla los resultados.
while (rs.next())
{
System.out.println (rs.getInt
("Id") + " " + rs.getString (2)+
" " +
rs.getDate(3));
}
// Se cierra la conexión con la
base de datos.
conexion.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* Método principal, instancia una clase
PruebaMySQL
*
* @param args the command line arguments
*/
public static void main(String[] args)
{
new PruebaMySQL();
}
}
RESUMEN
Casi
todos estos metodos toman un solo parametro, que es el indice que la columna
tiene dentro del Result Set o bien el nombre de la columna.
Si se
emplea el nombre de la columna y hay mas de una columna que tenga ese mismo
nombre en el Result Set, se devuelve la primera.
Un
Result Set 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 metodos get que permiten el acceso a las diferentes columnas de las
filas.
El
siguiente fragmento de codigo es un ejemplo de la ejecucion de una sentencia
SQL que devolvera una coleccion de filas, con la columna 1 como un int, la
columna 2 como una String y la columna 3 como un array de bytes: La opcion de
usar el nombre de columna fue provista para que el usuario que especifica
nombres de columnas en una query pueda usar esos nombres como argumentos de los
metodos get XXX.
SUMMARY
Almost
all of these methods take a single
parameter,
which is the index that the column has within the Result Set or the
name
of the column. If the name of the column is used and there is more than
one
column that has the same name in the Result Set, the first one is returned.
A
Result Set contains all the rows that satisfy the conditions of an SQL
statement
and provides access to the data in these rows using a set of get
methods
that allow access to the different columns of the rows. The following
code
fragment is an example of the execution of an SQL statement that will
return
a collection of rows, with column 1 as an int, column 2 as a String and
column
3 as an array of bytes: The option to use The column name was provided
so
that the user who specifies column names in a query can use those names as
arguments
of get XXX methods.
RECOMENDACIONES:
Nosotras
como estudiantes recomendamos hacer utilidad de este objeto ya que permiten
el fácil acceso a las diferentes columnas de la filas en una Base de
Datos
Además
dentro de cada fila, los valores de las columnas pueden recuperarse en
cualquier orden, pero para asegurar la máxima portabilidad, deberían extraerse
las columnas de izquierda a derecha y leer los valores de las columnas una
única vez.
En
conclusión
Como
un elemento básico del desarrollo de Java, la API JDBC es algo que todos los
desarrolladores Java deben conocer como la parte posterior de su mano. Lo
curioso es que la mayoría de los desarrolladores no se han mantenido al día con
las mejoras de la API a lo largo de los años, por lo que pierden los trucos de
ahorro de tiempo descritos en este artículo.
Si
usted decide utilizar las características más nuevas de JDBC, depende de usted,
por supuesto. Un aspecto clave a considerar será la escalabilidad del sistema
en el que está trabajando. Cuanto mayor sea la escala, más restringido será el
uso de la base de datos y, por lo tanto, más tendrá que reducir el tráfico de
red en su contra. Rowsets, llamadas escalares y actualizaciones por lotes serán
tus amigos aquí. De lo contrario, pruebe los ResultSets desplazables y
actualizables (que no consumen tanta memoria como los conjuntos de filas) y
mida el éxito de escalabilidad. Probablemente no será tan malo como usted
espera.
JDBC
no sólo admite conjuntos de resultados bidireccionales, sino que también admite
actualizaciones en sitio en ResultSets. Esto significa que en lugar de crear
una nueva instrucción SQL para cambiar los valores almacenados actualmente en
la base de datos, sólo puede modificar el valor contenido dentro del ResultSet
y se enviará automáticamente a la base de datos para esa columna de esa fila.
Pedir
un ResultSet actualizable es similar al proceso implicado en pedir un ResultSet
desplazable. De hecho, es donde usará el segundo parámetro para createStatement
(). En lugar de especificar ResultSet.CONCUR_READ_ONLY para el segundo
parámetro, envíe ResultSet.CONCUR_UPDATEABLE.
APRECIACION
DEL EQUIPO
El
hacer la investigación para la elaboración de este informe nos ha servido de
mucho y nos ha dado a conocer lo que es el Objeto Result Set y para qué sirve.
Además
de todo lo que nos dio a conocer esta información se puede decir que ya tenemos
una idea de cómo utilizarlo al elaborar un programa.
GLOSARIO
DE TERMINOS
Sentencia:
una sentencia es una línea de código en algún lenguaje de programación.
Un programa está constituido por múltiples sentencias de programación, lo que
es llamado código fuente.
Método: Un método es una subrutina cuyo código
es definido en una clase y puede pertenecer tanto a una clase, como es el caso
de los métodos de clase o estáticos, como a un objeto, como es el caso de los
métodos de instancia.
Cursor: Es una señal, normalmente
parpadeante, que indica en una pantalla de computadora la posición en la que se
puede realizar una acción.
Parámetro: Es una variable utilizada para
recibir valores de entrada en una rutina o subrutina.
Driver: Un Driver, o controlador, es un
programa que controla un dispositivo. Cada dispositivo, ya sea una impresora,
un teclado, etc., debe tener un programa controlador.
Anómalas:
Es una acción; que se desvía de lo que se considera normal, regular, natural.
Suministran: Dar o proporcionar a una persona
o entidad una cosa que necesita.
BIBLIOGRAFIA
O LINKOGRAFIA
http://www.ibm.com/support/knowledgecenter/es/SSSH5A_9.0.0/com.ibm.rational.clearquest.apiref.doc/topics/c_resultset_ovw.htm
LINK DE LA DIAPOSITIVA RESULTSET
LINK DE LA DIAPOSITIVA RESULTSET
http://es.slideshare.net/INGRIDLESLYCORONELAC/resulteset

No hay comentarios:
Publicar un comentario