Tutorial: Una forma rápida de usar Ibatis, Postgresql con Netbeans 6.7


Este es un pequeño tutorial en el cual trato de mostrar una forma rápida de como utilizar IBatis desde java para manejar persistencia de datos utilizando nuestro favorito postgresql como gestor de base de datos. Como siempre he dicho este blog no pretende mostrar la parte teórica, para eso ya existen varios sitios en donde podemos leerlo de forma debida, solo tratamos de mostrar el trabajo de manera rápida y practica. Bueno  manos a la obra; lo primero que debemos tener en cuenta que trabajaremos con la versión 2.3.4 de IBatis, hago esta aclaración debido a que actualmente existe una versión beta 5 de esta librería y aparentemente estas difieren por lo menos a la hora de la instancia y en la configuración de los xml, eso lo veremos en un post mas adelante. Una vez validado lo anterior, lo que debemos tener es la base de datos creada, para este caso por temas didácticos, utilizaremos la base de datos IBatisDemo la cual contiene una tabla llamada Productos con los campos mostrados en la imagen

Una vez creado la BD y la tabla, creamos el proyecto web al cual lo llamaremos WebAppIBatis y lo que haremos seria crear la siguiente estructura:

Como podran observar, ire indicando que significa cada archivo y mostrando el contenido para asi se pueda entender. Si se fijan en la parte de librerías ya tenemos anexadas las librerías de IBatis y el driver jdbc para postgresql respectivamente. Bueno según la estructura observamos un clase llamada ProductoBean, esta clase contiene los atributos necesarios para poder almacenar un registro de tipo Producto y asi ser mas manipulable, entonces la clase contendra la siguiente estructura:

package org.demo.bean;
/**
*
* @author nachxs
*/
public class ProductoBean {

    private int id_producto;
    private String desc_pro;
    private int stock;
    private String ind_vig;

    public int getId_producto() {
       return id_producto;
    }

    public void setId_producto(int id_producto) {
      this.id_producto = id_producto;
    }

    public String getDesc_pro() {
      return desc_pro;
    }

    public void setDesc_pro(String desc_pro) {
      this.desc_pro = desc_pro;
    }

    public int getStock() {
      return stock;
    }

    public void setStock(int stock) {
      this.stock = stock;
    }

    public String getInd_vig() {
      return ind_vig;
    }

    public void setInd_vig(String ind_vig) {
      this.ind_vig = ind_vig;
    }
}

Luego nos ubicamos en los archivos Conexion.xml que es el encargado de los parámetros de conexión a la base de datos  y tambbien el encargado de las referencias a todos los archivos xml que se puedan crear para mapear los consultas sql , como es el caso de Producto.xml el cual es el encargado de mapear las consultas sql que usaremos en este caso para la obtención de la información respectivamente:

Conexion.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
   PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
   "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
 <transactionManager type="JDBC" >
   <dataSource type="SIMPLE">
    <property name="JDBC.Driver" value="org.postgresql.Driver"/>
    <property name="JDBC.ConnectionURL" value="jdbc:postgresql://localhost:5432/IBatisDemo"/>
    <property name="JDBC.Username" value="postgres"/>
    <property name="JDBC.Password" value="sistemasx"/>
   </dataSource>
 </transactionManager>
 <sqlMap resource="org/demo/xml/Producto.xml" />
</sqlMapConfig>

Productos.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
   PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
   "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
    <sqlMap namespace="Productos">
        <typeAlias alias="Productos" type="org.demo.bean.ProductoBean"/>

        <select id="getProducto" parameterClass="int" resultClass="Productos">
          SELECT id_producto, desc_pro FROM "Productos" WHERE id_producto = #value#
        </select>

        <select id="getProductos" resultClass="Productos">
          SELECT id_producto, desc_pro FROM "Productos"
        </select>
    </sqlMap>

