STATEMENT


1. CONTENIDO
1.1. Definición
Un objeto Statement se usa para enviar sentencias SQL a la base de datos. Actualmente hay tres tipos de objetos Statement, todos los cuales actúan como contenedores para la ejecución de sentencias en una conexión dada: Statement, PreparedStatement que hereda de Statement y CallableStatement que hereda de PreparedStatement. Estas estàn especializadas para enviar tipos particulares de sentencias SQL, Un objeto Statement se usa para ejecutar una sentencia SQL simple sin parámetros. Un objeto PreparedStatement se usa para ejecutar sentencias SQL precompiladas con o sin parámetros IN; y un objeto CallableStatement se usa para ejecutar un procedimieno de base de datos almacenado.
La interfase Statement suminstra métodos básicos para ejecutar sentencias y devolver resultados. La interfase PreparedStatement añade métodos para trabajat con los parámetros IN; y la interfase CallableStatement añade métodos para trabajar con parameters OUT.
El objeto Statement (sentencia) sirve para procesar una sentencia SQL estática y obtener los resultados producidos por ella. Solo puede haber un ResultSet abierto para cada objeto Statement en un momento dado. Todos los métodos statement que procesan una sentencia SQL cierran implícitamente el ResultSet actual de una sentencia si existe uno abierto.
Creación de objetos Statement
Una vez establecida la conexión con una base de datos particular, esta conexión puede usarse para enviar sentencias SQL. Un objeto Statement se crea mediante el método de Connection createStatement, como podemos ver en el siguiente fragmento de código.
Connection con = DriverManager.getConnection(url, "sunny", "");
Statement stmt = con.createStatement();
La sentencia SQL que será enviada a la base de datos es alimentada como un argumento a uno de los métodos de ejecución del objeto Statement. Por ejemplo:
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2").
1.2. Propiedades
Empezamos por descargar el conector MySQL para Java desde su sitio web: conector MySQL. Una vez que hemos descargado el fichero .zip correspondiente a nuestra plataforma lo descomprimimos en el equipo y  buscamos dentro de la carpeta principal un archivo llamado mysql-connector con extensión .jar.
Ahora tenemos que agregar este archivo jar a nuestra aplicación de NetBeabs, para ello  hacemos Click derecho sobre el nombre del proyecto y seleccionamos propiedades. En la ventana siguiente seleccionamos en librerías y posteriormente pulsamos en el botón –>Add Jar/folder. Finalmente accedemos a la localización del conector que descargamos anteriormente y pulsamos OK.

Después de importar el conector ya casi estamos preparados, aunque antes de continuar necesitamos un servidor local y una base de datos.
En mi caso utilizo phpMyAdmin para crear la bd java1 con nombre de usuario root y sin contraseña. También la tabla Motor con 3 columnas: Marca, Modelo y Potencia.

En la siguiente clase insertamos 2 registros en la tabla motor con el método executeUpdate(). Finalmente mostramos los datos en pantalla ordenados por Potencia.

Encapsula las instrucciones SQL a la BD
Se crea a partir de la conexión
Instruccion = conexion.createStatement();
        Métodos
  • executeQuery(String sql)
  • Ejecución de consultas: SELECT
  • Devuelve un objeto ResultSet.
  • executeUpdate(String sql).
  • Modificaciones en la BD: INSERT, UPDATE, DELETE
  • Devuelve el número de columnas afectadas.
  • execute(String sql).
  • Ejecución de instrucciones que pueden devolver varios conjuntos de resultado.
  • Requiere usar luego getResultSet() o getUpdateCount() para recuperar.
Realización de Statement
Cuando una conexión está en modo auto-commit, las sentencias ejecutadas son ‘comitadas’ o rechazadas cuando se completan. Un sentencia se considera completa cuando ha sido ejecutada y se han devuelto todos los resultados. Pare el método executeQuery, que devuelve un único result set, la sentencia se completa cuando todas las filas del objeto ResultSet se han devuelto. Para el método executeUpdate, un sentencia se completa cuando se ejecuta. En los raros casos en que se llama al método execute, de cualquier modo, no se completa hasta que los result sets o update counts que se generan han sido devueltos. 
Algunos DBMS tratan cada sentencia en un procedimiento almacenado como sentencias separadas. Otros tratan el procedimiento entero como una sentencia compuesta. Esta diferencia se convierte en importante cuando está activo el modo auto-commit porque afecta cuando se llama al método commit. En el primer caso, cada sentencia individual es commitada. En el segundo, se commiten todas juntas.
La interfaz Statement nos suministra tres métodos diferentes para ejecutar sentencias SQL, executeQuery, executeUpdate y execute. El método a usar está determinado por el producto de la sentencia SQL

