martes, 6 de diciembre de 2016

PREPAREDSTATEMENT









                                                                                     BAGUA GRANDE 06 DE DICIEMBRE DEL 2016





PREPAREDSTATEMENT

1.  CONTENIDO.
1.1.        Definición.
Este interfaz, al igual que el interfaz Statement, nos permite ejecutar sentencias SQL sobre una conexión establecida con una base de datos. Pero en este caso vamos a ejecutar sentencias SQL más especializadas, estas sentencias SQL se van a denominar sentencias SQL precompiladas y van a recibir parámetros de entrada.

El interfaz PreparedStatement hereda del interfaz Statement y se diferencia de él de dos maneras:
·      Las instancias de PreparedStatement contienen sentencias SQL que ya han sido compiladas.
    Esto es lo que hace a una sentencia "prepared” (preparada).
·       La sentencia SQL que contiene un objeto PreparedStatement puede contener uno o más parámetros de entrada. Un parámetro de entrada es aquél cuyo valor no se especifica cuando la sentencia es creada, en su lugar la sentencia va a tener un signo de interrogación (?) por cada parámetro de entrada. Antes de ejecutarse la sentencia se debe especificar un valor para cada uno de los parámetros a través de los métodos setXXX apropiados. Estos métodos setXXX los añade el interfaz PreparedStatement.

Debido a que las sentencias de los objetos PrepareStatement están precompiladas su ejecución será más rápida que la de los objetos Statement. Por lo tanto, una sentencia SQL que va a ser ejecutada varias veces se suele crear como un objeto PreparedStatement para ganar en eficiencia. También se utilizará este tipo de sentencias para pasarle parámetros de entrada a las sentencias SQL.

Al heredar del interfaz Statement, el interfaz PreparedStatement hereda todas funcionalidades de Statement. Además, añade una serie de métodos que permiten asignar un valor a cada uno de los parámetros de entrada de este tipo de sentencias.
Los métodos execute(), executeQuery() y executeUpdate() son sobrecargados y en esta versión, esdecir, para los objetos PreparedStatement no toman ningún tipo de argumentos, de esta forma, a estos métodos nunca se les deberá pasar por parámetro el objeto String que representaba la sentencia SQL a ejecutar. En este caso, un objeto PreparedStatement ya es una sentencia SQL por sí misma, adiferencia de lo que ocurría con las sentencias Statement que poseían un significado sólo en el momento en el que se ejecutaban.
Son muy útiles cuando una sentencia SQL se ejecuta muchas veces cambiando sólo algunos valores.

·      Se utiliza para enviar sentencias SQL precompiladas con uno o más parámetros.
·      Se crea un objeto PreparedStatement especificando la plantilla y los lugares donde irán los parámetros.
·      Los parámetros son especificados después utilizando los métodos setXXX(.) indicando el número de parámetro y el dato a insertar en la sentencia.
·      La sentencia SQL y los parámetros se envían a la base de datos cuando se llama al método: executeXXX().

1.1.1.   El interfaz PreparedStatement.
A continuación se ofrece la acostumbrada referencia rápida de los métodos del interfaz que nos ocupa.
·      void adBatch(): añade un conjunto de parámetros al conjunto de comandos que se ejecutará en modo batch.
·      void clearParameters(): elimina los valores de los parámetros actuales.
·      boolean execute(): ejecuta cualquier tipo de sentencia SQL.
·      ResultSet executeQuery(): ejecuta la sentencia SQL representada por el objeto PreparedStatement, devolviendo un objeto ResultSet con el resultado de la ejecución de la consulta.
·      int executeUpdate(): ejecuta una sentencia SQL del tipo INSERT, UPDATE o DELETE.
·      ResultSetMetaData getMetaData(): devuelve un objeto ResultSetMetaData que contendrá el número, tipos y propiedades de las columnas de un objeto ResultSet.
    Como ya hemos adelantado el interfaz PreparedStatement presenta una serie de métodos setXXX() que permiten asignar valores a los parámetros de la sentencia SQL correspondiente.
    Los distintos métodos setXXX() se muestran a continuación, los argumentos comunes que presentan estos métodos es el índice que indica el número de orden del parámetro y el valor que se le desea dar a ese parámetro.
·      void setArray(int índiceParámetro, Array valor)
·      void setAsciiStream(int índiceParámetro, InputStream valor, int longitud)
·      void setBigDecimal(int índiceParámetro, BigDecimal valor)
·      void setBinaryStream(int índiceParámetro, InputStream valor, int longitud)
·      void setBlob(int índiceParámetro, Blob valor)
·      void setBoolean(int índiceParámetro, boolean valor)
1.1.2.   Creando objetos PreparedStatement      


 Para crear un objeto PreparedStatement se debe lanzar el método prepareStatement() del interfaz Connection sobre el objeto que representa la conexión establecida con la base de datos. En el siguiente ejemplo se puede ver como se crearía un objeto PreparedStatement que representa una sentencia SQL con dos parámetros de entrada.
