Está en la página 1de 7

Establecer CONEXION CON BDX ---------------------------Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //loads the driver String url = "jdbc:odbc:fred"; Connection con= DriverManager.

getConnection(url, "userID", "passwd"); CREACION DE OBJETOS STATEMENT para enviar sentencias SQL ---------------------------------------------------------Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2"); -----------------------------|Metodos del objetos Statement| ------------------------------ executeQuery: se usa para enviar sentencias que producen como resultado un uni co ResultSet como SELECT - executeUpdate: se usa para ejecutar sentencias INSERT,UPDATE o DELETE asi como sentencias SQL DDL(Data Definition Language) como CREATE TABLE o DROP TABLE. Al usar INSERT,UPDATE o DEL ETE modifica una o mas columnas en cero o ms filas de una tabla. El valor devuelto es un entero que indi ca el nmero de filas que han sido afectadas. Al usar CREATE TABLE o DROP TABLE, estos no operan sobre filas, el valor devuelto es cero. - execute: se usa para ejecutar sentencias que devuelven mas de un resulset. *Ojo: Es necesario completar el proceso con el actual Resulset antes de reejecut ar una sentencia Statement. Los objetos Statement en si mismos no contienen una sentencia SQL, por tanto deb e suministrarse como argumento a los mtodos executeQuery,executeUpdate y execute. Los objetos PreparedStatement no suministran una sentencia SQL como argumento a estos mtodos pues ya tienen la sentencia precompilada. Los objetos CallableStatement heredan las formas de los mtodos PreparedStatement. ----------------CLASE ResultSet | ----------------Contiene todas las filas que satifacen las condiciones de una sentencia SQL y pr oporciona el acceso a los datos de estas filas mediante un conjunto de metodos get que permiten el acceso a las diferentes columnas de las filas. El metodo ResultSet.next se usa para moverse a la siguiente fila d el resultset, convirtiendo a sta en la fila actal. El resultado general de un ResultSet es una tabla con cabe ceras de columna y los valores correspondientes devueltos por la query. Por ejemplo, si la query es SEL ECT a,b,c FROM table1, el resultado tendr una forma semejante a: a -------12345 b --------Cupertino c -------CA

83472 83492

Redmond Boston

WA MA

