Está en la página 1de 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

Ti po de dat o Java devuel t o


por get Obj ect ( )

Mt odo get apr opi ado

BI GI NT

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 MAL

j av a. mat h. Bi gDec i mal

j av a. mat h. Bi gDec i mal


get Bi gDec i mal

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

NUMERI C

j av a. mat h. Bi gDec i mal

j av a. mat h. bi gDec i mal


get Bi gDec i mal ( )

REAL

Fl oat

f l oat get Fl oat ( )

SMALLI NT

I nt eger

s hor t get Shor t ( )

TI ME

j av a. s ql . Ti me

j av a. s ql . Ti me get Ti me( )

TI MESTAMP

j av a. s ql . Ti mes t amp

j av a. s ql . Ti mes t amp
get Ti mes t amp( )

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;

También podría gustarte