1
STATEMENT
1.1
DEFINICION
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 trabajar con los parámetros IN;
y la interfase CallableStatement añade métodos para trabajar con parameters
OUT.
1.1.1
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.1.2
Ejecución de sentencias usando objetos
Statement.
La interfase 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.
El método executeQuery está
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 necesitaran 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.
Debe notarse que la
interfase PreparedStatement, que hereda los métodos de la interfase Statement,
tiene sus propias versiones de los métodos executeQuery, executeUpdate y
execute. Los objetos Statement en sí mismos no contienen una sentencia SQL, por
tanto debe suministrarse como un argumento a los métodos Statement.execute. Los
objetos PreparedStatement no suministran una sentencia SQL como argumento a
estos métodos puesto que ya tienen la sentencia precompilada. Los objetos
CallableStatement heredan las formas de estos métodos de PreparedStatement. Usar
un parametro de query con las versiones de los métodos de PreparedStatement o
CallableStatement producirái una SQLException.
1.1.3
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.
1.1.4
Cerrar
objetos Statement.
Los objetos Statement se
cerrarán automáticamente por el colector de basura de Java (garbage collector).
No obstante se recomienda como una buena práctica de programación que se
cierren explicitamente cuando no sean ya necesarios. Esto libera recursos DBMS
inmediatamente y ayuda a evitar potenciales problemas de memoria.
1.1.5
Sintaxis
de Escape SQL en objetos Statement.
Los objetos Statement pueden
contener sentencias SQL que usen sintaxis de
escape SQL. La sintaxis de
escape señala al driver que el código que lleva debe ser tratado
diferentemente. El driver buscará por cualquier sintaxis de escape y lo traducirá
en código que entiende la base de datos en particular. Esto hace que la
sintaxis de escape sea independiente de la DBMS y permite al programador usar
características que de otro modo no estarían disponibles.
Una clausula de escape se
enmarca entre llaves y tiene una palabra clave:
{keyword . . . parameters .
. . }
La palabra clave (keyword)
indica el tipo de clausula de escape, según se muestra:
• escape para caracteres
LIKE Los caracteres “%” y “_” trabajan como wildcards en la clausula SQL LIKE (“%”
significa cero o más caracteres y “_” significa exactamente un carácter”. En
orden a interpretarlos literalmente, pueden estar precedidos por un backslash
(‘\’), que es un carácter de escape especial en cadenas. Se puede especificar
un carácter que se use como carácter de escape por la inclusión de la sintaxis
siguiente al final de la consulta.
{escape 'escape-character'}
Por ejemplo, la siguiente
query, usando backslash como caracter de escape,
encuentra nombres de
identificador que comiencen con ‘_’.
stmt.executeQuery("SELECT
name FROM Identifiers
WHERE Id LIKE `\_%' {escape
`\'};
• fn para funciones
escalares.Casi todas las DBMS tienen funciones numèricas, de cadena, de fecha y
conversión sobre valores escalares. Una de estas funciones puede usarse
colocándola en la sintaxis de escape con la clave fn seguida del nombre dela
función deseada y sus argumentos. Por ejemplo, para llamar a la función concat
con dos argumentos que serán concatenados:
{fn concat("Hot",
"Java")};
El nombre del usuario actual
de la base de datos puede obtenerse mediante:
{fn user()};
Las funciones escalares
pueden estar soportadas por diferentes DBMS con
ligeras diferencias de
sintaxis, y pueden no estar disponibles en todos los
drivers. Varios métodos de
DatabaseMetaData nos listarán las funciones
que están soportadas. Por
ejemplo, el método getNumericFunctions devuelve
una lista de los nombres de
las funciones numéricas separadas por comas, el
método getStringFunction nos
devuelve los nombres de las funciones de
cadena, y así varías más.
EL driver o bien mapeará la
llamada a la función ‘escapada’ en su propia
sintaxis o implementará la
función el mismo.
• d, t y ts para literales
de fecha y tiempo. Las DBMS difieren en la sintaxis que usan para los literales
de fecha, tiempo y timestamp. JDBC soporta un formato estándar ISO para estos
literales y usa una clausula de escape que el driver debe traducir a la
representación del DBMS.
Por ejemplo, una fecha se
especifica en SQL JDBC mediante la sintaxis:
{d `yyyy-mm-dd'}
En esta sintaxis, yyyy es el
año, mm es el mes y dd es el dia. El driver
reemplazará la clausula de
escape por la representaciòn propia equivalente
de la DBMS. Por ejemplo, el
driver reemplazaría {d 1999-02-28} por ’28-
FEB-99’ si este es el
formato apropiado para la base subyacente.
Hay clausulas de escape
análogas para TIME y TIMESTAMP
{t `hh:mm:ss'}
{ts `yyyy-mm-dd hh:mm:ss.f .
. .'}
La parte fraccional de los
segundos (.f . . .) del TIMESTAMP puede
omitirse.
• call ó ? = call para
procedimientos almacenados
Si una database soporta
procedimientos almacenados, estos pueden ser
invocados desde JDBC
mediante:
{call procedure_name[(?, ?,
. . .)]}
o, cuando el procedimiento
devuelve como resultado un parámetro
{? = call procedure_name[(?,
?, . . .)]}
Los corchetes indican que el
material encerrado en ellos es opcional. Estos
no forman parte de la
sintaxis.
Los argumentos de entrada
pueden ser bien literales, bien parámetros. Ver la
sección 7
“CallableStatement” de esta guía.
Se puede llamar al método
DatabaseMetaData.supportsStoredProcedures
para ver si la base de
datos
soporta procedimientos almacenados.
• oj para joins de salida
La sintaxis para un outer
join es:
{oj outer-join}
donde outer-join es de la
forma:
table LEFT OUTER JOIN {table
| outer-join} ON search-condition
Las Outer joins son una
característica avanzada, y solo puede chequearse la
gramática SQL mediente una
explicación de ella. JDBC provee tres métodos
de DatabaseMetaData para
determinar que tipos de outer joins soporta un
driver: supportsOuterJoins, supportsFullOuterJoins,
y
supportsLimitedOuterJoins.
El método
Statement.setEscapeProcessing activa o desactiva el
procesamiento de escape. Por
defecto la característica se encuentra activada. Un programador debería
desactivar esta característica en tiempo de ejecución cuando el rendimiento ha
de ser máximo, pero normalmente debe estar activado. Debería notarse que
setEscapeProcesing no trabaja con objetos PreparedStatement por que la
sentencia ya está preparada para enviar a la base de datos antes de poder ser
llamada.
1.1.6
Uso del
método execute
El método execute debería
usarse solamente cuando es posible que una sentencia nos devuelva más de un
objeto Resultset., mas de un update count o una combinación de ambos. Estas
múltiples posibilidades para resultados, aunque raras, son posibles cuando se
ejecutan ciertos procedimientos almacenados o por la ejecución dinámica de una
string SQL desconocida (esto es, desconocida para el programador de la
aplicación en tiempo de compilación). Por ejemplo, una usuario podría ejecutar
un procedimiento almacenado (usando una objeto CallableStatement y este
procedimiento podría ejecutar una actualización, después una select, luego una
actualización, después una select y así. Normalmente, alguien que usa un
procedimiento almacenado sabrá que se le va a devolver.
Porque el método execute
maneja los casos que se salen de lo ordinario, no
sorprende que los resultados
devueltos requieren algun manejo especial. Por
ejemplo, supongamos que se
sabe que el procedimiento devuelve dos result sets.
Después de usar el método
execute para ejecutar el procedimiento, se debe lla al método getResultSet para
conseguir el primer result set y después los
métodos apropiados getXXX
para recuperar los valores de él. Para conseguir el segundo result set, se
necesita llamar al método getMoreResults y y despues a getResultSet de nuevo.
Si se sabe que el procedimiento devuelve dos upadte counts, se llama primero al
método getUpdateCount, seguido de getMoreResults y de nuevo getUpdateCount.
Aquellos casos en los que no
se conoce que devolverá se nos presenta una
situación más compleja. El
método 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 después de llamar execute es llmar o bien a
getResultSet o getUpdateCount. Al método getResultSet se le llama para
conseguir el primero de los dos o más objetos ResultSet y al método
getUpdateCount para conseguir el primero de dos o más update counts.
Cuando el resultado de una
sentencia SQL no es un result set, el método
getResultSet devolverá null.
Esto quiere decir que el resultado es un update count o que no hay más
resultados. La única manera de encontrar que significa el valor null en este
caso es llamar al método getUpdateCount, que devolverá un entero. Este entero
será el número 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 más esultados. Si el
método 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 más
resultados. En otras palabras, no hay más resultados cuando lo siguiente es
cierto:
((stmt.getResultSet() ==
null) && (stmt.getUpdateCount() == -1))
Si se ha llamado al método
getResultSet y se ha procesado el objeto
ResultSet devuelto, es
necesario llamar al método getMoreResults para ver si hay más result sets o
update counts.. Si getMoreResults devuelve true, entonces es necesario llamar
de nuevo a getResultSet para recuperar el siguiente result set. Como ya se ha
indicado anteriormente, si getResultset devuelve null hay que llamar a
GetUpdateCount para buscar que significa ese null si un update count o que no
hay más resultados.
Cuando getMoreResults
devuelve false quiere decir que la sentencia SQL ha
devuelto un update count o
que no hay más resultados. Por tanto es necesario
llamar al método getUpdateCount
para encontrar cual es el caso. En esta situación, no habrá más resultados
cuando lo siguiente es cierto:
((stmt.getMoreResults() ==
false) && (stmt.getUpdateCount() == -1))
1.2
PROPIEDADES
|
METODO
|
DESCRIPCION
|
|
void cancel()
|
Cancela
el objeto Statement, abortando la sentencia SQL correspondiente.
|
|
void close()
|
Cierra
el objeto Statement liberando todos los recursos asociados de forma
inmediata.
|
|
boolean execute(String sql)
|
Ejecuta
la sentencia SQL que se pasa por parámetro
|
|
ResultSet
executeQuery(String sql)
|
Ejecuta
una sentencia SQL que devuelve un conjunto de resultados, representando por
el objeto ResultSet.
|
|
int executeUpdate(String sql)
|
Ejecuta la sentencia SQL que se pasa por
parámetroy debe ser del tipo INSERT, UPDATE o DELETE
|
|
Connection getConnection()
|
Devuelve el objeto Connection a partir del
que se ha
creado el objeto Statemen
|
1.3
EJEMPLOS
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:
utilizar el método executeUpdate del objeto Statement
Este es un ejemplo de utilización del método executeUpdate del objeto
Statement.
import java.sql.*;
import java.util.Properties;
public class StatementExample {
public static void
main(java.lang.String[] args)
{
// Sugerencia: cargarlos
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("No se ha podido registrar el
controlador.");
System.out.println(e.getMessage());
System.exit(1);
}
Connection c = null;
Statement s = null;
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.
c =
DriverManager.getConnection(URL, properties);
// Crear un objeto
Statement.
s =
c.createStatement();
// Suprimir la tabla
de prueba, si existe. Nota: en este
// ejemplo se
presupone que la colección MYLIBRARY
// existe en el
sistema.
try {
s.executeUpdate("DROP TABLE MYLIBRARY.MYTABLE");
} catch (SQLException
e) {
// Continuar simplemente... es probable
que la tabla no exista.
}
// Ejecutar una
sentencia SQL que crea una tabla en la base de datos.
s.executeUpdate("CREATE TABLE MYLIBRARY.MYTABLE (NAME VARCHAR(20),
ID INTEGER)");
// Ejecutar algunas
sentencias SQL que insertan registros en la tabla.
s.executeUpdate("INSERT INTO MYLIBRARY.MYTABLE (NAME, ID) VALUES
('RICH', 123)");
s.executeUpdate("INSERT INTO MYLIBRARY.MYTABLE (NAME, ID) VALUES
('FRED', 456)");
s.executeUpdate("INSERT INTO MYLIBRARY.MYTABLE (NAME, ID) VALUES
('MARK', 789)");
// Ejecutar una
consulta SQL en la tabla.
ResultSet rs =
s.executeQuery("SELECT * FROM MYLIBRARY.MYTABLE");
// 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 {
// Cerrar 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.");
}
}
try {
if (c != null) {
c.close();
}
} catch (SQLException
e) {
System.out.println("El borrado no ha podido cerrar
Connection.");
}
}
}
}
1.4
RESUMEN
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:
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.
El
método a usar está determinado por el producto de la sentencia SQL. El método
executeQuery está 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 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.
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.
Debe
notarse que la interfase PreparedStatement, que hereda los métodos de la
interfase Statement, tiene sus propias versiones de los métodos executeQuery,
executeUpdate y execute.
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.
Los
objetos Statement pueden contener sentencias SQL que usen sintaxis de escape
SQL. La sintaxis de escape señala al driver que el código que lleva debe ser
tratado diferentemente.
Esto
hace que la sintaxis de escape sea independiente de la DBMS y permite al
programador usar características que de otro modo no estarían disponibles.
Debería
notarse que setEscapeProcesing no trabaja con objetos PreparedStatement por que
la sentencia ya está preparada para enviar a la base de datos antes de poder
ser llamada. Como ya se ha indicado anteriormente, si getResultset devuelve
null hay que llamar a GetUpdateCount para buscar que significa ese null si un
update count o que no hay más resultados.
Cuando
getMoreResults devuelve false quiere decir que la sentencia SQL ha devuelto un
update count o que no hay más resultados.
1.5
SUMMARY
Statement is used to send SQL statements to
the database.
There
are currently three types of Statement objects, all of which act as containers
for the enforcement of judgments in a given connection:
There
are currently three types of Statement objects, all of which act as containers
for the enforcement of judgments in a given connection: Statement,
PreparedStatement inherits from Statement and CallableStatement inherits from
PreparedStatement.
The
method used is determined by the product of the SQL statement. The method
executeQuery is designed for statements that produce results in a single result
set as SELECT statements. The method executeUpdate is used to execute INSERT,
UPDATE, DELETE and SQL DDL 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 in zero or more rows from a table.
The
return value of executeUpdate is an integer indicating the number of rows that
have been affected.
The
execute method is used to execute statements that return more than one result
set, rather than an update count or a combination of both.
It
should be noted that the PreparedStatement interface, which inherits the
methods of the Statement interface has its own versions of the executeQuery,
executeUpdate and execute methods.
In
the rare cases where you call the execute method, anyway, is not completed
until the result sets or update counts that are generated have been returned.
Statement
objects may contain SQL statements that use SQL escape syntax. The escape
syntax signals the driver that the code that bears should be treated
differently.
This
makes escape syntax is independent of the DBMS and allows the programmer to use
features that otherwise would be unavailable.
It
should be noted that setEscapeProcesing not work with PreparedStatement objects
that the statement is already prepared to send to the database before it can be
called. As noted above, if getResultSet returns null getUpdateCount have to
call to find which means that null if an update count or there are no more
results.
When
getMoreResults returns false means that the SQL statement returned an update
count or there are no more results.UMARY:
1.6 RECOMENDACIONES
Estimado este trabajo le brinda tan solo un poco de información de la
mucha que existe acerca de este tema que statement que es muy importante para enviar
sentencias sql y también recomendarle que para hacer uso de la clase statement anteriormente tendríamos que haber
importado la librería sql que se importa de la siguiente manera
import java.sql.*;
1.7
CONCLUCIONES
Bueno
Hemos concluido que la clase 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.
1.8
APRECIACION DEL EQUIPO
Este trabajo nos ha
permitido conocer mucho sobre la clase statement, para que sirve, cuáles son
sus propiedades también hemos conocidos para que sirve también nos permitido
entender cuando usar método execute,asi también como es la Ejecución de sentencias usando
objetos Statement y muchas otras cosas más acerca de la clase statement.
1.9
GLOSARIO
Compilar: Es el proceso por el cual se traducen las instrucciones
escritas en un determinado lenguaje de programación a lenguaje máquina.
DBMS:Es iun jetor de base
de datos que permiten almacenar y posteriormente
acceder a los datos de forma rápida y estructurada.
garbage collector:Es un recolector de basura , mecanismo implícito de gestión de memoria implementado en algunos lenguajes de programación de tipo interpretado o semiinterpretado.
wildcards: es un caracter que representa cualquier otro caracter o
cadena de caracteres.
backslash: es un carácter tipográfico que ha experimentado (junto con otros
signos como la barra (/) o la arroba (@) un gran crecimiento en las últimas
décadas debido a su abundante uso en muchos lenguajes y sistemas operativos.
DDL: s un lenguaje proporcionado por el sistema de
gestión de base de datos que
permite a los usuarios de la misma llevar a cabo las tareas de definición de
las estructuras que almacenarán los datos así como de los procedimientos o
funciones que permitan consultarlos.
Lincografia
http://www.euskalnet.net/jaoprogramador/j2ee/JDBC/jdbc17.htm
PARA VER LAS DIAPOSITIVAS DEL TRABAJO SOLO INGRESA A ESTA DIRECCIÓN
