Anda di halaman 1dari 3

La clase Statement

Un objeto Statement se usa para enviar sentencias SQL a la base de datos. Actualmente hay tres tipos de objetos Statement, todos los cuales actan como contenedores para la ejecucin de sentencias en una conexin dada: Statement, PreparedStatement que hereda de Statement. CallableStatement que hereda de PreparedStatement. Estas estn especializadas para enviar tipos particulares de sentencias SQL
Un objeto Statement se usa para ejecutar una sentencia SQL simple sin parmetros. Un objeto PreparedStatement se usa para ejecutar sentencias SQL pre compiladas con o sin parmetros IN; Un objeto CallableStatement se usa para ejecutar un procedimiento de base de datos almacenado.

La interface Statement suministra mtodos bsicos para ejecutar sentencias y devolver resultados. La interface PreparedStatement aade mtodos para trabajar con los parmetros IN; La interface CallableStatement aade mtodos para trabajar con parmetros OUT.

Creacin de objetos Statement


Una vez establecida la conexin con una base de datos particular, esta conexin puede usarse para enviar sentencias SQL. Un objeto Statement se crea mediante el mtodo de Connection createStatement, como podemos ver en el siguiente fragmento de cdigo. 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 mtodos de ejecucin del objeto Statement. Por ejemplo: Result Set rs = stmt.executeQuery("SELECT a, b, c FROM Table2");

Ejecucin de sentencias usando objetos Statement.


La interfase Statement nos suministra tres mtodos diferentes para ejecutar sentencias SQL, executeQuery, executeUpdate y execute. El mtodo a usar est determinado por el producto de la sentencia SQL. El mtodo executeQuery est diseado para sentencias que producen como resultado un nico result set tal como las sentencias SELECT. El mtodo executeUpdate se usa para ejecutar sentencias INSERT, UPDATE o 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 modificacin de una o ms columnas en cero o ms filas de una tabla. El valor devuelto de executeUpdate es un entero que indica el nmero de filas que han sido afectadas (referidos 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 mtodo execute se usa para ejecutar sentencias que devuelven ms de un result set, ms que un update count o una combinacin de ambos. Como es esta una caracterstica avanzada que muchos programadores no necesitaran nunca se ver en su propia seccin.

Todos los mtodos 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. Debe notarse que la interfase PreparedStatement, que hereda los mtodos de la interface Statement, tiene sus propias versiones de los mtodos executeQuery, executeUpdate y execute. Los objetos Statement en si mismos no contienen una sentencia SQL, por tanto debe suministrarse como un argumento a los mtodos Statement.execute. Los objetos PreparedStatement no suministran una sentencia SQL como argumento a estos mtodos puesto que ya tienen la sentencia pre compilada. Los objetos CallableStatement heredan las formas de estos mtodos de PreparedStatement. Usar un parmetro de query con las versiones de los mtodos de PreparedStatement o CallableStatement producir una SQLException.

Uso del mtodo execute


El mtodo execute debera usarse solamente cuando es posible que una sentencia nos devuelva ms de un objeto Resultset, ms de un update count o una combinacin de ambos. Estas mltiples posibilidades para resultados, aunque raras, son posibles cuando se ejecutan ciertos procedimientos almacenados o por la ejecucin dinmica de una string SQL desconocida (esto es, desconocida para el programador de la aplicacin en tiempo de compilacin). Por ejemplo, una usuario podra ejecutar un procedimiento almacenado (usando una objeto CallableStatement y este procedimiento podra ejecutar una actualizacin, despus una select, luego una actualizacin, despus una select y as. Normalmente, alguien que usa un procedimiento almacenado sabr que se le va a devolver. Porque el mtodo execute maneja los casos que se salen de lo ordinario, no sorprende que los resultados devueltos requieran algn manejo especial. Por ejemplo, supongamos que se sabe que el procedimiento devuelve dos result sets. Despus de usar el mtodo execute para ejecutar el procedimiento, se debe llamar al mtodo getResultSet para conseguir el primer result set y despus los mtodos apropiados getXXX para recuperar los valores de l. Para conseguir el segundo result set, se necesita llamar al mtodo getMoreResults y despues a getResultSet de nuevo. Si se sabe que el procedimiento devuelve dos upadte counts, se llama primero al mtodo getUpdateCount, seguido de getMoreResults y de nuevo getUpdateCount. Aquellos casos en los que no se conoce que devolver se nos presentan una situacin ms compleja. El mtodo execute devuelve true si el resultado es un objeto ResultSet y false si es un int Java. Si devuelve un int, esto quiere decir que el resultado o bien es un update count o que la sentencia que ha ejecutado es un comando DDL. Lo primero que hay que hacer despus de llamar execute es llamar o bien a getResultSet o getUpdateCount. Al mtodo getResultSet se le llama para conseguir el primero de los dos o ms objetos ResultSet y al mtodo getUpdateCount para conseguir el primero de dos o ms update counts. Cuando el resultado de una sentencia SQL no es un result set, el mtodo getResultSet devolver null. Esto quiere decir que el resultado es un update count o que no hay ms resultados. La nica manera de encontrar que significa el valor null en este caso es llamar al mtodo getUpdateCount, que devolver un entero. Este entero ser el nmero de filas afectadas por la sentencia ejecutada o 1 para indicar o bien que el resultado es un result set o bien que no hay ms resultados. Si el mtodo getResultSet ya ha devuelto null, el resultado no puede ser un objeto ResultSet, por lo que el valor devuelto de 1 tiene que ser que no hay ms resultados.