Thursday, 7 May 2009

Trabajando con JDBC y J2EE (MySQL - SQLServer)

En este pequeño post os hago una pequeña introducción tipo tutorial de como hacer una pequeña conexión mediante JDBC para una Base de datos MySQL y SQLServer. La verdad es que es bastante sencillo, el problema es que siempre hay que hacer unos pequeños truquillos para que acabe de funcionar correctamente. Aquí os lo explico con detalle, añadiendo el código de los servlets que he hecho y la manera de acceder a los datos con las 2 bases de datos, que siempre tienen pequeñas diferencias.

  • Configuración para SQLServer:
En este caso he escogido una BD con SQLServer 2005, por lo tanto lo que hago es descargar el driver JDBC para SQLServer 2005, que lo podemos encontrar en el siguiente enlace:
http://www.microsoft.com/downloads/details.aspx?FamilyID=99b21b65-e98f-4a61-b811-19912601fdc9&displaylang=en

También podemos descargarnos el fichero directamente desde aquí:
sqljdbc_1.2.2828.100_enu.exe

Una vez descargado, lo ejecutamos y nos descomprimirá una carpeta con los .jar necesarios para nuestra aplicación. La ponemos en una ubicación conocida para luego ir a buscar los ficheros. Además, tenemos que copiar el .jar que tiene asociado y dejarlo en la ruta del deploy del jboss, sobretodo tenemos que acordarnos de esto, ya que sino, cuando se genere el .war éste no añade las librerías externas que necesita nuestro servlet. Por lo tanto tenemos que ir a la ruta del driver del JDBC para SQL Server, en mi caso:
C:\Archivos de programa\dev\Microsoft SQL Server 2005 JDBC Driver\sqljdbc_1.2\enu

cogemos el fichero sqljdbc.jar, y lo copiamos dentro de la carpeta:

C:\jboss-5.0.1.GA\server\default\deploy
Acordaros que ya hice un post de como configurar el jboss y crear servlets.

Luego haremos lo mismo con el driver para MySQL.

Una vez tenemos hecho esto, pues a tirar millas, creamos un pequeño servlet con eclipse (J2EE) y lo configuramos por ejemplo para leer los productos de la base de datos NorthWind, y los mostramos por pantalla, entonces el servlet tendría el siguiente aspecto:


El código fuente lo tenéis aquí:

GetValuesFromServer.java



import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class GetValuesFromServer extends HttpServlet {
private java.sql.Connection conexion = null;
private final String url = "jdbc:sqlserver://";
private final String serverName = "localhost";
private final String portNumber = "1433";
private final String databaseName = "NorthWind";
private final String userName = "user";
private final String password = "1234";
private final String selectMethod = "cursor";

public void init(ServletConfig conf) throws ServletException {
super.init(conf);
}

private String getConnectionUrl() {
return url + serverName + ":" + portNumber + ";databaseName="
+ databaseName + ";" + "selectMethod=" + selectMethod + ";";
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conexion = java.sql.DriverManager.getConnection(getConnectionUrl(),
userName, password);
Statement s = conexion.createStatement();
ResultSet rs = s.executeQuery("select * from products");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>List of products</title></head><body>");
out.println("<h1>List of Products NorthWind</h1><br>");
out.println("<UL>");
while (rs.next()) {
out.println("<LI> " + rs.getInt(1) + "," + rs.getString(2)
+ "," + rs.getString(5) + "," + rs.getDouble(6));
}
out.println("</UL>");
out.println("<br>");
out.println("</body></html>");
conexion.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}





web.xml



<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>SQLServerTest</display-name>
<servlet>
<servlet-name>GetValuesFromServer</servlet-name>
<servlet-class>GetValuesFromServer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetValuesFromServer</servlet-name>
<url-pattern>/GetValuesFromServer</url-pattern>
</servlet-mapping>
</web-app>




El resultado de ejecutar la ruta:
http://localhost:8080/SQLServerTest/GetValuesFromServer


Podemos ver como al cargar la página, obtenemos todos los productos de la tabla products de la NorthWind.

  • Configuración para MySQL:
En este caso seguiremos los mismos pasos, primero descargaremos el MySQL Connector para JDBC, que lo podemos encontrar aquí:
http://dev.mysql.com/downloads/connector/j/5.0.html

Una vez descargado, lo copiamos donde tengamos el MySQL (también tengo un post de como instalarlo, las pruebas las he hecho con la versión 5.0). Y hacemos lo mismo que con el SQLServer, nos dirigimos a la ruta del Connector:

C:\Archivos de programa\MySQL\mysql-connector-java-5.0.8
y copiamos el fichero mysql-connector-java-5.0.8-bin.jar dentro de la carpeta:

C:\jboss-5.0.1.GA\server\default\deploy

En este caso, como no hay una BD de prueba dentro del MySQL, he creado una BD que se llama webshop que tiene una tabla products, y he añadido un par de elementos para hacer una pequeña simulación.

Una vez hecho, creamos el proyecto con el siguiente aspecto:


Aquí os dejo el código:

GetValuesFromServer.java



import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class GetValuesFromServer extends HttpServlet {
private java.sql.Connection conexion = null;
private final String url = "jdbc:mysql://";
private final String serverName = "127.0.0.1";
private final String portNumber = "3306";
private final String databaseName = "webshop";
private final String userName = "root";
private final String password = "1234";

public void init(ServletConfig conf) throws ServletException {
super.init(conf);
}

private String getConnectionUrl() {
return url + serverName + ":" + portNumber + "/" + databaseName;
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Class.forName("org.gjt.mm.mysql.Driver");
conexion = java.sql.DriverManager.getConnection(getConnectionUrl(),
userName, password);
Statement s = conexion.createStatement();
ResultSet rs = s.executeQuery("select * from products");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>List of products</title></head><body>");
out.println("<h1>List of Products WebShop</h1><br>");
out.println("<UL>");
while (rs.next()) {
out.println("<LI> " + rs.getInt(1) + "," + rs.getString(2)
+ "," + rs.getDouble(3) + "," + rs.getInt(4));
}
out.println("</UL>");
out.println("<br>");
out.println("</body></html>");
conexion.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}





web.xml



<?xml version="1.0" encoding="UTF-8"?>
<
web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>MySQLServerTest</display-name>
<servlet>
<servlet-name>GetValuesFromServer</servlet-name>
<servlet-class>GetValuesFromServer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetValuesFromServer</servlet-name>
<url-pattern>/GetValuesFromServer</url-pattern>
</servlet-mapping>
</web-app>




El resultado de consultar la ruta:
http://localhost:8080/MySQLServerTest/GetValuesFromServer


acordaros sobre todo de que hay que añadir (Add External Jar) las librerias .jar de los drivers del JDBC.
espero que os sea útil el tutorial.

0 comments:

Post a Comment