java.sql.Statement stmt = conn.createStatement(); ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (r.next()) { // print the values for the current row. int i = r.getInt("a"); String s = r.getString("b"); float f = r.getString("c"); System.out.println("ROW = " + i + " " + s + " " + f); } El codigo anterior devuelve una coleccin de filas, con columna 1 como un int, la columna 2 como un String y la columna 3 como un String. Un ResultSet mantiene un cursor que apunta a la fila actal de datos. El cursor se mueve una fila hacia abajo cada vez que se llama al mtodo next. Incialmente se sita antes de la primera fila, por lo que hay que llamar al mtodo next para situarlo en la primera fila conviertiendola en la fila actal. L as filas de ResultSet se recuperan en secuencia desde la fila ms alta a la ms baja. Un cursor se mantien e vlido hasta que el objeto ResultSet o su objeto padre Statement se cierra. Manejo de columnas del ResultSet -------------------------------Los mtodos getXXX suministran los medios para recuperar los valores de las column as de la fila actal. Dentro de cada fila, los valores de las columnas pueden recuperarse en cualquier orden, pero para asegurar la mxima portabilidad,deberan extraerse las columnas de izquierda a derecha y leer los valores de las columnas una nica vez. Puede usarse o bien el nombre de la columna o el nmero de columna para referirse a esta.Por ejemplo: si la segunda columna de un objeto ResultSet rs se denomina title y almacena valores de cadena, cualquiera de los dos ejemplos siguientes nos devolver el valor almacenado en la columna. String s = rs.getString("title"); String s = rs.getString(2); Informacin acerca de las columnas en un ResultSet es accesible mediante el mtodo R esultSet.getMetaData. El objeto ResultSetMetaData devuelto nos da el numero, tipo y propiedades de las columnas de los objetos ResultSet. Puede ser conveniente recuperar datos muy grandes en pedazos de tamao fijo. Esto se hace mediante la clase ResultSet que devuelve streams java.io.Input desde los cuales los datos puede n ser leidos en pedazos . Ntese que estas corrientes deben ser accedidas inmediatamente porque se ci erran automticamente con la llamada al siguiente mtodo getXXX de ResultSet. El API JDBC tiene tres mtodos diferentes para recuperar streams, cada uno con un valor diferente de retorno. getBinaryStream: devuelve una corriente que simplemente suminiistra bytes en brut

o desde la base de datos sin ninguna conversin. getAsciiStream: devuelve una corriente con caracteres ASCII getUnicodeStream: devuelve una corriente con caracteres Unicode de 2 bytes. Para determinar si un valor resultado dado por el JDBC es NULL, primero debe int entarse leer la columna y usar el mtodo ResultSet.wasNull para descubrir si el valor devuelto por el JDBC e s NULL. Cuando se ha leido un JDBC NULL usando uno de los mtodos ResultSet.getXXX, el mtod o wasNull devuelve algo de lo siguiente: Un valor null de Java para aquellos mtodos getXXX que devuelven objetos Java (tal es como getString, getBigDecimal, getBytes, getDate,getTime, getTimestamp, getAsciiStream, getUnico deStream,getBinaryStream, getObject). Un valor cero para getByte, getShort, getInt, getLong,getFloat y getDouble. Un valor false para getBoolean. -----------------------------| La Clase PreparedStatement | -----------------------------La interfase PreparedStatement hereda de Statement y defiere de esta en dos mane ras. - Las instancias de PreparedStatement contienen una sentencia SQL que ya ha sido compilada. Esto hace que se llame 'preparada'. - La sentencia SQL contenida en un objeto PreparedStatement pueden tener uno o ms parmetros IN. Un parmetro IN es aquel cuyo valor no se especifica en la sentencia SQL cuando se crea. En v ez de ello la sentencia tiene una interrogante ('?') para cada parmetro IN. Debe suministrarse un valor para ca da interrogante mediante el mtodo apropiado setXXX antes de ejecutar la sentencia. Como los objetos PreparedStatement estn precompilados, su ejecucin es ms rpida que l os objetos Statement. Consecuentemente, una sentencia SQL que se ejecute muchas veces a menudo se crea como PreparedStatement para incrementar su eficacia. PreparedStatement hereda toda la funcionalidad de State ment. Statement, PreparedStatement hereda toda la funcionalidad de Statement. Adems , s e aade un set completo de mtodos necesarios para fijar los valores que van a ser enviados a la base de dato s en el lugar de los encajes para los parmetros IN. Tambin se modifican los tres mtodos execute, executeQu ery y executeUpdate de tal forma que no toman argumentos. Creacin de objetos PreparedStatement ------------------------------------El siguiente ejemplo, donde con es un objeto Connection, crea un objeto Prepared Statement conteniendo una sentencia SQL con dos encajes para parmetros IN. PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?"); El objeto pstmt contiene ahora la sentencia ue ya ha sido enviada a UPDATE table4 SET m= ? WHERE x = ? , q

la base de datos y ha sido preparada para su ejecucin. Pasar parmetros IN ------------------Antes de que un objeto PreparedStatement sea ejecutado debe fijarse el valor de cada encaje ? . Se hace esto mediante la llamada a un mtodo setXXX, donde XXX es el tipo apropiado para el parm etro. Por ejemplo, si el parmetro tiene un tipo Java long, el mtodo a usar ser setLong.Por ejemplo, lo sigui ente fija el primer parmetro a 123456789 y el segundo a 10000000. pstmt.setLong(1, 123456789); pstmt.setLong(2, 100000000); Una vez que el valor ha sido fijado para una sentencia dada, puede usarse para ml tiples ejecuciones de esa sentencia hasta que se limpie mediante el mtodo ClearParameters. El mismo objeto PreparedStatement puede ejecutarse mltiples veces si la base de d atos subyacente y el driver guardan las sentencias abiertas despus que hayan sido conmitadas . Usando pstmt, el objeto PreparedStatement creado anteriormente, el siguiente eje mplo ilustra como fijar los parmetros de los dos encajes y ejecutar pstmt 10 veces. Como se ha mencionado anter iormente, la base de datos no debe cerrar pstmt. En este ejemplo, el primer parmetro se fija a Hi y permanece constante. El segundo parmetro se fija a un valor diferente en cada ejecucin mediante el bucl e for comenzando en 0 y terminando en 9. pstmt.setString(1, "Hi"); for (int i = 0; i < 10; i++) { pstmt.setInt(2, i); int rowCount = pstmt.executeUpdate(); } Uso de setObject ---------------Un programador puede convertir explicitamente un parmetro de entrada en un tipo p articular JDBC mediante el uso de setObject. Este mtodo puede tomar un tercer argumento que especifica el tipo JDBC objetivo. EL driver convertir el Object Java al tipo especificado JDBC antes de enviarlo a la base de datos. Si no se da el tipo JDBC, el driver simplemente mapear el Object Java a su tipo J DBC por defecto (usando la tabla de la seccin 8) y lo enviar a la base de datos. La capacidad de el mtodo setObject para aceptar cualquier objeto Java permite a u na aplicacin ser genrica y aceptar entradas para un parmetro en tiempo de ejecucin. En esta situacin el tipo de entrada no es conocido cuando la aplicacin es compilada. Mediante el uso de setObject, la aplic acin puede aceptar cualquier tipo de objeto Java como entrada al tipo JDBC esperado por la base de datos. Enviar NULL al JDBC como parmetro IN ------------------------------------El mtodo setNull permite a los programadores enviar valores JDBC NULL a la base d e datos como un parmetro IN. Notese de cualquier modo, que debe especificarse el tipo del parmetro.

Tambin se enviar un JDBC NULL a la base de datos cuando un valor Java null se pasa mediante un mtodo setXXX. El mtodo setObject, en cualquier caso, puede tomar un valor null nicamente si se h a especificado el tipo JDBC. -----------------------------| La Clase CallableStatement | -----------------------------Un objeto CallableStatement provee de una forma estndar de llamar a procedimiento s almacenados de la base de datos. Esta llamada se escribe en una sintaxis de escape que puede tomar dos for mas: un formato con un parmetro resultado y el otro sin el. Un tipo de parmetro OUT, es el valor devuelto por el procedimiento almacenado. Ambos formatos pueden tener un nmero variable de parmetros de entrada (parmetros IN), de salida (parmetros OUT) o mbos (parmetros INOUT). Un interrogante sirve como anclaje ara cada parmetro. La sintaxis para invocar un procedimiento almacenado en JDBC se muestra a continuacin: Notar que los corchetes indican que lo que se encuenta contenido en ellos es opcional, no forma 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 parmetros se parece a algo como: {call procedure_name} Si se necesita saber si el DBMS que se esta usando soporta o no procedimientos a lmacenados existen varios mtodos de DatabaseMetaData que suministran tal informacin. Por ejemplo, el mtodo su pportsStoredProcedures devolver true si la DBMS soporta llamadas a procedimientos almacenados y el mtodo getProcedures devolver una descripcin de los procedimientos almacenados disponibles. Crear objetos CallableStatement ------------------------------Los objetos CallableStatement se crean con el mtodo prepareCall de Connection. El siguiente ejemplo crea una instancia de CallableStatement que contiene una ll amada al procedimiento almacenado getTestData, con dos argumentos y no devuelve resultados. CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}"); donde los encajes ? son parmetros IN, OUT INOUT dependiendo del procedimiento getTe stData. Parametros IN y OUT ------------------El paso de valor para cualquier parmetro IN de un objeto CallableStatement se re aliza mediante los mtodos setXXX heredados de PreparedStatement. El tipo de el valor a pasar se determina por el mtodo setXXX a usar (setFloat para pasar un valor float). Si el procedimiento almacenado devuelve parmetros OUT, el tipo JDBC de cada parmet ro OUT debe ser registrado antes de que el objeto CallableStatement sea ejecutado. El registro d el tipo JDBC se realiza mediante el mtodo registerOutParameters. Despus que la sentencia ha sido ejecutada

