Listas con SQL y Web Service en Java

   Algo que me llamo mucho la atención es la forma en que se programan los Web Services para Java utilizando SQL (ya sea cualquier SGBD), la cosa es que muchos programadores cometen el error (o caen en la comodidad) de retornar una cadena sumamente larga separando las columnas por "coma" (,) y las filas por "punto y coma" (;). La cosa es que en estos casos nuestra APP será un desastre, y la razón es que se encuentran muchos comentarios como estos:

   Java no es capaz de convertir el "list" a XML válido para ser procesador.
 
   Debes utilizar un Array de String porque Java no puede utilizar lista en WS.

   No puedes hacer porque simplemente no puedes.

   Bien, a todos esos comentarios aquí les viene el "como" se han de hacer este tipo de retornos, lo primero que debemos saber es que si es posible, lo segundo es que la lista la transformaremos a un arreglo para retornarlo y lo tercero es que crearemos un servicio óptimo que no hará en ningún momento algún "TRIM". ¿Y que ganamos con todo esto?.... Velocidad!!

   Primero lo primero, no explicaré lo básico de como funciona un WS (al menos no en esta entrada), es por ello que dejo una imagen para hacerse la idea y ver que tiene lógica lo que se intenta hacer:

   Bueno, vamos a lo importante, lo primero es crear el DTO (Data Transfer Object), muchos los crean en la misma clase pero siempre es bueno tenerlos por separado, en esta entrada explico un poco de Instancias:
public class UsuarioDTOej {

    private String nombre;
    private String apellido;
    private String telefono;
    private String nick;
    private int cedula;

    public String getNombre() {
        return nombre;
    }

    public String getApellido() {
        return apellido;
    }

    public String getTelefono() {
        return telefono;
    }

    public String getNick() {
        return nick;
    }

    public int getCedula() {
        return cedula;
    }

    @Override
    public String toString(){
        return getNombre()+","+apellido+","+cedula+","+telefono+","+nick;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public void setNick(String nick) {
        this.nick = nick;
    }

    public void setCedula(int cedula) {
        this.cedula = cedula;
    }
}
   Una vez tenemos las variables en su lugar junto con los métodos para obtenerlas y modificarlas, entonces vamos con la clase que ejecutará la consulta en la base de datos, también conocida como DAO (Data Access Object):
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class UsuarioDAOej {

    UsuarioDTOej usuario;
    ResultSet rs;
    PreparedStatement st;
    String query;
    String [] arr;
    List LaLista;
    Connection conn;

    public UsuarioDAOej(){
        super();
        usuario = null;
    }

    public UsuarioDTOej[] getUsuario(){
        conectar();
        try {
            LaLista = new ArrayList();
            query = "SELECT nombre,apellido,cedula,telefono,nick FROM usuarios";
            st = conn.prepareStatement(query);
            rs = st.executeQuery();
            while (rs.next()) {
                usuario = new UsuarioDTOej();
                usuario.setNombre(rs.getString("nombre"));
                usuario.setApellido(rs.getString("apellido"));
                usuario.setCedula(rs.getInt("cedula"));
                usuario.setTelefono(rs.getString("telefono"));
                usuario.setNick(rs.getString("nick"));
                LaLista.add(usuario);
            }
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDAOej.class.getName()).log(Level.SEVERE, null, ex);
        } return (UsuarioDTOej[])LaLista.toArray(new UsuarioDTOej[LaLista.size()]);
    }

    public void conectar(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/prueba?useServerPrepStmts=true","root","123456");
        } catch (SQLException ex) {
            System.err.print(ex);
            System.exit(0);
        } catch (ClassNotFoundException ex) {
            System.err.print(ex);
            System.exit(0);
        }
    }
}
   Una vez hecho esto, solo nos falta retornar el valor desde nuestro WS en un método:
@WebMethod(operationName = "getUser")
public Users[] getUser() {
    UsuarioDTOej[] lista = null;
    UsuarioDAOej dao = new UsuarioDAOej();
    try {
        lista = dao.getUsuario();
    } catch(Exception ex) {
        //Si queremos hacer algo en caso de error
    } return lista;
}
   Y con esto ya estamos, solo es cuestión de agregar del lado del cliente la función necesaria para llamar al método y comenzar a utilizar el servicio, pero lo mas importante de todo esto es que... No hicimos TRIM...!!


6 Comentarios

Escribir Comentario
Anónimo
AUTOR
16 de agosto de 2013, 19:56 delete

Esta genial la explicacion, solo con una consulta yo soy nuevo en todo esto, en la parte del WS se crea un metodo, este metodo de que tipo es?, ya que cuando lo pongo en el eclipse me da un error

Responder
avatar
29 de agosto de 2013, 8:55 delete

Qué clase de error? el método es del tipo "String", es un return, un valor que envía el WS al navegador....

Responder
avatar
Unknown
AUTOR
25 de octubre de 2016, 12:40 delete

Hola muchas gracias por tu ejemplo me sirvio mucho, pero ahora tengo un lio como puede llenar un select en jsp con el ws

Responder
avatar
27 de octubre de 2016, 16:01 delete

Muestra un ejemplo del código que estás utilizando para darte un ayuda... Saludos!

Responder
avatar
Unknown
AUTOR
29 de mayo de 2017, 20:57 delete

Hola, esta muy bien explicado el paso a paso para realizar la lista con registro de un base de dato, pero tengo solo una duda. ¿Por que en el método del Web Service devuelve un arreglo "Users"?¿De donde salio?.

Responder
avatar
27 de abril de 2018, 10:58 delete

Es el tipo de dato devuelto por el método "public Users[] getUser()"

Responder
avatar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión