Sie sind auf Seite 1von 9

Conexin de JSP con Base de Datos

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.

1 Conexin con la base de datos con JDBC


Antes de acceder a la base de datos, es necesario conectarse desde nuestro Servlet (Cliente, en este caso) a la base de datos (servidor), esto se hace mediante dos pasos:
1.

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.

3 Consultas SQL desde JDBC


En el punto anterior creamos la conexin a la base de datos apartir de esta coneccion ya se pueden crear sentencias JDBC para poder ejecutar sentencias SQL, la forma de ejecutar consultas (sentencias SELECT) desde JSP. Para poder ejecutar consultas tenemos un mtodo executeQuery (traducido sera ejecutarConsulta) de la clase Statement cuyo parmetro es una cadena con una consulta SQL. Por ejemplo: resultados=sentencia.executeQuery("SELECT * FROM articulo"); El resultado de la consulta lo almacenar en un objeto de la clase ResultSet (traducido es ConjuntoDeResultados). Por lo tanto, para hacer una consulta hace falta crear un objetoStatement que permitira ejecutar la consulta y objeto ResultSet que permita almacenar el resultado de la consulta. 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"); cadena = "jdbc:sqlserver://localhost:1433;" +

"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.

3.1 Trabajar con los resultados de una consulta

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.

resultados=sentencia.executeQuery("SELECT * FROM articulo"); //Mostramos las distintos empleados %>

<table border="1"> <thead> <tr> <th>codigo de Articulo</th> <th>Nombre</th>

<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 ( )

M t odo get apr opi ado

Long

l ong get Long( )

BI NARY

by t e[ ]

by t e[ ] get By t es ( )

BI T

Bool ean

l ong get Long( )

CHAR

St r i ng

St r i ng get St r i ng( )

DATE

j av a. s ql . Dat e

j av a. s ql . Dat e get Dat e( )

DECI M AL

j av a. m at h. Bi gDec i m al

j av a. m at h. Bi gDec i m al get Bi gDec i m al

DOUBLE

Doubl e

doubl e get Doubl e( )

FLOAT

Doubl e

doubl e get Doubl e( )

I NTEGER

I nt eger

i nt get I nt ( )

LONGVARBI NARY

by t e[ ]

I nput St r eam get Bi nar y St r eam ()

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

j av a. m at h. bi gDec i m al get Bi gDec i m al ( )

REAL

Fl oat

f l oat get Fl oat ( )

SM ALLI NT

I nt eger

s hor t get Shor t ( )

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;

Das könnte Ihnen auch gefallen