, los mtodos getXXX de CallableStatement recuperan los valores de los parmetros. El mtodo correcto getXXX a usar es el tipo Java que corresponde al tipo JDBC registrado para el parmetro. 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. El siguiente ejemplo registra los parmetros OUT, ejecuta el procedimiento almacen ado llamado por cstmt y recupera los valores devueltos en los parmetros OUT. El mtodo getByte recupera un byte Java de el primer parmetro, y getBigDecimal recupera un objeto BigDecimal (con tres dgitos despus del punto decimal) del segundo parmetro 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); Parmetro INOUT --------------Son parmetros que suminstran entradas as como aceptan salidas. Estos requieren lla mar a los mtodos apropiados setXXX (heredados de PreparedStatement) adems de llamar al mtodo regist erOutParameter. Los mtodos setXXX fijan los valores como parmetros de entrada y registerOutParamet er registra sus tipos JDBC como parmetros de salida. El mtodo setXXX suminstra un valor Java que el driv er convierte en un valor JDBC antes de enviarlo a la base de datos. El siguiente ejemplo asume que existe un procedimiento almacenado reviseTotal co n un nico parmetro INOUT. El mtodo setByte fija el valor del parmetro a 25 que es el que el driver enviar a l a base de datos como un JDBC TINYINT. Despus registerOutParameter registrar el parmetro como un JDBC TIN YINT. Luego que el procedimiento sea ejecutado se devolver un nuevo JDBC TINYINT y el mtodo getByte l o recuperar como un nuevo valor byte Java. CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}"); cstmt.setByte(1, 25); cstmt.registerOutParameter(1, java.sql.Types.TINYINT); cstmt.executeUpdate(); byte x = cstmt.getByte(1); Recuperar parmetros OUT despus de resultados ---------------------------------------------Se recomienda que todos los resultados generados por la ejecucin de un objeto Cal lableStatement deberan recuperarse antes que los parmetros OUT usando los mtodos CallableStatement.getXXX . Si un objeto CallableStatement devuelve mltiples objetos ResultSet (mediante una llamada al mtodo execute), todos los resultados deben recuperarse antes que los parmetros OUT. En este caso, debe asegurarse de que tod os los resultados han sido accedidos, los mtodos de Statement getResultSet, getUpdateCount y getMoreResults necesitan ser llamados

hasta que no haya ms resultados. Despus de esto, los valores de los parmetros OUT pueden ser recuperados mediante l os mtodos CallableStatement.getXXX Recuperar valores NULL en parmetros OUT ---------------------------------------El valor devuelto en un parmetro OUT puede ser JDBC NULL. Cuando esto ocurre, le valor JDBC NULL se convertir de forma que el valor devuelto por el mtodo getXXX sea null, 0 o false d ependiendo del tipo del mtodo getXXX usado. Como con los objetos ResultSet, la nica manera de saber si un valor de 0 o false fue originalmente NULL JDBC es testear el mtodo wasNull, que devuelve true si el l timo valor ledo por un mtodo getXXX fue JDBC NULL y false en caso contrario.

También podría gustarte