sábado, 20 de febrero de 2016

JDBI como alternativa a JDBC


En el post anterior hablábamos de una librería que nos permite realizar operaciones con bases de datos de una manera más sencilla y similar a lo que se hace con JDBC.

JDBI promete, al menos en teoría, hacer que el manejo de información en bases de datos no sea tan complicada. Haremos un ejemplo práctico para ver si es tan fácil o no.

Supongamos que tenemos una base de datos llamada "test" y una tabla llamada "persona". Obtendremos la información contenida en la tabla persona creando los siguientes archivos (clases):
  • ModeloPersona.java  que servirá como "entidad" en nuestra aplicación.
  • ModeloPersonaMapper. java que servirá como "mapeador" de la entidad.
  • PersonaDAO.java donde definiremos las operaciones de consulta.
  • TestPersona.java que servirá como clase principal.

Nuestra tabla "persona" contiene los siguientes campos: id, nombre, apellidoP, apellidoM, edad,peso, talla. Por lo tanto, nuestra entidad ModeloPersona.java también debe cubrir esos campos.

ModeloPersona.java

public class  ModeloPersona implements java.io.Serializable{
 
private static final long serialVersionUID=1L;

private String id;
private String nombre;
private String apellidoP;
private String apellidoM;
private String edad;
private String peso;
private String talla;

public ModeloPersona(String id, String nombre,String apellidoP,String apellidoM,String edad,String peso,String talla){
    super();
    this.id=id;
    this.nombre=nombre;
    this.apellidoP=apellidoP;
    this.apellidoM=apellidoM;
    this.edad=edad;
    this.peso=peso;
    this.talla=talla;
}

//setters y getters
}


ModeloPersonaMapper.java

 public class ModeloPersonaMapper implements ResultSetMapper<ModeloPersona> {

    @Override
    public ModeloPersona map(int arg0, ResultSet r, StatementContext arg2) throws SQLException {
        ModeloPersona mpersona=new ModeloPersona();
        mpersona.setClave(r.getString("clave"));
        mpersona.setNombre(r.getString("nombre"));
        mpersona.setApellidoP(r.getString("apellidoP"));
        mpersona.setApellidoM(r.getString("apellidoM"));
        mpersona.setEdad(r.getString("edad"));
        mpersona.setPeso(r.getString("peso"));
        mpersona.setTalla(r.getString("talla"));
        return null;
    }

}


PersonaDAO.java
import org.codemonkey.model.ModeloPersona;
import org.skife.jdbi.v2.sqlobject.Bind;
import org.skife.jdbi.v2.sqlobject.SqlQuery;
import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;

@RegisterMapper(ModeloPersonaMapper.class)
public interface PersonaDAO {
    @SqlQuery("SELECT test.persona.clave, test.persona.nombre, test.persona.apellidoP, test.persona.apellidoM, test.persona.edad, test.persona.peso, test.persona.talla FROM test.persona WHERE test.persona.clave = :id")
    ModeloPersona findById(@Bind("id") long id);
    @SqlQuery("SELECT test.persona.clave, test.persona.nombre, test.persona.apellidoP, test.persona.apellidoM, test.persona.edad, test.persona.peso, test.persona.talla FROM test.persona")
    List<ModeloPersona> verTodo();
    void close();
}


Finalmente la clase TestPersona.java

package org.codemonkey.test1;

import org.codemonkey.dao.PersonaDAO;
import org.codemonkey.model.ModeloPersona;
import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.Handle;
import static java.lang.System.out;

public class TestPersona {

    public static void main(String[] args) {
        DBI dbi = new DBI("jdbc:mysql://localhost:3306/test",
                "root",
                "5432");
        Handle h = dbi.open();
        if(!dbi.open().isInTransaction()){
            out.println("No esta realizando alguna transaccion");
        }
       
        PersonaDAO pers=null;
        try{
            pers=dbi.open(PersonaDAO.class);
            if(pers.verTodo().size() > 0){
                out.println("Lista de persona llena!!:"+pers.verTodo().size());
                out.println(""+pers.verTodo().toString());
                for(int i=0 ; i < pers.verTodo().size(); i++){
                    out.println("id:"+pers.verTodo().get(i).getClave());
                    out.println("nombre:"+pers.verTodo().get(i).getNombre());
                    out.println("apellido paterno:"+pers.verTodo().get(i).getApellidoP());
                    out.println("apellido materno:"+pers.verTodo().get(i).getApellidoM());
                    out.println("edad:"+pers.verTodo().get(i).getEdad());
                    out.println("peso:"+pers.verTodo().get(i).getPeso());
                    out.println("talla:"+pers.verTodo().get(i).getTalla());   
                   
                }
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            pers.close();
        }
       
        h.close();
    }

}