martes, 22 de noviembre de 2016

ResultSet-DESARROLLO DE SOFTWARE I



DESARROLLO DE SOFTWARE I




Tema:   ResultSet

.    1.  Contenido
    *    Definición:  
La interfaz ResultSet proporciona acceso a los resultados generados al ejecutar consultas. Es la representación en memoria de las tablas de la base de datos en disco, se puede entender como una tabla virtual, recordar que generalmente todos los procesos que se realicen con la tabla (insertar registros, eliminar registros, etc) se realizarán realmente contra un resultSet y no provocarán ningún cambio en la tabla física en disco, resultSet tiene un conjunto de métodos muy útiles y muy usados para el proceso de los renglones de la tabla virtual.
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 la filas. El método ResultSet.next se usa para moverse a la siguiente fila del resultSet, convirtiendo a ésta en la fila actual.
Un conjunto de resultados contiene registros
Una Resultes consiste en registros. Cada registro contiene un conjunto de columnas. Cada registro contiene la misma cantidad de columnas, aunque no todas las columnas pueden tener un valor. Una columna puede tener un null valor. He aquí un ejemplo de una ResultSet:



ejemplo ResultSet - registros con columnas

ResultSet tiene 3 columnas diferentes (nombre, edad, sexo), y 3 registros con valores diferentes para cada columna.
Creación de un conjunto de resultados
Se crea una Resultes ejecutando una Statement o PreparedStatement, como este:
Declaración Declaración = Connection.createStatement ();

resultado conjunto de resultados = Statement.executeQuery ( "SELECT * FROM personas");
O como esto:
sql String = "SELECT * FROM personas";
Declaración PreparedStatement = Connection.prepareStatement (sql);

resultado conjunto de resultados = Statement.executeQuery ();

Tipo conjunto de resultados, concurrencia y capacidad de retención

Cuando se crea una ResultSet hay tres atributos que se pueden establecer. Estos son:
  1. tipo
  2. concurrencia
  3. holdability 
Se establece éstos ya cuando se crea la Statement o PreparedStatement, como este:

Declaración Declaración = Connection.createStatement (
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT
   );

Declaración PreparedStatement = Connection.prepareStatement (sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT
   );
Precisamente lo que significan estos atributos se explica más adelante en este texto. Pero ahora ya dónde especifica ellos.
Iterando el conjunto de resultados
Para repetir el ResultSet que se utiliza el next() método. El next() método devuelve verdadero si el ResultSet tiene un siguiente registro, y mueve el ResultSet apuntar al siguiente registro. Si no hubiera más registros, next() devuelve false, y ya no se puede. Una vez que el next() método ha vuelto falso, no debería llamar más. Si lo hace, puede dar lugar a una excepción.
Aquí está un ejemplo de una iteración a ResultSet usar el next() método:
while (result.next ()) {
    // ... Obtener valores de columna de este registro
}

Como se puede ver, el next() método se llama en realidad antes de que se accede al primer registro. Eso significa, que los ResultSet comienza señalando antes del primer registro. Una vez next() que se ha llamado una vez, se señala en el primer registro.
Del mismo modo, cuando next() se llama y vuelve falsa, la ResultSet apunta realmente después del último registro.
No se puede obtener el número de filas de una ResultSet excepción si iterar todo el camino a través de él y contar las filas. Sin embargo, si el ResultSet es de sólo avance, puede no después desplazarse hacia atrás a través de él. Incluso si se pudiera mover hacia atrás, lo haría de una manera lenta de contar las filas de la ResultSet. Usted es mejor estructuración de su código para que usted no necesita saber el número de registros antes de tiempo.

Tipos ResultSet

Una ResultSet puede ser de un tipo determinado. El tipo determina algunas características y capacidades del ResultSet.
No todos los tipos son compatibles con todas las bases de datos y controladores JDBC. Usted tendrá que comprobar su base de datos y el controlador JDBC para ver si es compatible con el tipo que desea utilizar. El DatabaseMetaData.supportsResultSetType(int type) método devuelve verdadero o falso dependiendo de si el tipo dado es compatible o no. La DatabaseMetaDataclase está cubierto en un texto posterior.
En el momento de escribir hay tres Resultes tipos:
  1. ResultSet.TYPE_FORWARD_ONLY
  2. ResultSet.TYPE_SCROLL_INSENSITIVE
  3. ResultSet.TYPE_SCROLL_SENSITIVE
