Beruflich Dokumente
Kultur Dokumente
JDBC (Java Database Connectivity) es la parte de Java que nos va a permitir conectarnos con bases de datos relacionales utilizando el lenguaje SQL. JDBC permite la integracin de llamadas SQL dentro del cdigo de nuestro Servlet Java proporcionando clases que nos permiten interactuar de forma fcil, cmoda y homognea con bases de datos externas. Dentro de las bibliotecas que vamos a usar se debe de agregar la lnea import java.sql.*; que no sirve para utilizar las clases de JDBC indiferente de la base de datos que se a conectar.
Leer el driver especfico de la base de datos que vamos a utilizar, en nuestro caso, ser:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
2.
Establecer la conexin. Una vez que tenemos el driver cargado en memoria, tendremos que crear una conexin (objeto de la clase Connection), indicando el driver a usar (jdbc:sqlserver:), la mquina(localhost), el puerto(1433), nombre de base(databaseName) de datos(pedidoplus), el usuario(sa) y su contrasea(12345). Por ejemplo:
conexion = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databa seName=pedidoplus;user=sa;password=12345;");
Cuando se lee el driver especfico de la base de datos (en nuestro, caso jdbc:sqlserver:) se puede producir una excepcin del tipo (ClassNotFoundException que ocurrir si no se tiene instalado correctamente el driver JDBC. Al leer el driver este se quedar en memoria y ser el que se utilice internamente por JDBC.
Cuando se crea una conexin (devuelve un objeto Connection) se abre una conexin con la base de datos que posteriormente se debe de cerrar. Para crear la conexin se utiliza, el mtodo getConnection de la clase DriverManager, tiene cuatro parmetros, el primero ser la cadena de conexin, el segundo nombre de la base de datos, el tercero el nombre el usuario y el cuarto la contrasea de dicho usuario. En la cadena de conexin tenemos el driver que se va a utilizar, para este cado el de sql server jdbc:sqlserver:la mquina a la que nos vamos a conectar precedida de una dos flecas (nosotros podremos usar //localhost para nuestro ordenador local o //server1.ugr.es para un servidor remoto), el puerto a utilizar (tanto local, como remoto usaremos el 1433. Como hemos mencionado anteriormente para toda conexin que abramos tendremos que cerrarla, eso se har mediante el mtodo close() de Connection <%@page contentType="text/html" pageEncoding="UTF-8" import="java.sql.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <% Connection conexion = null; //Objeto para la conexin a la BD Statement sentencia = null; //Objeto para la ejecutar una sentencia ResultSet resultados = null;//Objeto para guardar los resultados String cadena; try { //Leemos el driver sql server Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//Nos conectamos a la BD local conexion = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=p edidoplus;user=sa;password=12345;"; ); //Escribimos el final de la pgina //Creamos una sentencia a partir de la conexin sentencia=conexion.createStatement(); resultados=sentencia.executeQuery("SELECT * FROM articulo"); //Mostramos las distintos empleados } catch(SQLException e) {out.println("ERROR:Fallo en SQL: "+e.getMessage());}; %> </body> </html>
2 Sentencias JDBC
Con la conexin a la base de datos realizada, ya se podrn ejecutar sentencias SQL en la misma para consultar datos, actualizar tablass y aadir/borrar registros. Una Sentencia JDBC es un objeto Statement (traducido sera Sentencia) de JDBC y se utiliza para mandar sentencias SQL a la Base de Datos y no debera confundirse con una sentencia SQL, es decir, sentencia JDBC (objeto Statement) y sentencia SQL no son lo mismo. Un objeto Statement se asocia con una conexin abierta y no con una sentencia SQL en particular, por tanto, un objeto Statement es una pasarela entre la Base de Datos y la JSP que va a permitir ejecutar una o ms sentencias SQL en la Base de Datos.
Para crear un objeto Statement nos hace falta una conexin abierta con la base de datos, por ejemplo: //Nos conectamos a la BD local conexion = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;" + "databaseName=pedidoplus;user=sa;password=12345;"; ); //Escribimos el final de la pgina //Creamos una sentencia a partir de la conexin sentencia=conexion.createStatement(); Tenemos que tener en cuenta que una sentencia va asociada a una conexin, por lo que si se cierra la conexin se cierra la sentencia. Tambin podemos cerrar las sentencias mediante el mtodo close() de forma anloga como hacamos con las conexiones.
"databaseName=pedidoplus;user=sa;password=12345;"; //Nos conectamos a la BD local conexion = DriverManager.getConnection("jdbc:sqlserver://localhost:1433; databaseName=pedidoplus;user=sa;password=12345;"); //Escribimos el final de la pgina //Creamos una sentencia a partir de la conexin sentencia=conexion.createStatement(); resultados=sentencia.executeQuery("SELECT * FROM articulo");
En el cdigo anterior el resultado de la consulta se debe haber almacenado en el objeto resultados de ResultSet, si hay algn problema en la ejecucin de la consulta se ejecutara una excepcin del tipo SQLException.
Con el mtodo executeQuery de la clase Statement devuelve un objeto de la clase ResultSet donde se tendr el conjunto de registros de la consulta. La clase ResultSet proporciona una gran cantidad de mtodos para poder moverse entre los registros de la consulta y, para cada registro, entre los distintos atributos que la componen.
<th>Precio </th> </tr> </thead> <tbody> <% while(resultados.next()) { String codigo = resultados.getString("artcodigo"); String nombre =resultados.getString("artnombre"); String Precio = resultados.getString("artprecio"); %> <tr> <td><%=codigo%></td> <td><%=nombre%></td> <td><%=Precio%></td> </tr> <% } %> </tbody> </table> <%
La clase ResultSet tiene un cursor que puede ser usado para movernos entre las distintas filas de los resultados de la consulta y que inicialmente apunta a la primera fila. Podemos usar el mtodo next() (como en el ejemplo anterior) para ir de una fila a la siguiente, por lo que la llamada del mtodo devolver true si hay un siguiente registro y false si ya est en el ltimo. Para obtener los distintos atributos de un registro se utilizarn, normalmente, los mtodos getString(atributo) o getObject(atributo), cuyo parmetro es una cadena con el nombre del atributo que quiere recuperar. La diferencia entre ambos mtodos es que el primero nos devuelve una cadena (clase String) y el segundo un objeto genrico (clase Object). A partir de la claseObject se puede convertir el atributo al tipo de dato que nos interese aunque tambin podemos utilizar el mtodo get apropiado. Para ms informacin podemos consultar la Tabla 1:
Ti po de dat o SQL
BI GI NT Ti po de dat o Java devuel t o por get Obj ect ( )
Long
BI NARY
by t e[ ]
by t e[ ] get By t es ( )
BI T
Bool ean
CHAR
St r i ng
St r i ng get St r i ng( )
DATE
j av a. s ql . Dat e
DECI M AL
j av a. m at h. Bi gDec i m al
DOUBLE
Doubl e
FLOAT
Doubl e
I NTEGER
I nt eger
i nt get I nt ( )
LONGVARBI NARY
by t e[ ]
LONGVARCHAR
St r i ng
I nput St r eam get As c i i St r eam () I nput St r eam get Uni c odeSt r eam ()
NUM ERI C
j av a. m at h. Bi gDec i m al
REAL
Fl oat
SM ALLI NT
I nt eger
TI M E
j av a. s ql . Ti m e
j av a. s ql . Ti m e get Ti m e( )
TI M ESTAM P
j av a. s ql . Ti m es t am p
j av a. s ql . Ti m es t am p get Ti m es t am p( )
TI NYI NT
I nt eger
by t e get By t e( )
VARBI NARY
by t e[ ]
by t e[ ] get By t es ( )
VARCHAR
St r i ng
St r i ng get St r i ng( )
VARCHAR2
St r i ng
St r i ng get St r i ng( )
TABLA 1:Mtodos para extraer los datos de los atributos a partir de un objeto ResultSet
En lugar de utilizar el nombre del atributo, si no se conoce el nombre del atributo , se puede utilizar el nmero de columna: while(resultados.next()) { String codigo = resultados.getString(0); String nombre =resultados.getString(1); String Precio = resultados.getString(2); %> <tr> <td><%=codigo%></td> <td><%=nombre%></td> <td><%=Precio%></td> </tr>
<% } %> </tbody> </table> Hay que tener en cuenta que el objeto ResultSet est ligado al objeto Statement con el que fue creado por lo que si se cierra o se vuelve a usar para otra sentencia SQL el contenido de ResultSet se elimina automticamente. Tambin hay mtodos para saber en qu fila nos encontramos como son getRow() (nos da el nmero de fila), isFirst()(nos pregunta si es la primera), isBeforeFirst()(si estamos justo antes de la primera fila), isLast()(si es la ltima fila), isAfterLast()(si ya no nos quedan ms filas). Tambin se puede determinar cules datos son nulos , esto debido a que los objetos como getInt() no pueden devolver un valor null, para este caso la clase ResultSet proporciona el mtodowasNull() para determinar si se ha devuelto valor nulo Double Precio = resultados.getDouble("artprecio"); Double descuento=0;
if ( !resultados.wasNull() ) descuento = Precio*0.10; else descuento = 0;