viernes, 1 de diciembre de 2017

RESULTSET

                                                                                    
                                                                                  


                                           "AÑO DEL BUEN SERVICIO AL CIUDADANO"


                          ESCUELA ACADÉMICA INGENIERÍA DE SISTEMAS Y TELEMÁTICA


                                                                    ASIGNATURA

                                              LABORATORIO DE PROGRAMACIÓN II


                                                                           TEMA

                                                         JAVA CON BASE DE DATOS

                                                                         AUTORES

                                                   RAMOS FERNÁNDEZ SONIA ELVIRA


                                                                         DOCENTE

                                            ING. MARCO AURELIO PORRO CHULLI


                                                    BAGUA GRANDE-UTCUBAMBA

                                                                        AMAZONAS 

                                                                               2017


1.     CONTENIDO.
v    DEFINICION:

El objeto ResultSet proporciona varios métodos para obtener los datos de columna correspondientes a una 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.

Los ResultSet son cursores de base de datos rápidos que admiten el enlace de datos de interfaz de usuario, el desplazamiento hacia delante y hacia atrás, y la actualización de datos en la base de datos. Como modelo de conexión permanente, ResultSet mantienen una conexión activa a la base de datos.

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 fila. El método ResultSet.next se usa para moverse a la siguiente fila del resultSet, convirtiendo a ésta en la fila actual.

El formato general de un resultSet 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 actual de datos. El cursor se mueve una fila hacia abajo cada vez que se llama al método next. Inicialmente 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 updates 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 de que las filas seleccionadas están apropiadamente bloquedas y por tanto que estas operaciones no provoquen actualizaciones anómalas ni otros problemas de concurrencia.

Columnas:

Los métodos getXXX suministran los medios para recuperar los valores de las columnas de la fila actual. 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 resultSet 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 número, tipo y propiedades de las columnas de los objetos ResultSet.
Si se conoce el nombre de una columna, pero no su índice, puede usarse el método findColumn para encontrar el número de columna.

v    PROPIEDADES:

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.

SINTAXIS:

resultset.MaxMultiLineTextLength
resultset.MaxMultiLineTextLength max_length

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.

SINTAXIS:

resultset.MaxResultSetRows
resultset.MaxResultSetRows limit

RecordCount

Devuelve el recuento de registros (número de filas) del conjunto de resultados.

SINTAXIS:

resultset.RecordCount

v    EJEMPLOS:

1.            Un ejemplo de cómo podemos usar un objeto ResultSet es:

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   ResultSet rs= stmt.executeQuery("SELECT nombre, apellido FROM usuario");

   while(rs.next()){
       String nom=rs.getString(1);
       String ape=rs.getString("apellido");
   }
}
catch (SQLException e) {
}
finally {
   stmt.close();
   conn.close();
}

De esta forma vemos cómo podemos obtener los valores devueltos por la consulta, y además vimos cómo obtener dicho valor conociendo el número de la columna o el nombre de la columna. Usamos un loop, en este caso while, para ir recorriendo fila a fila todo el objeto ResultSet e ir sacando el nombre y el apellido de todos los registros obtenidos a partir de la consulta.

2.            Éste es un ejemplo de cómo utilizar la interfaz ResultSet

import java.sql.*;

/**
ResultSetExample.java
Este programa muestra la utilización de ResultSetMetaData y ResultSet para visualizar todos los datos de una tabla aunque el programa que obtiene los datos no sabe cuál es el aspecto que tendrá la tabla (el usuario pasa los valores correspondientes a la tabla y a la biblioteca).
**/
public class ResultSetExample {

    public static void main(java.lang.String[] args)
    {
        if (args.length != 2) {
            System.out.println("Uso:  java ResultSetExample <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;
            while (rs.next()) {
                rowCount++;
                System.out.println("Datos para la fila " + rowCount);
                for (int i = 1; i <= colCount; i++)
                    System.out.println("   Fila " + i + ": " + rs.getString(i));
            }

        } 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.          RESUMEN:

Qué es y cómo podemos usar un objeto ResultSet, como ya vimos anteriormente, un objeto Connection realiza la conexiona a la Base de Datos y con ayuda de un objeto Statement realiza consultas, entre otras sentencias, dichas consultas nos devuelven un conjunto de resultados, estos resultados son almacenados en un objeto tipo ResultSet, el cual veremos en el dia de hoy.
Una vez obtenido el objeto ResultSet procedemos a extraer la información que obtuvimos de la consulta a la Base de Datos, para hacer esto hacemos uso de los métodos y funciones del objeto ResultSet tales como next (), first(), last(), etc., que nos sirve para movernos entre las diferentes filas del conjunto de resultados.
Adicionalmente esta clase nos ofrece una gran variedad de métodos para obtener los valores de los campos del conjunto de resultados obtenidos por la consulta que se realizó, por ejemplo si necesitamos obtener un valor entero, tenemos el método getInt (), con dos variantes la primer getInt (int x) donde x es el número de la columna de la consulta retornada o getInt (String nombre) donde nombre es el nombre de la columna de la consulta retornada. De esta forma obtenemos el valor almacenado en esa columna para la fila actual. Luego pasamos a la siguiente fila usando el método next () y así hasta que no hayan más filas.

3.          SUMMARY:

Today we will see what it is and how we can use a ResultSet object, as we saw earlier, a Connection object connects to the Database and with the help of a Statement object makes queries, among other statements, these queries return a set of results , these results are stored in a ResultSet type object, which we will see today.

Once obtained the ResultSet object we proceed to extract the information that we obtained from the query to the Database, to do this we make use of the methods and functions of the ResultSet object such as next (), first (), last (), etc. , which helps us move between the different rows of the result set.

Additionally this class offers us a great variety of methods to obtain the values ​​of the fields of the set of results obtained by the query that was made, for example if we need to obtain an integer value, we have the method getInt (), with two variables the first getInt (int x) where x is the number of the column of the returned query or getInt (String name) where name is the name of the column of the returned query. In this way we obtain the value stored in that column for the current row. Then we move to the next row using the next () method and so on until there are no more rows.

4.          RECOMENDACIONES:

v  Se recomienda declarar un objeto de la clase ResultSet para poder obtener las consultas que le hayamos dicho que nos muestre.

v Si abrimos el objeto ResultSet tenemos que cerrar inmediatamente el ResultSet, liberando los recursos utilizados: public abstract void close() throws SQLException.

v Para que el ResultSet, no se congestione o entienda más rápido, en las consultas deberíamos utilizar los campos específicos en vez del.

v Se recomienda usar esta clase para poder obtener los datos de una tabla mediante métodos ofrecidos por el ResultSet que luego los obtendrás en un formulario.

5.          CONCLUSIONES:

La variable Resultset fue declarada fuera de todos los métodos, es decir son globales y pueden verse en toda la clase no importa en qué proceso lo utilizemos, es sencillo recordemos algo de teoria, toda funcion retorna un valor en que se utiliza respectivamente para procesar Resultados.
Todas la variables de conexion (cn), Statement (St) y ResultSet(reg) fueron declaradas fuera de todos los metodos, es decir son globales y pueden verse en toda la clase no importa en qué proceso lo utilizemos, y para saldar la duda, anteriormente dije que todos estos son metodos, asi es pero por que ejecutar y consulta los llame funciones, es sencillo recordemos algo de teoria, toda funcion retorna un valor es por ello que se le llama funciones a ejecutar y a consulta por que regresan el valor de la variable error y reg respectivamente.

6.          LINKOGRAFIAS.