El objeto sentencia contendrá la sentencia SQL indicada, la cual, ya ha sido enviada al DBMS y ya ha sido preparada para su ejecución. En este caso se ha creado una sentencia SQL con dos parámetros de entrada.

Connection conexion=DriverManager.getConnection(url,"pepe","xxxx");
PreparedStatement sentencia=conexion.prepareStatement("UPDATE MiTabla SET nombre =?"+"WHERE clave =?");

1.1.2.   Utilizando los parámetros de entrada
Antes de poder ejecutar un objeto PreparedStatement se debe asignar un valor para cada uno de sus parámetros. Esto se realiza mediante la llamada a un método setXXX, donde XXX es el tipo apropiado para el parámetro. Por ejemplo, si el parámetro es de tipo long, el método a utilizar será setLong().

El primer argumento de los métodos setXXX es la posición ordinal del parámetro al que se le va a asignar valor, y el segundo argumento es el valor a asignar. Por ejemplo el Código fuente 109 crea un objeto PreparedStatement y acto seguido le asigna al primero de sus parámetros un valor de tipo String y al segundo un valor de tipo int.

Connection conexion=DriverManager.getConnection(url);
PreparedStatement sentencia=conexion.prepareStatement("UPDATE MiTabla SET nombre = ? "+"WHERE clave =?");
sentencia.setString(1,"Pepe");
sentencia.setInt(2,157);

Una vez que se ha asignado unos valores a los parámetros de entrada de una sentencia, el objeto PreparedStatement se puede ejecutar múltiples veces, hasta que sean borrados los parámetros con el método clearParameters(), aunque no es necesario llamar a este método cuando se quieran modificar los parámetros de entrada, sino que al lanzar los nuevos métodos setXXX los valores de los parámetros serán reemplazados.
El Código muestra como una vez creado un objeto PreparedStatement se ejecuta variasveces y se le cambian los parámetros.

Connection conexion=DriverManager.getConnection(url);
PreparedStatement sentencia=conexion.prepareStatement("UPDATE MiTabla SET Id = ?"+"WHERE num=?");
for (int i=0;i<20;i++){
sentencia.setInt(1,i);
sentencia.setInt(2,i);
sentencia.executeUpdate();
}

Como ya se había comentado anteriormente XXX en un método setXXX es un tipo de Java. Es implícitamente un tipo JDBC (un tipo SQL genérico) ya que el driver transformará el tipo Java a suvtipo JDBC correspondiente y acto seguido lo enviará a la base de datos. Así por ejemplo, el siguiente fragmento asigna a un parámetro de entrada el valor 44 del tipo Java short:

sentencia.setShort(2,44);

El driver enviará 44 a la base de datos como un SMALLINT de JDBC, que es la transformación estándar para un short de Java. Se realiza la transformación inversa que realizaban los métodos
getXXX.
Es responsabilidad del programador asegurarse de que el tipo Java de cada parámetro de entrada se corresponde con un tipo compatible JDBC que será esperado por la base de datos.
El programador puede convertir explícitamente un parámetro de entrada a un tipo JDBC determinado utilizando para ello el método setObject().
El driver transformará el objeto de la clase Object al tipo JDBC específico antes de enviarlo a la base de datos, si no se le indica el tipo JDBC el driver lo transformará al tipo JDBC que le corresponda.
La diferencia entre el método setObject() y los métodos setXXX es que los primeros realizan la transformación de tipos Object de Java a tipos JDBC y los segundos de tipos de Java a tipos de JDBC.
JDBC define una serie de identificadores de tipos SQL genéricos en la clase java.sql.Types. Estos tipos han sido diseñados para representar los tipos SQL más comunes. Normalmente programando con JDBC se podrá referenciar tipos SQL genéricos usando estos tipos de JDBC sin tener en cuenta el tipo SQL exacto.
La capacidad que posee el método setObject() de aceptar cualquier objeto de Java permite que un programa sea genérico y acepte parámetros de entrada en tiempo de ejecución. En esta situación el tipo de objeto es desconocido en tiempo de compilación.
El método setNull() nos permite enviar un JDBC NULL a la base de datos como un parámetro de entrada, sin embargo, se debe especificar el tipo JDBC del parámetro.
En este caso la conversión de tipos de datos se realiza al contrario que con los métodos getXXX del interfaz ResultSet, la Tabla 7 muestra de conversión de tipos SQL genéricos o tipos JDBC a tipos de datos de Java.




