PostgreSQL + Java w/NetBeans

DN_Mephisto

Bovino maduro
#1
Buenas, aquí les vengo a presentar un código que seguro a muchos les será de gran ayuda. Yo tardé un poco en encontrarlo, espero que le den buen uso y quienes tengan mejores aportaciones, las compartan. Este código lo estoy manejando dentro de NetBeans 6.8, PostgreSQL versión 8.4 (hay que descargar el controlador de la versión 8.4 en http://jdbc.postgresql.org, para las versiones anteriores a la 8.4, el controlador integrado funciona correctamente) y la librería JSTL (Java Standard Tag Libraries)

Voy a suponer que ya conocen NetBeans, el IDE para desarrollo en Java que vaya cómo ha crecido y también, lástima de recursos que consume. El gestor de bases de datos en éste caso no será MySQL sino PostgreSQL versión 8.4 (es la más reciente). También éste primer post es ÚNICAMENTE un resumen, micro-guía o similar, a modo de consulta del código necesario para llevar a cabo ésta tarea.


Aclarado lo anterior, procedemos:


Creamos un proyecto web nuevo, puede ser con frameworks si es que ya los manejan, pero en éste ejemplo no uso (ni es necesario) frameworks. El esqueleto del proyecto contiene las carpetas:



  • Web
  • Source Packages
  • Test Packages
  • Libraries, en donde se tiene que agregar el controlador de PostgreSQL 8.4 que estará en la ubicación en la que lo hayan guardado, y agregar la librería JSTL 1.1. Éstas opciones son Add JAR/Folder... y Add Library... respectivamente. En caso de usar una versión de PostgreSQL anterior a la 8.4, el driver integrado en Add Lirary... funciona correctamente.
  • Test Libraries

Dentro de Source Packages creamos un paquete, preferentemente con el nombre de conexion para facilitarnos las cosas. Ahí debemos crear una clase que será para la conexión (yo le puse PsqlConnection) y una clase con algún método que confirme la conexión (a la que llamé TestConexion).

Al crear un proyecto Web, lo primero que se piensa es en la conexión a la base de datos. No necesariamente debemos tener tablas creadas. El código a manejar en la clase de conexión es el siguiente:

Código:
[FONT=Trebuchet MS][SIZE=2]package conexion;

import java.sql.Connection;[/SIZE][/FONT][FONT=Trebuchet MS][SIZE=2]
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class PsqlConnection {[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]     private  Connection conn;

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]     public  PsqlConnection() throws Exception,
            SQLException {
        String driver = "org.postgresql.Driver";

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]         try {
            try {
                Class.forName(driver);
                Properties props = new Properties();
                String url = "jdbc:postgresql://localhost:5432/mydb";
                props.setProperty("user", "postgres");
                props.setProperty("password", "postgres");

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]                  /* SSL debe configurarse en el archivo de configuracion del servidor*/
                //props.setProperty("ssl", "false");

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]                  conn = DriverManager.getConnection(url, props);

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]                  if (conn != null) {
                    System.out.println("Conexion Exitosa");
                }

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]             }  catch (SQLException e) {
                System.out.println("Excepcion de SQL: " +  e.getMessage());
                e.printStackTrace();
            }
        } catch (Exception ex) {
            System.out.println("Excepcion: " + ex.getCause());
            ex.getMessage();
            ex.printStackTrace();
        }
    }

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]     /**
     * @return conn (conexion)
     */
    public Connection getConn() {
        return conn;
    }

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]     /**
     * @param conn (conexion a establecer)
     */
    public void setConn(Connection conn) {
        this.conn = conn;
    }
}[/SIZE][/FONT]
Y en una segunda clase hacemos la prueba:
Código:
 [FONT=Trebuchet MS][SIZE=2]
package conexion;

import java.sql.*;[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]

public class TestConexion {[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]     private Statement stmt;
    private ResultSet rs;
    private int confirmar;

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]     public int conexionProbada(PsqlConnection conn) throws
            Exception, SQLException {
        try {

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]             stmt =  conn.getConn().createStatement(ResultSet.CONCUR_READ_ONLY,
                    ResultSet.TYPE_SCROLL_SENSITIVE);
            if (stmt.execute("select VERSION()")) {
                confirmar = 1;
            } else
                confirmar = 0;
        } catch (Exception e) {
            System.out.println("Exepcion: " + e.getMessage());
        }

[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]         return confirmar;
    }
}
[/SIZE][/FONT]