El tipo predeterminado es TYPE_FORWARD_ONLY
TYPE_FORWARD_ONLY significa que el ResultSet Sólo podrá navegar hacia adelante. Es decir, sólo se puede pasar de la fila 1, a la fila 2, a la fila 3, etc. No se puede mover hacia atrás en el ResultSet.
TYPE_SCROLL_INSENSITIVE significa que la ResultSet puede navegarse (volutas) tanto hacia delante como hacia atrás. También puede saltar a una posición relativa a la posición actual, o saltar a una posición absoluta. El ResultSet no es sensible a los cambios en la fuente de datos subyacente, mientras que laResultSet está abierta. Es decir, si un registro en el ResultSet se cambia en la base de datos por otro subproceso o proceso, que no se reflejarán en la ya abierta ResultSet's de este tipo.
TYPE_SCROLL_SENSITIVE significa que la ResultSet puede navegarse (volutas) tanto hacia delante como hacia atrás. También puede saltar a una posición relativa a la posición actual, o saltar a una posición absoluta. El ResultSet es sensible a los cambios en la fuente de datos subyacente, mientras que la Resultes está abierta. Es decir, si un registro en el ResultSet se cambia en la base de datos por otro subproceso o proceso, que se verá reflejado en la ya abierta ResulsSet's de este tipo.

Métodos de navegación

La Resultes interfaz contiene los siguientes métodos de navegación. Recuerde, no todos los métodos funcionan con todos los ResultSet tipos. ¿Qué métodos funciona depende de su base de datos, controlador JDBC, y el ResultSet tipos?

Método
Descripción
absolute()
Mueve el ResultSet señalar en una posición absoluta. La posición es un número de fila se pasa como parámetro al absoluta() método.
afterLast()
Mueve el ResultSet apuntar después de la última fila de la Resultes.
beforeFirst()
Mueve el ResultSet al punto anterior a la primera fila de la Resultes.
first()
Mueve el ResultSet señalar en la primera fila de la Resultes.
last()
Mueve el ResultSet señalar en la última fila de la Resultes.
next()
Mueve el ResultSet apunte a la siguiente fila en el Resultes.
previous()
Mueve el ResultSet apunte a la fila anterior en el Resultes.
relative()
Mueve el ResultSet apuntar a una posición con respecto a su posición actual. La posición relativa se pasa como un parámetro al método relativo, y puede ser tanto positiva como negativa.
mueve el Resultes

La ResultSet interfaz también contiene un conjunto de métodos que puede utilizar para obtener información sobre la posición actual de la Resultes. Estos son:

Método
Descripción
getRow()
Devuelve el número de fila de la fila actual - la fila actualmente apuntada por el ResultSet.
getType()
Devuelve el ResultSet tipo.
isAfterLast()
Devuelve verdadero si los ResultSet puntos después de la última fila. False en caso contrario.
isBeforeFirst()
Devuelve verdadero si los ResultSet puntos antes de la primera fila. False en caso contrario.
isFirst()
Devuelve verdadero si los ResultSet puntos en la primera fila. False en caso contrario.

Por último, la ResultSet interfaz también contiene un método para actualizar una fila con los cambios de base de datos, si el ResultSet es sensible al cambio.

Método
Descripción
refreshRow()
Actualiza los valores de las columnas de la fila con los valores más recientes de la base de datos.

    *      Propiedades:
     En la lista siguiente se resumen las propiedades del objeto ResultSet:
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.
Es útil si los resultados incluyen uno o más campos que contienen una entrada de texto larga, de varias líneas, y existe la posibilidad de que al capturar los datos se produzca un desbordamiento del espacio de almacenamiento intermedio. También resulta útil si se desea examinar los resultados y obtener mejor rendimiento.
De forma predeterminada, no existe límite para la longitud de los datos obtenidos de un campo de texto de varias líneas.
Puede restablecer el valor predeterminado estableciendo el parámetro de longitud en cero (0).
El límite se aplica a los campos de serie cortos así como también a los campos de texto de varias líneas. Un campo de serio corto puede tener 254 caracteres, de forma que puede establecer un límite para ello.
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.
El valor de MaxResultSetRows es el valor del límite inicial que limita el número de filas en ResultSet. Los clientes pueden alterar temporalmente el límite inicial, siempre que el valor del límite inicial no sea menor que el límite final o absoluto. Cuando el valor de MaxResultSetRows es 0, se utiliza el límite absoluto. 
RecordCount: Devuelve el recuento de registros (número de filas) del conjunto de resultados.
Para obtener un recuento de registros, en primer lugar debe utilizar EnableRecordCount para habilitar el recuento de filas y, a continuación, debe llamar a RecordCount (GetRecordCount, para Perl) para obtener el número de registros.
    *    Ejemplos:
La consulta y el ResultSet
Primero se obtiene la conexión a la base de datos con un código como este:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/prueba","usuario","clave");
 Por supuesto tendrás que cambiar el "usuario" y "clave" por los que tú tengas en la base de datos. También, si la base de datos no corre en tu ordenador local, tienes que cambiar "localhost" por el nombre o IP del ordenador donde corra la base de datos.