Tipos Java
Tipos JDBC
String
VARCHAR or LONGVARCHAR
ava.math.BigDecimal
NUMERIC
boolean
BIT
byte
TINYINT
short
SMALLINT
int
INTEGER
long
BIGINT
float
REAL
double
DOUBLE
byte[]
VARBINARY, LONGVARBINARY,
BINARY
java.sql.Date
DATE
java.sql.Time
TIME
ava.sql.Timestamp
TIMESTAMP
Clob
CLOB
Blob
BLOB
Array
ARRAY
Struct
STRUCT
Ref
REF
Clase Java
JAVA_OBJECT



1.2.        Método executeUpdate
Ejecuta la instrucción SQL determinada, que puede ser una instrucción INSERT, UPDATE, MERGE o DELETE; o una instrucción SQL que no devuelve nada, como una instrucción DDL de SQL.


1.3.        Uso de callablestatement
El último tipo de sentencias que podemos utilizar en JDBC son las sentencias CallableStatement. Este interfaz hereda del interfaz PreparedStatement y ofrece la posibilidad de manejar parámetros de salida y de realizar llamadas a procedimientos almacenados de la base de datos.

Un objeto CallableStatement ofrece la posibilidad de realizar llamadas a procedimientos almacenados de una forma estándar para todos los DBMS. Un procedimiento almacenado se encuentra dentro de una base de datos; la llamada a un procedimiento es lo que contiene un objeto CallableStatement. Esta llamada está escrita con una sintaxis de escape, esta sintaxis puede tener dos formas diferentes: una con un parámetro de resultado, es un tipo de parámetro de salida que representa el valor devuelto por el procedimiento y otra sin ningún parámetro de resultado. Ambas formas pueden tener un número variable de parámetros de entrada, de salida o de entrada/salida. Una interrogación representará al parámetro.
La sintaxis para realizar la llamada a un procedimiento almacenado es la siguiente:
{call nombre_del_procedimiento[(?,?,...)]}
Si devuelve un parámetro de resultado:
{?=call nombre_del_procedimiento[(?.?...)]}
La sintaxis de una llamada a un procedimiento sin ningún tipo de parámetros sería:
{call nombre_del_procedimiento}

1.3.2.   Crear objetos CallableStatement.
Los objetos CallableStatement se crean con el método prepareCall de
Connection. El siguiente ejemplo crea una instancia de CallableStatement que contiene una llamada al procedimiento almacenado getTestData, con dosargumentos y no devuelve resultados.
CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}");

donde los encajes ‘?’ son parámetros IN, OUT ó INOUT dependiendo del
procedimiento getTestData.


1.4.        Ejemplos
El siguiente fragmento de código, donde con es un objeto Connection, crea un objeto PreparedStatement que contiene una instrucción SQL:
//Creamos un objeto PreparedStatement desde el objeto Connection
PreparedStatement ps = con.prepareStatement(
"select * from Propietarios where DNI=? AND NOMBRE=? AND EDAD=?");
//Seteamos los datos al prepared statement de la siguiente forma:
ps.setString(1, dni);
ps.setString(2, nombre);
ps.setInt(3, edad);
//Ejecutamos el PreparedStatement, en este caso con executeQuery()
ResultSet rs= ps.executeQuery();
Ejemplo de PreparedStatement de consulta
Por ejemplo supongamos que hay un campo de texto en el que el usuario puede introducir su dirección de correo electrónico y con este dato se desea buscar al usuario:
Connection con = DriverManager.getConnection(url);
String consulta = "SELECT usuario FROM registro WHERE email like ?";
PreparedStatement pstmt = con.prepareStatement(consulta);
pstmt.setString(1 , campoTexto.getText());
ResultSet resultado = ps.executeQuery();
Ejemplo de PreparedStatement de modificación
En el siguiente ejemplo se va a insertar un nuevo registro en una tabla:
Connection con = DriverManager.getConnection(url);
String insercion = "INSERT INTO registro(usuario , email , fechaNac) values ( ? , ? , ? )");
PreparedStatement pstmt = con.prepareStatement(consulta);
String user = . . . ;
String email = . . . ;
Date edad = . . . ; //O int edad;
pstmt.setString(1 , user);
pstmt.setString(2 , email);
pstmt.setDate(3 , edad); // setInt(3, edad);
ps.executeUpdate();

Otro ejemplo:

ublic class InsertarDatos {

  public static void main(String[] args) {

    Connection con = null;
     PreparedStatement stmt = null;

     String sDriver = "com.mysql.jdbc.Driver";
     String sURL = "jdbc:mysql://localhost:3306/lineadecodigo";

     try{
        Class.forName(sDriver).newInstance();   
        con = DriverManager.getConnection(sURL,"root","");
       
        String sISBN = "84-9815-212-7";
        String sTitulo = "Yo, Claudio";
        String sDescripcion="Supuesta autobiografía de Claudio";
        String sCategoria = "Novela Histórica";
        int idAutor = 3;
                     
        stmt = con.prepareStatement("INSERT INTO libros VALUES (?,?,?,?,?)");
        stmt.setString(1,sISBN);
        stmt.setInt(2,idAutor);
        stmt.setString(3,sTitulo);
        stmt.setString(4,sDescripcion);
        stmt.setString(5,sCategoria);
                     
        int retorno = stmt.executeUpdate();
        if (retorno>0)
           System.out.println("Insertado correctamente");      
                     
     } catch (SQLException sqle){
        System.out.println("SQLState: " 
           + sqle.getSQLState());
        System.out.println("SQLErrorCode: " 
           + sqle.getErrorCode());
        sqle.printStackTrace();
     } catch (Exception e){
        e.printStackTrace();
     } finally {
        if (con != null) {
           try{
              stmt.close();
              con.close();
           } catch(Exception e){
              e.printStackTrace();
           }
        }
     }           
   }
}






2.  RESUMEN.
Este interfaz, al igual que el interfaz Statement, nos permite ejecutar sentencias SQL sobre una conexión establecida con una base de datos.
Pero en este caso vamos a ejecutar sentencias SQL más especializadas, estas sentencias SQL se van a denominar sentencias SQL precompiladas y van a recibir parámetros de entrada.
El interfaz PreparedStatement hereda del interfaz Statement y se diferencia de él de dos maneras: • Las instancias de PreparedStatement contienen sentencias SQL que ya han sido compiladas.
Esto es lo que hace a una sentencia "prepared” (preparada).
La sentencia SQL que contiene un objeto PreparedStatement puede contener uno o más parámetros de entrada.
Un parámetro de entrada es aquél cuyo valor no se especifica cuando la sentencia es creada, en su lugar la sentencia va a tener un signo de interrogación (?) por cada parámetro de entrada.
Uso de callablestatement El último tipo de sentencias que podemos utilizar en JDBC son las sentencias CallableStatement.
Este interfaz hereda del interfaz PreparedStatement y ofrece la posibilidad de manejar parámetros de salida y de realizar llamadas a procedimientos almacenados de la base de datos. Un procedimiento almacenado se encuentra dentro de una base de datos; la llamada a un procedimiento es lo que contiene un objeto CallableStatement.

3.  SUMARY.
              This interface, like the Statement interface, allows us to execute SQL statements over a connection established with a database.
But in this case we will execute more specialized SQL statements, these SQL statements are going to be called precompiled SQL statements and will receive input parameters.
The PreparedStatement interface inherits from the Statement interface and differs from it in two ways: • The PreparedStatement instances contain SQL statements that have already been compiled.
This is what makes a "prepared" statement.
The SQL statement that contains a PreparedStatement object may contain one or more input parameters.
An input parameter is one whose value is not specified when the statement is created, instead the statement will have a question mark (?) For each input parameter.
Using callablestatement The last type of statements we can use in JDBC are the CallableStatement statements.
This interface inherits from the PreparedStatement interface and offers the possibility of handling output parameters and making calls to database stored procedures. A stored procedure is inside a database; The call to a procedure is what a CallableStatement object contains.
2.  RECOMENDACIONES.
               Para poder ejecutar un objeto PreparedStatement, primero hay que establecer un valor en cada uno de los marcadores de parámetro.                             
Se utiliza el método prepareStatement() de Connection para crear nuevos objetos PreparedStatement.
4.  CONCLUCIONES.
Se ha concluido que PreparedStatement nos permite ejecutar sentencias SQL sobre una conexión establecida con una base de datos. Pero en este caso vamos a ejecutar sentencias SQL más especializadas.

5.  APRECIACION DEL EQUIPO.
Al realizar este trabajo se ha entendido acerca de cómo y cuándo usar  preparedstetment también se ha comprendido que para enviar sentencias sql no solo existe un método sino muchos más.

6.  GLOSARIO DE TERMINOS.
              
Parámetros:  es una variable utilizada para recibir valores de entrada en una rutina o subrutina. Dichos valores, que serán enviados desde la rutina invocante, son llamados argumentos.
Interfaz: es un conjunto de subrutinas, funciones y procedimientos (o métodos, en la programación orientada a objetos) que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstracción.
DBMS:  database management system  que permiten almacenar y posteriormente acceder a los datos de forma rápida y estructurada.


VIDEO ..




















LINK DE LA DIAPOSITIVA ... AQUI ..





7.   BIBLIOGRAFIA.

  http://seduca.uaemex.mx/material/LIA/POO/materiales/PreparedStatement.htmlhttp://  www.forosdelweb.com/f45/diferencias-entre-preparestatement-statement-              612469/
 http://www.vc.ehu.es/jiwotvim/ISOFT2009-2010/Teoria/BloqueIV/JDBC.pdf
 http://www.euskalnet.net/jaoprogramador/j2ee/JDBC/jdbc25.htm



No hay comentarios:

Publicar un comentario