2.El método executeQuery está diseñado para sentencias que producen como resultado un único ResultSet tal como las sentencias SELECT.
3.El método executeUpdate se usa para ejecutar sentencias INSERT, UPDATE ó DELETE así como sentencias SQL DDL (Data Definition Language) como CREATE TABLE o DROP TABLE. 
El efecto de una sentencia INSERT, UPDATE o DELETE es una modificación de una o más columnas en cero o más filas de una tabla. El valor devuelto de executeUpdate es un entero que indica el número de filas que han sido afectadas (referidos como update count).
Para sentencias tales como CREATE TABLE o DROP TABLE, que no operan sobre filas, el valor devuelto por executeUpdate es siempre cero.
4.El método execute se usa solamente para ejecutar sentencias que devuelven más de un Result Set, más que un update count o una combinación de ambos.
1.3. Ejemplos
1.3.1. Ejemplo 01
       
       ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))

El siguiente código muestra una forma de asegurarse que se ha accedido a todos los result sets y update counts de una llamada al método execute:

stmt.execute(queryStringWithUnknownResults);
while (true) {
int rowCount = stmt.getUpdateCount();
if (rowCount > 0) { // this is an update count
System.out.println("Rows changed = " + count);
stmt.getMoreResults();
continue;
}
if (rowCount == 0) { // DDL command or 0 updates
System.out.println(" No rows changed or statement was DDL
command");
stmt.getMoreResults();
continue;
}

// if we have gotten this far, we have either a result set 
// or no more results

ResultSet rs = stmt.getResultSet; 
if (rs != null) {
. . . // use metadata to get info about result set columns
while (rs.next()) {
. . . // process results
stmt.getMoreResults();
continue;
}
break; // there are no more results
       
1.3.1. Ejemplo 02
       
Establecemos la conexión con la base de datos. 
Connection conexion = DriverManager.getConnection ("jdbc:mysql://localhost/prueba","root", "la_clave");

// Preparamos la consulta 
Statement s = conexion.createStatement(); 
ResultSet rs = s.executeQuery ("select * from persona");

// Recorremos el resultado, mientras haya registros para leer, y escribimos el resultado en pantalla. 
while (rs.next()) 
{ 
    System.out.println (rs.getInt (1) + " " + rs.getString (2)+ " " + rs.getDate(3)); 
}

// Cerramos la conexion a la base de datos. 
conexion.close();

       
1.3.3. Ejemplo 03
El ejemplo que sigue muestra cómo se utiliza un objeto Statement.
       
     // Conéctese al servidor.
     Connection c = DriverManager.getConnection("jdbc:as400://mySystem");

                       // Cree un objeto Statement.
     Statement s = c.createStatement();

                       // Ejecute una sentencia SQL que cree
                       // una tabla en la base de datos.
     s.executeUpdate("CREATE TABLE MYLIBRARY.MYTABLE (NAME VARCHAR(20), ID INTEGER)");

                       // Ejecute una sentencia SQL que inserte
                       // un registro en la tabla.
     s.executeUpdate("INSERT INTO MYLIBRARY.MYTABLE (NAME, ID) VALUES ('DAVE', 123)");

                       // Ejecute una sentencia SQL que inserte
                       // un registro en la tabla.
     s.executeUpdate("INSERT INTO MYLIBRARY.MYTABLE (NAME, ID) VALUES ('CINDY', 456)");

                       // Ejecute una consulta SQL en la tabla.
     ResultSet rs = s.executeQuery("SELECT * FROM MYLIBRARY.MYTABLE");

                       // Cierre el objeto Statement y
                       // el objeto Connection.
     s.close();
     c.close();
       
1.3.3. Ejemplo 04
       
import java.sql.*;
import java.util.Properties;

public class PreparedStatementExample {

    public static void main(java.lang.String[] args)
    {
        // Cargar lo siguiente desde un objeto de propiedades.
        String DRIVER = "com.ibm.db2.jdbc.app.DB2Driver";
        String URL    = "jdbc:db2://*local";

        // Registrar el controlador JDBC nativo. Si el controlador no puede
        // registrarse, la prueba no puede continuar.
        try {
            Class.forName(DRIVER);
        } catch (Exception e) {
            System.out.println("Imposible registrar el controlador.");
            System.out.println(e.getMessage());
            System.exit(1);
        }

        Connection c = null;
        Statement s = null;

        //    Este programa crea una tabla que
        //    las sentencias preparadas utilizan más tarde.
        try {
            // Crear las propiedades de conexión.
            Properties properties = new Properties ();
            properties.put ("user", "userid");
            properties.put ("password", "password");

            // Conectar con la base de datos local de iSeries.
            c = DriverManager.getConnection(URL, properties);

            // Crear un objeto Statement.
            s = c.createStatement();
            // Se suprime la tabla de prueba, si existe. Observe que
            // en todo este ejemplo se presupone que la colección
            // MYLIBRARY existe en el sistema.
            try {
                s.executeUpdate("DROP TABLE MYLIBRARY.MYTABLE");
            } catch (SQLException e) {
                // Se continúa simplemente... es probable que la tabla no exista.
            }

            // Se ejecuta una sentencia SQL que crea una tabla en la base de datos.
            s.executeUpdate("CREATE TABLE MYLIBRARY.MYTABLE (NAME VARCHAR(20), ID INTEGER)");

        } catch (SQLException sqle) {
            System.out.println("El proceso de base de datos ha fallado.");
            System.out.println("Razón: " + sqle.getMessage());
        } finally {
            // Se cierran los recursos de base de datos.
            try {
                if (s != null) {
                    s.close();
                }
            } catch (SQLException e) {
                System.out.println("El borrado no ha podido cerrar Statement.");
}
        }


        //    A continuación, este programa utiliza una sentencia preparada para
        //    insertar muchas filas en la base de datos.
        PreparedStatement ps = null;
        String[] nameArray = {"Rich", "Fred", "Mark", "Scott", "Jason",
            "John", "Jessica", "Blair", "Erica", "Barb"};
        try {
            // Crear un objeto PreparedStatement utilizado para insertar datos en la
            // tabla.
            ps = c.prepareStatement("INSERT INTO MYLIBRARY.MYTABLE (NAME, ID) VALUES (?, ?)");

            for (int i = 0; i < nameArray.length; i++) {
                ps.setString(1, nameArray[i]);  // Se establece el nombre a partir de nuestra matriz.
                ps.setInt(2, i+1);              // Se establece el ID.
                ps.executeUpdate();
            }

        } catch (SQLException sqle) {
            System.out.println("El proceso de base de datos ha fallado.");
            System.out.println("Razón: " + sqle.getMessage());
        } finally {
            // Se cierran los recursos de base de datos.
            try {
                if (ps != null) {
                    ps.close();
                }
            } catch (SQLException e) {
                System.out.println("El borrado no ha podido cerrar Statement.");
}
        }


        //    Utilizar una sentencia preparada para consultar la tabla de
        //    base de datos que se ha creado y devolver datos desde ella. En
        //    este ejemplo, el parámetro utilizado se ha establecido de manera arbitraria
        //    en 5, lo que implica devolver todas las filas en las que el campo ID sea
        //    igual o menor que 5.
        try {
            ps = c.prepareStatement("SELECT * FROM MYLIBRARY.MYTABLE " +
                                    "WHERE ID <= ?");

            ps.setInt(1, 5);

            // Se ejecuta una consulta SQL en la tabla.
            ResultSet rs = ps.executeQuery();
            // Visualizar todos los datos de la tabla.
            while (rs.next()) {
                System.out.println("El empleado " + rs.getString(1) + " tiene el ID " + rs.getInt(2));
            }

        } catch (SQLException sqle) {
            System.out.println("El proceso de base de datos ha fallado.");
            System.out.println("Razón: " + sqle.getMessage());
        } finally {
            // Se cierran los recursos de base de datos.
            try {
                if (ps != null) {
                    ps.close();
                }
            } catch (SQLException e) {
                System.out.println("El borrado no ha podido cerrar Statement.");
}

            try {
                if (c != null) {
                    c.close();
                }
            } catch (SQLException e) {
                System.out.println("El borrado no ha podido cerrar Connection.");
}

        }
    }
}
       
1.3.5. Ejemplo 05
       
public class UnaClase {
   // Aqui guardamos un unico PreparedStatement para insertar 
   PreparedStatement psInsertar = null;
   ...
   public void unMetodoDeInsertar () {
   try {
      // Creamos el PreparedStatement si no estaba ya creado. 
      if (null == psInsertar) { 
         psInsertar = conexion.prepareStatement(
            "insert into person values (null,?,?,?)");
      ...
   } catch (SQLException e) {
      e.printStackTrace();
   }
       

2. RESUMEN
La interfase Statement nos suministra tres métodos diferentes para ejecutar sentencias SQL, executeQuery, executeUpdate y execute. El método a usar esta determinado por el producto de la sentencia SQL.
El método executeQuery esta diseñado para sentencias que producen como
resultado un único result set tal como las sentencias SELECT.
El método executeUpdate se usa para ejecutar sentencias INSERT, UPDATE ó
DELETE así como sentencias SQL DDL (Data Definition Language) como CREATE TABLE o DROP TABLE. El efecto de una sentencia INSERT, UPDATE o DELETE es una modificación de una o más columnas en cero o más filas de una tabla. El valor devuelto de executeUpdate es un entero que indica el número de filas que han sido afectadas (referido como update count). Para sentencias tales como CREATE TABLE o DROP TABLE, que no operan sobre filas, le valor devuelto por
executeUpdate es siempre cero.
El método execute se usa para ejecutar sentencias que devuelven más de un
result set, más que un update count o una combinación de ambos. Como es esta
una característica avanzada que muchos programadores no necesitarñan nunca se verá en su propia sección. 
Todos los métodos que ejecutan sentencias cierran los objetos Resultset abiertos
como resultado de las llamadas a Statement. Esto quiere decir que es necesario
completar el proceso con el actual objeto Resulset antes de reejecutar una
sentencia Statement. 

Cuando una conexión está en modo auto-commit, las sentencias ejecutadas son ‘comitadas’ o rechazadas cuando se completan. Un sentencia se considera completa cuando ha sido ejecutada y se han devuelto todos los resultados. Pare el método executeQuery, que devuelve un único result set, la sentencia se completa cuando todas las  filas del objeto ResultSet se han devuelto. Para el método executeUpdate, un sentencia se completa cuando se ejecuta. En los raros casos en que se llama al método execute, de cualquier modo, no se completa hasta que los result sets o update counts que se generan han sido devueltos.
Algunos DBMS tratan cada sentencia en un procedimiento almacenado como sentencias separadas. Otros tratan el procedimiento entero como una sentencia compuesta. Esta diferencia se convierte en importante cuando está activo el modo auto-commit porque afecta cuando se llama al método commit. En el primer caso, cada sentencia individual es commitada. En el segundo, se commiten todas juntas.

3. SUMMARY
The Statement interface provides three different methods for executing SQL statements, executeQuery, executeUpdate, and execute. The method to use is determined by the product of the SQL statement.
The executeQuery method is designed for statements that produce as
result a single result set such as the SELECT statements.
The executeUpdate method is used to execute INSERT, UPDATE, or DELETE as well as Data Definition Language (DDL) SQL statements such as CREATE TABLE or DROP TABLE. The effect of an INSERT, UPDATE, or DELETE statement is a modification of one or more columns to zero or more rows in a table. The return value of executeUpdate is an integer that indicates the number of rows that have been affected (referred to as update count). For statements such as CREATE TABLE or DROP TABLE, which do not operate on rows, the value returned by executeUpdate is always zero.
The execute method is used to execute statements that return more than one
result set, more than an update count or a combination of both. How is this
an advanced feature that many programmers do not need to ever see in their own section.
All methods that execute statements close open Resultset objects
as a result of Statement calls. This means that it is necessary
complete the process with the current Resulset object before re-executing a

Statement.
When a connection is in auto-commit mode, executed statements are 'committees' or rejected when they are completed. A statement is considered complete when it has been executed and all results returned. Stop the executeQuery method, which returns a single result set, the statement is completed when all rows of the ResultSet object have been returned. For the executeUpdate method, a statement is completed when it is executed. In the rare cases where the execute method is called, however, it is not completed until the result sets or update counts that are generated have been returned.
Some DBMSs treat each statement in a stored procedure as separate statements. Others treat the whole procedure as a compound sentence. This difference becomes important when the auto-commit mode is active because it affects when the commit method is called. In the first case, each individual statement is committed. In the second, they commit all together.

4. RECOMENDACIONES
1) Investigación más amplia sobre este tema porque es indispensable para conectarnos a una base de datos.
2) Tener en cuenta ciertos puntos tratados en este tema por ejemplo los métodos que son de suma importancia al momento de desarrolla software.
3) Ponerlo en práctica todo lo aprendido, guiándose de los prototipos planteados en el trascurso del desarrollo del tema.
5. CONCLUSIONES
1) El objeto Statement sirve para procesar una sentencia SQL estática y obtener los resultados producidos por ella.
2) Los objetos Statement se crean a partir de objetos Connection con el método createStatement.
3) Las características de los ResultSets están asociadas con la sentencia que finalmente los crea el objeto Statement.
4) El proceso de sentencias SQL con un objeto Statement se realiza mediante los métodos executeQuery(), executeUpdate() y execute().
5) Tener en cuenta que si una sentencia SQL que se procesa con el método executeQuery no devuelve un ResultSet, se lanza una SQLException.
6. APRECIACIÓN DEL EQUIPO
En los preliminares contenidos hemos venido tratando temas relacionados a la conexión a una base de datos desde java, pero en esta ocasión profundizamos más sobre el objeto statement en este punto desarrollamos argumentos indispensables tales como definición propiedades y muchos ejemplos.