Como podemos observar en este último archivo, estamos mapeando las consultas sql que utilizaremos, vemos que cada tag select tiene un id que es el identificador de cada consulta, tiene un parameterClass, el cual este nos ayuda a enviar parámetros de entrada ya sea datos primitivos como int, long, etc. así como también clases ya sea un bean por ejemplo y el resultClass el cual permitirá almacenar las respuestas a la consultas, en este caso estamos usando ProductoBean, el cual lo asociamos a un alias llamado Productos, según como se indica en el archivo Productos.xml.

Una vez terminado de revisar los archivos mostrados anteriormente, lo que hacemos ahora es crear un Servlet, el cual lo utilizaremos para poder invocar a nuestra consultas, según sea el caso; para esto haremos lo siguiente:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.demo.action;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.demo.bean.ProductoBean;

/**
 *
 * @author nachxs
 */

public class Consultar extends HttpServlet {

    /**
     * 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();
        try {
            String resource = "org/demo/xml/Conexion.xml";
            Reader reader = Resources.getResourceAsReader(resource);
            SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
            String idPro = request.getParameter("id_pro");
            ProductoBean producto = (ProductoBean) sqlMap.queryForObject("getProducto", Integer.parseInt(idPro));
            out.println("<table border='1'>");
            out.println("<tr>");
            out.println("<td>ID</td>");
            out.println("<td>Producto</td>");
            out.println("</tr>");
            out.println("<tr>");
            out.println("<td>" + producto.getId_producto() + "</td>");
            out.println("<td>" + producto.getDesc_pro() + "</td>");
            out.println("</tr>");
            out.println("<table>");
        } catch(Exception ex)  {
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }

    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}

Como podrán darse cuenta dentro de la variable resource tenemos la ruta en donde se encuentra ubicado el archivo xml con los parametros de conexion, en este caso Conexion.xml, y luego en esta linea sqlMap.queryForObject(“getProducto”, Integer.parseInt(idPro)) podemos observar como invocamos a la consulta que se encuentra dentro del archivo xml Productos.xml, identificado con getProducto enviando como parametro de entrada el código de producto y eso se recepciona en ProductoBean para luego ser leido mas facilmente.

Ahora solo nos queda ir al archivo index.jsp y solo invocar al servlet de esta manera tan simple:

<%--
    Document   : index
    Created on : 28/11/2009, 10:10:19 AM
    Author     : nachxs
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!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>
        <form action="Consultar" method="POST">
            ID Producto: <input type="text" name="id_pro" />
            <input type="submit" value="Consultar" />
        </form>
    </body>
</html>

y prácticamente eso seria todo, como verán no es nada difícil, y mas o menos esto seria el resultado:

Anuncios

27 thoughts on “Tutorial: Una forma rápida de usar Ibatis, Postgresql con Netbeans 6.7

  1. hola, amigo queria preguntarte como agregas tu el ibatis al netbeans? te agradezco la respuesta, soy novato y trato de entender como funciona esta vuelta. gracias

  2. Hola Felipe, bueno la forma de agregarlo es dentro del proyecto, le das click derecho y te ubicas en propiedades luego dentro de las opciones de librerias lo agregas haciendo click en el boton “Add Jar/Folder”, ubicas el jar de ibatis previamente descagado y eso seria todo.

    Saludos.

  3. Que tal amigo, yo recree el ejemplo tal cual el video y cargue todos los archivos de libreria(2.3.4.726) incluido(Todo el contenido generado en la carpeta ibatis):

    Pero me indica que no existen estos paquetes:

    import com.ibatis.common.resources.Resources;
    import com.ibatis.sqlmap.client.SqlMapClient;
    import com.ibatis.sqlmap.client.SqlMapClientBuilder;

    En la clase Consultar. Queria pedir tu ayuda en este error y si es posible como lo corrijo. Me hace falta algun paquete extra?

    De antemano mil gracias,

  4. Ya esta solucionado, por lo visto no ea un error…solo que netbeans se tardo un poco actualizando el enlace a las librerias debido a que estaba aplicando actualizaciones.

    Un saludo, y mil gracias.
    ->Me gustaria mucho ver el siguiente post.

  5. Hola mileydis, agregaste la libreria segun lo indicado?, porque si no te lo reconoce es porque seguramente esta mal referenciada. Tienes algun mensaje de error de por medio, si fuera asi podrias mostrarmelo por favor?

    Saludos.

  6. Gracias estaba mal referenciada,cuando consulto ID producto me sale el siguiente error

    type Status report

    message /WebAppIBatis/Consultar

    description The requested resource (/WebAppIBatis/Consultar) is not available.

  7. Que nombre tienes tu clase servlet?, recuerda que cuando haces esto:

    <form action="Consultar" method="POST">
    ...
    </form>

    en el action estas referenciando la clase Consultar que en este caso es tu servlet, pero aparentemente no existe, tal vez tiene otro nombre?, confirma eso por favor.

    Saludos.

  8. Muchas gracias por tu apoyo es que soy novata, yo cree el ejemplo igual que el video.
    Mi clase que en este caso es el servlet tiene como nompre Consultar, solo cambie los datos de Conexion.xml donde puse otros datos como user pass y nombre de la bd.
    Gracias

  9. Mileydis una pregunta, tu cuando creas el servlet lo haces desde el wizard de netbeans, verifica si lo tienes registrado en el archivo de configuracion web.xml

    Saludos.

  10. Perdon pero estoy confundida, cuando me hablas del servlet es de Consultar.java. que en web.xml y no lo tengo registrado. Como puedo hacer porfa.
    Gracias

  11. A lo que me referia es que cuando creaste el servlet lo hiciste dando click derecho en el proyecto -> nuevo -> servlet? o solo creaste una clase directamente. Te lo pregunto porque cuando tu creas un servlet desde netbeans, este se registra automaticamente en el web.xml en la pestaña Servlet alli deberia estar referenciado.
    Lo que te sugiero es que hagas un backup de clase actual y crees el servlet justamente utilizando la opcion servlet de netbeans.

    Espero haberme hecho entender, en todo caso preguntas.

    Saludos.

  12. Muchas gracias, habia creado una clase directamente, ahora cuando consulto ID producto me sale el siguiente error
    Error occurred. Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: java.lang.RuntimeException: Error parsing XPath ‘/sqlMapConfig/sqlMap’. Cause: java.io.IOException: Could not find resource org/demo/xml/Producto.xml

    Gracias por su ayuda

  13. ahora me esta dando el siguiente error:
    — The error occurred in org/demo/xml/Producto.xml. — The error occurred while applying a parameter map. — Check the getProducto-InlineParameterMap. — Check the statement (query failed). — Cause: org.postgresql.util.PSQLException: ERROR: relation “Productos” does not exist

  14. Hola muchas gracias por tu ayuda, estoy haciendo una aplicacion wap donde consulte un dato determinado a travez de un servlet, con tu tutorial lo pude hacer pero me salta la duda luego de cosultar los datos en Consultar.java tengo que volver a mi jsp, como lo haria?
    Gracias

  15. Porque la idea es consultar datos index.jsp y que el resultado se vea en otro jsp y no en la clase Consultar.java. Se puede hacer asi?

  16. muy buen tutotial amigo te hiciste una, lo necesitaba pero con base de datos mysql, es lo mismo ya me esta funcionando.

    Saludos cordiales!!

  17. Hola amigos, saben yo soy nuevo en esto de ibatis, pero en estos momentos necesito implementar ibatis.net en un proyecto, la verdad ya lei la documentacion de la pagina de myibatis paso a paso y no consigo lograr que me salga mi proyecto alguno de ustedes podria proporcionarme algun proyecto de ejemplo para ver como se implementa??? principalmente me estoy atorando en la parte de configuracion de archivos configs y como acceder al context.

    estoy usando los dos frameworks de ibatis
    DataMapper

    Gracias.
    DataAccess

  18. Hola Amigo, muy bueno tu tutorial, me podrias proporcionar un tutorial como este pero completo con altas y bajas.. te cuento que quiro listar protos sin enviar parametros como lo puedo hacer…?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s