El siguiente paso es realizar la consulta y obtener el ResultSet. El código es el siguiente
Statement s = conexion.createStatement();
ResultSet rs = s.executeQuery("select * from persona");
Ahora veremos como enviar la sentencia SELECT de la página anterior desde un programa escrito en Java y cómo obtener los resultados que hemos mostrado.
JDBC devuelve los resultados en un objeto ResultSet, por eso necesitamos declarar un ejemplar de la clase ResultSet para contener los resultados. El siguiente código presenta el objeto ResultSet: rs y le asigna el resultado de una consulta anterior.
ResultSet rs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES"); 
   2.     Resumen:
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 la filas. El método ResultSet.next se usa para moverse a la siguiente fila del ResultSet, convirtiendo a ésta en la fila actúal.
El formato general de un ResultSet es una tabla con cabeceras de columna y los valores correspondientes devueltos por la ‘query’. 
Un ResultSet mantiene un cursor que apunta a la fila actual 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 convirtiéndola en la fila actual. 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 bloqueadas y por tanto que estas operaciones no provoquen actualizaciones anómalas ni otros problemas de concurrencia. 
3. Summary:
A ResultSet contains all rows that satisfy the conditions of an SQL statement and provides access to the data in these rows by a set of get methods that allow access to the different columns of the rows. The ResultSet.next method is used to move to the next row of the ResultSet, making it the current row.
The general format of a ResultSet is a table with column headers and corresponding values ​​returned by the query.
A ResultSet holds a cursor pointing to the current row of data. The cursor moves one row down each time the next method is called. Initially it is placed before the first row, so you have to call the next method to place it in the first row by converting it to the current row. The ResultSet rows are retrieved in sequence from the highest to the lowest row.
A cursor remains valid until the Resultset object or its Statement parent object is closed.
In SQL, the result cursor for a table is named. If a database allows positioned upadtes or positioned deletes, the cursor name is necessary and must be provided as a parameter of the update or delete command. The name of the cursor can be obtained by calling the getCursorName method.
Not all databases support positioned updates or deletes. The DatabaseMetaData.supportsPositionedDelete and DatabaseMetaData.supportsPositionedUpdate methods allow us to discover if these operations are supported on a given connection. When they are, the driver or DBMS must ensure that the selected rows are properly locked and therefore these operations do not cause anomalous updates or other concurrency problems. 
4.    Recomendaciones:
·        Si abrimos el objeto ResultSet tenemos que cerrar inmediatamente el ResultSet, liberando  los recursos utilizados: public abstract void close() throws SQLException
·     Tener en cuenta que las características de un ResultSet no cambian una vez que se ha  creado el objeto ResultSet

·         Para crear un objeto ResultSet, puede utilizar los métodos executeQuery u otros métodos.
 5.   Conclusiones:
 El objeto ResultSet proporciona varios métodos para obtener los datos de columna    correspondientes a una fila.
·    Existen métodos de ResultSet para obtener el tipo de ResultSet y la concurrencia del  ResultSet, pero no existe ningún método para obtener la capacidad de retención del  ResultSet.
·       La característica de capacidad de retención determina si la llamada al compromiso en el  objeto Connection cierra el ResultSet
 6.  Apreciación del Equipo:
Nuestra apreciación con respecto al trabajo realizado, sobre el tema de ResultSet lo definimos como un objeto que es usado para obtener Resultados generados al ejecutar consultas.
Esperamos que este trabajo le sea útil a la persona interesadas.

 7. Glosario:
Iterando: Significa el acto de repetir un proceso con la intención de alcanzar una meta deseada, objetivo o resultado.
Null: En programación, null resulta ser un valor especial aplicado a un puntero (o referencia) usado para indicar que no se apunta a un objeto o dato válidos.
Controladores: Emplean servicios o aplicaciones cliente para conectarse y consulta de datos.
JDBC: Es una interfaz de programación de aplicaciones (API) para el lenguaje de programación Java , que define como un cliente puede acceder a una base de datos .
Localhost: El nombre  localhost  es traducido como la dirección IP de loopback 127.0.0.1 en IPv4, o como la dirección ::1 en IPv6.

 8.   Linkografía:
·     http://www.programacionfacil.com/java_jsp/resultset_mysql.html
  http://www.ibm.com/support/knowledgecenter/es/SSSH5A_9.0.0/com.ibm.rational.clearque st.apiref.doc/topics/r_resultset_recordcnt.htm
·      http://tutorials.jenkov.com/jdbc/resultset.html





















No hay comentarios.:

Publicar un comentario