¿Pero cómo sabemos que hubo algún resultado? En Source Packages creamos otro paquete que denominaremos Servlets (recuerden que éstos nombres pueden ser los que uds. quieran), que contendrá un servlet o servlets que servirán de intermediarios para el llamado de las clases de conexión y la página JSP.

El servlet que yo he modificado es éste:

Código:
 [FONT=Trebuchet MS][SIZE=2]
package servlet;

import conexion; /* EDICION: TIENEN QUE IMPORTAR EL PAQUETE DE LA CONEXION */

import prueba.controlador.*;[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PruebaConexion extends HttpServlet {[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]
   
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        PsqlConnection conexion = null;
        RequestDispatcher redir = null;
        try {
            conexion = new PsqlConnection();
            conexion.getConn().setAutoCommit(true);
            TestConexion prueba = new TestConexion();
            int resultado = prueba.conexionProbada(conexion);
            if (resultado > 0) {
                System.out.println("EXITO.");
                request.setAttribute("ConexionExitosa", resultado);
            }
            if (request.getParameter("test").equals("si")) {
                request.setAttribute("ConexionExitosa", resultado);
            }
            redir = request.getRequestDispatcher("/index.jsp");
            redir.forward(request, response);
            conexion.getConn().close();
        } catch (SQLException sqlEx) {
            sqlEx.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.close();
        }
    }

+ HttpServlet methods. Click on the + sign on the left to edit the code[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]

}[/SIZE][/FONT] [FONT=Trebuchet MS][SIZE=2]
[/SIZE][/FONT]
La parte que dice "HttpServlet methods. Click on the + sign on the left to edit the code" la he omitido para ahorrar copiar y pegar. La plantilla de NetBeans para éste Servlet no la he modificado gran cosa, es añadir código así que no necesitaremos revisar ni modificar esa parte.

La sección:


Código:
 [FONT=Trebuchet MS][SIZE=2]
int resultado = prueba.conexionProbada(conexion);
            if (resultado > 0) {
                System.out.println("EXITO.");
                request.setAttribute("ConexionExitosa", resultado);
            }
            if (request.getParameter("test").equals("si")) {
                request.setAttribute("ConexionExitosa", resultado);
            }
            redir = request.getRequestDispatcher("/index.jsp");
            redir.forward(request, response);
[/SIZE][/FONT]
Ingresa el valor devuelto por la clase TestConexion en una variable entera. Mientras ésta sea mayor a 0, entonces sí se estableció conexión y el query "Select VERSION()" funcionó correctamente.

La parte " request.setAttribute("ConexionExitosa", resultado); " escribe una variable en memoria que puede ser accesada a través del JSP. La libería JSTL puede buscar ésta variable que, como pueden ver dentro de setAttribute, se llama "ConexionExitosa", y el valor que lleva consigo es el entero resultado.


El JSP tampoco ha sido modificado, es de hecho el index.jsp genérico que se crea con el proyecto vacío. Previamente hay que agregar a la página web creada lo siguiente:


Código:
 [FONT=Trebuchet MS][SIZE=2]
<%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
...
<html>
    <head>...
[/SIZE][/FONT]
Con ésto habremos establecido la libería principal o "core" bajo el prefijo 'c', de ésta manera, al usar el tag <c:tag></c:tag> las funciones "core" estarán disponibles en toda la página.

Lo único que hay que hacer después es añadir lo siguiente dentro del <body> de la página JSP:


Código:
 [FONT=Trebuchet MS][SIZE=2]
<a href="/ConexionTest/PruebaConexion?test=si">Probar Conexion.</a>
        <p>
            <c:if test="${requestScope['ConexionExitosa'] != null}" >
                <c:out value="${requestScope['ConexionExitosa']}" />
            </c:if>
        </p>
[/SIZE][/FONT]

Si todo lo han hecho correctamente, aparecerá un '1' en la ubicación en la que hayan pegado el anterior código.

Para quienes ya tienen un poco de experiencia con Java, serán pocos los problemas que tengan. Para neófitos y principiantes me reservaré un espacio para explicar paso a paso el procedimiento. Saludos.



:metal:
 

DN_Mephisto

Bovino maduro
#2
Reservado en caso de haber muchas peticiones de explicaciones más específicas.

EDIT: AGREGADO UN DETALLE EN EL SERVLET PruebaConexión.
 

darinchy

Bovino maduro
#3
Gracias por el aporte...

yo me estoy iniciando y me gustaria administrar una base de datos en postgresql y java...

solo instale el postgresql 8.4 desde consola ubuntu lucid
 
Arriba