viernes, 9 de diciembre de 2016

PREPAREDSTATEMENT

“AÑO DE CONSOLIDACIÓN DEL MAR DE GRAU”

ESCUELA PROFESIONAL DE:

INGENIERÍA DE SISTEMAS Y TELEMÁTICA

TEMA: PREPAREDSTATEMENT

DOCENTE: MARCO AURELIO PORRO CHULLI.

ASIGNATURA: DESARROLLO DE SOFTWARE l

NOMBRE DEL GRUPO: “JAVA”

INTEGRANTES:
MALDONADO IDROGO BETZABETH YAMELI
PÉREZ SAUCEDO YORDIN ALBERTO

CICLO: V

GRUPO: “B”

AÑO: 2016

                      BAGUA GRANDE-UTCUBAMBA


Tema: PREPAREDSTATEMENT
Contenido
*      Definición
PreparedStatement nos permite definir una sentencia SQL base, que nos sirve para modificar/insertar/buscar uno o varios registros con sólo cambiar los valores de los parámetros que especifiquemos.
La sentencia SQL contenida en un objeto PreparedStatement pueden tener uno o más parámetros IN. Un parámetro IN es aquel cuyo valor no se especifica en la sentencia SQL cuando se crea. En vez de ello la sentencia tiene un interrogante ('?') como un 'ancla' para cada parámetro IN.
*      Método executeUpdate
Ejecuta la instrucción SQL determinada, que puede ser una instrucción INSERT, UPDATE o DELETE; o una instrucción SQL que no devuelve nada, como una instrucción DDL de SQL. Desde el controlador JDBC 3.0 de MicrosoftSQL Server, executeUpdate devolverán el número correcto de filas actualizado en una operación MERGE.
Sintaxis:
public int executeUpdate(java.lang.String sql)

Parámetros
sql
Un objeto String que contiene la instrucción SQL.
Valor devuelto
Un valor int que indica el número de filas afectadas o 0 si se usa una instrucción DDL.
Puede utilizar el método Statement.executeUpdate para realizar las acciones siguientes:
Ejecutar sentencias de definición de datos, tales como CREATE, ALTER, DROP, GRANT y REVOKE
Ejecutar sentencias INSERT, UPDATE, DELETE y MERGE que no contienen marcadores de parámetros.
Con IBM® Data Server Driver for JDBC and SQLJ, ejecutar la sentencia CALL para invocar procedimientos almacenados que carecen de parámetros y no devuelven conjuntos de resultados.

Procedimiento
Para ejecutar esas sentencias de SQL, debe seguir estos pasos:

Invoque el método Connection.createStatement para crear un objeto Statement.
Invoque el método Statement.executeUpdate para ejecutar la operación de SQL.
Invoque el método Statement.close para cerrar el objeto Statement.



*      Uso de CallableStatement
Un objeto CallableStatement provee de una forma estándar de llamar a procedimientos almacenados de la base de datos. Un procedimiento almacenado se encuentra en la base de datos. La llamada al procedimiento es lo que contiene el objeto CallableStatement. Esta llamada se escribe en una sintaxis de escape que puede tomar una de dos formas: una formato con un parámetro resultado y el otro sin el. (Ver la sección 4 para mas información sobre la sintaxis de escape). Un parámetro resultado, un tipo de parámetro OUT, es el valor devuelto por el procedimiento almacenado. Ambos formatos pueden tener un número variable de parámetros de entrada (parámetros IN), de salida (parámetros OUT) o ámbos (parámetros INOUT). Un interrogante sirve como ‘anclaje’ para cada parámetro.
La sintaxis para invocar un procedimiento almacenado en JDBC se muestra a continuación: Notar que los corchetes indican que lo que se encuenta contenido en ellos es opcional, no ofroma parte de la sintaxis.

{call procedure_name[(?, ?, ...)]}

La sintaxis para un procedimiento que devuelve un resultado es:

{? = call procedure_name[(?, ?, ...)]}

La sintaxis para un procedimiento almacenado sin parámetros se parece a algo como:

{call procedure_name}

CallableStatement hereda los métodos de Statement, los cuales tratan sentencias SQL en general, y también hereda los métodos de PreparedStatement, que tratan los parámetros IN. Todos los métodos definidos para CallableStatement tratan los parámetros OUT o los aspectos de salida de los parámetros INOUT: registro de los tipos JDBC (tipos genéricos SQL) de los parámetros OUT, recuperación de valores desde ellos o chequear si el valor devuelto es un JDBC NULL.

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 dos argumentos y no devuelve resultados.

CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}"); donde los encajes ‘?’ son parámetros IN, OUT ó INOUT dependiendo del procedimiento getTestData.

Parámetros IN y OUT
El paso de valor para cualquier parámetro IN de un objeto CallableStatement se realiza mediante los métodos setXXX heredados de PreparedStatement. El tipo de el valor a pasar se determina por el método setXXX a usar (setFloat para pasar un valor float, y así).
Si el procedimiento almacenado devuelve parámetros OUT, el tipo JDBC de cada parámetro OUT debe ser registrado antes de que el objeto CallableStatement sea ejecutado (Esto es necesario porque algunas DBMS necesitan el tipo JDBC). El registro del tipo JDBC se realiza mediante el método registerOutParameters. Después que la sentencia ha sido ejecutada, los métodos getXXX de CallableStatement recuperan los valores de los parámetros. El método correcto getXXX a usar es el tipo Java que corresponde al tipo JDBC registrado para el parámetro. En otras palabras registerOutParameter usa un tipo JDBC (por tanto coincide con el tipo con el tipo JDBC que la base de datos devolverá) y getXXX ‘casts’ este a un tipo Java.

Para ilustrar esto, el siguiente ejemplo registra los parámetros OUT, ejecuta el procedimiento almacenado llamado por cstmt y recupera los valores devueltos en los parámetros OUT. El método getByte recupera un byte Java de el primer parámetro, y getBigDecimal recupera un objeto BigDecimal (con tres dígitos después del punto decimal) del segundo parámetro OUT:

CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}");
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);
cstmt.executeQuery();
byte x = cstmt.getByte(1);
java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);

De modo distinto a ResultSet, CallableStatement no tiene un mecanismo especial para recuperar grandes valores OUT incrementalmente.

*      Ejemplos
Un ejemplo típico es:
PreparedStatement pstmt = con.prepareStatement(
"update empleado set sueldo = ? where id_empleado = ?");
pstmt.setDouble(1, 153833.00);
pstmt.setInt(2, 110592);
Esto nos permite tener una sentencia SQL de fácil lectura y sin tener que concatenar cadenas o hacer conversiones de tipos. De la documentación de java:
An object that represents a precompiled SQL statement.

A SQL statement is precompiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.
Supongamos que tenemos un mapa de empleados y sueldos:

Map<Integer, Double> empleadoSueldo = new HashMap<>();
empleadoSueldo.put(1, 1000.0);
empleadoSueldo.put(2, 2000.0);
empleadoSueldo.put(3, 3000.0);
Es muy común ver un código como el siguiente:
for(Map.Entry<Integer, Double> empleado : empleadoSueldo.entrySet()) {
      PreparedStatement pstmt = con.prepareStatement(
   "update empleado set sueldo = ? where id_empleado = ?");

      pstmt.setDouble(1, empleado.getValue());
      pstmt.setInt(2, empleado.getKey());
      pstmt.executeUpdate();
  }

La definición de PreparedStatement dice que es una sentencia SQL precompilada para ser ejecutada muchas veces. Pero al crear el PreparedStatement cada vez, se está precompilando y ejecutando. Perdiendo completamente la ventaja en rendimiento que supone el precompilado de una sentencia SQL. Hay algunos manejadores que inclusive crean un procedimiento almacenado temporal, cada vez que se crea un PreparedStatement.

Para aprovechar el precompilado, el código debe cambiar a:
PreparedStatement pstmt = con.prepareStatement(
   "update empleado set sueldo = ? where id_empleado = ?");

  for(Map.Entry<Integer, Double> empleado : empleadoSueldo
          .entrySet()) {

      pstmt.setDouble(1, empleado.getValue());
      pstmt.setInt(2, empleado.getKey());
      pstmt.executeUpdate();
}

Así el SQL es interpretado una sola vez por el manejador de base de datos, y de ahí en adelante sólo se ocupa de colocar parámetros y ejecutar.

Ejemplo
Suponga que desea ejecutar esta sentencia de SQL:
UPDATE EMPLOYEE SET PHONENO='4657' WHERE EMPNO='000010'
El código siguiente crea el objeto Statement denominado stmt, ejecuta la sentencia UPDATE y devuelve en numUpd el número de filas que fueron actualizadas. Los números que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
Utilización de Statement.executeUpdateConnection con;

Statement stmt;
int numUpd;
stmt = con.createStatement();           // Crear un objeto Statement   1 

numUpd = stmt.executeUpdate("UPDATE EMPLOYEE SET PHONENO='4657' WHERE EMPNO='000010'");               
                                             // Ejecutar la actualización     2

stmt.close();                               // Cerrar el objeto Statement     3     

1.    Resumen
Definición:
PreparedStatement nos permite definir una sentencia SQL base, que nos sirve para modificar/insertar/buscar uno o varios registros con sólo cambiar los valores de los parámetros que especifiquemos.
Método executeUpdate()
Ejecuta la instrucción SQL determinada, que puede ser una instrucción INSERT, UPDATE o DELETE; o una instrucción SQL que no devuelve nada, como una instrucción DDL de SQL.
Uso de Callable Statement
Un objeto CallableStatement provee de una forma estándar de llamar a procedimientos almacenados de la base de datos. Esta llamada se escribe en una sintaxis de escape que puede tomar una de dos formas: un formato con un parámetro resultado y el otro sin él.
2.Summary
Definition:
PreparedStatement allows us to define a base SQL statement, which allows us to modify / insert / search one or more records by simply changing the values ​​of the parameters we specify.
ExecuteUpdate () method
Execute the given SQL statement, which can be an INSERT, UPDATE or DELETE statement; Or an SQL statement that does not return anything, such as a SQL DDL statement.
Callable Use Statement
A CallableStatement object provides a standard way of calling stored procedures from the database. This call is written in an escape syntax that can take one of the forms: One form with one result of the parameter and the other without it.
3.    Recomendaciones
Un objeto PreparedStatement es necesario usar para ejecutar sentencias SQL precompiladas con o sin parámetros IN.
Un objeto CallableStatement se usa para ejecutar un procedimiento de base de datos almacenado.
En EJBs marcar como transaccionales únicamente los métodos necesarios.
Usar al máximo sentencias de base de datos precompiladas a través de la clase PreparedStatement cuando ejecute sentencias SQL. Esto evita que la base de datos compile varias veces la misma consulta y agiliza le ejecución de la sentencia.
4.    Conclusiones
Como hemos visto la interfaz CallableStatements nos permite ejecutar procedimientos almacenados e interactuar con el resultado de una manera rápida y sencilla posicionándose como una buena opción a la hora de trabajar con procedimientos almacenados. Espero que les sirva de utilidad, hasta próximos tutoriales.
La definición de PreparedStatement dice que es una sentencia SQL precompilada para ser ejecutada muchas veces. Pero al crear el PreparedStatement cada vez, se está precompilando y ejecutando. Perdiendo completamente la ventaja en rendimiento que supone el precompilado de una sentencia SQL. Hay algunos manejadores que inclusive crean un procedimiento almacenado temporal, cada vez que se crea un PreparedStatement.
5.    Apreciación del Equipo
Si la base de datos soporta prepared statement y el driver/conector que usemos para hablar con esa base de datos desde java los soporta también, entonces podemos usar los prepared statement desde java.
6.    Glosario de Términos
DDL: Un Data Definition Language o Lenguaje de descripción de datos (DDL) es un lenguaje de programación para definir estructuras de datos.
ALTER: Utilice la instrucción ALTER JAVA para forzar la resolución de un objeto de esquema de clase Java o la compilación de un objeto de esquema de origen Java. (No puede llamar a los métodos de una clase Java antes de que todas sus referencias externas a nombres Java estén asociadas con otras clases.)
IN y OUT: Esta funcionalidad permite definir el tipo de pasaje de parámetros, pudiendo elegir entre uno de los siguientes valores: entrada (in), salida (out) o entrada/salida (inout). El valor por defecto será inout.
7.    Linkografia
http://www.euskalnet.net/jaoprogramador/j2ee/JDBC/jdbc25.htm

DIAPOSITIVAS: http://es.slideshare.net/YordinAlbertoPrezSau/prepared-statement-69990980


FORO: http://www.forosperu.net/temas/prepared-statement.1011012/


VIDEO:




No hay comentarios:

Publicar un comentario