De la misma manera podemos indicar que gracia a la investigación más amplia que tuvimos con respecto al trabajo anterior aclaramos algunos interrogantes que teníamos sobre este importante objeto (STATEMENT).
7. GLOSARIO DE TÉRMINOS
   INTERFAZ STATEMENT 
   Ejecuta una sentencia SQL simple que no tiene ningún parámetro. 

    INTERFAZ PREPAREDSTATEMENT 
    Ejecuta una sentencia SQL precompilada que puede tener o no tener parámetros IN.

    INTERFAZ CALLABLESTATEMENT 
    Ejecuta una llamada a un procedimiento almacenado de base de datos. El objeto  
    CallableStatement puede tener o no tener parámetros IN, OUT e INOUT.
   
    AS400JDBCSTATEMENT
    Proporciona métodos que permiten llevar a cabo muchas acciones

    EXECUTE
    Se usa solamente para ejecutar sentencias que devuelven más de un Result Set
     
    EXECUTEQUERY 
     está diseñEado para sentencias que producen como resultado un único ResultSet

    EXECUTEUPDATE 
    se usa para ejecutar sentencias INSERT, UPDATE ó DELETE

    EXECUTEQUERY(STRING SQL)  
    Devuelve un objeto ResultSet con el conjunto de resultados obtenidos de la ejecución de      la instrucción indicada. 
    Es comúnmente usado con sentencias SQL SELECT
    Invoque el método 

    CONNECTION.CREATESTATEMENT 
     crear un objeto Statement.

    GETRESULTSET

     para conseguir el primer result set


8. LINKOGRAFÍA

https://msdn.microsoft.com/es-es/VBA/Office-Shared-VBA/articles/serverpolicy-statement-property-office

https://en.wiktionary.org/wiki/statemen

https://www.ibm.com/support/knowledgecenter/es/ssw_i5_54/rzahh/jdbcst.htm

https://www.ibm.com/support/knowledgecenter/es/ssw_ibm_i_71/rzaha/statemnt.htm

http://profesores.fi-b.unam.mx/sun/Downloads/Java/jdbc.pdf

https://www.ibm.com/support/knowledgecenter/es/SSEPGG_9.7.0/com.ibm.db2.luw.apdv.java.doc/src/tpc/imjcc_tjvstxqu.html

https://docs.microsoft.com/en-us/sql/connect/jdbc/reference/executeupdate-method-sqlserverstatement

https://desarrollosoftwareana.blogspot.pe/


Comentarios

  1. Ilustrar su trabajo agregar IMAGENES. Se tiene que definir 3 CONCLUSIONES y RECOMENDACIONES. En el GLOSARIO se debe definir al menos 10 términos. Gracias por su investigación.

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

RESULTSET

CONTROL JTABLE CON BASE DE DATOS

Reportes