Ver Mensaje Individual
  #5 (permalink)  
Antiguo 09/09/2010, 12:00
Avatar de juamd
juamd
 
Fecha de Ingreso: marzo-2009
Ubicación: Bogotá
Mensajes: 285
Antigüedad: 15 años, 8 meses
Puntos: 8
Respuesta: Optimización de consultas a bbdd

Que tal !!!

En la empresa donde trabajo usamos una clase llamada Sql, en la cual vas agregando parametros dependiendo del tipo de consulta que quieras armar, el caso es que siempre la armas igual. La clase puede ser algo como esto:

Código:
package Persistencia;

import java.util.Vector;

public class Sql {

    private Vector colCondiciones = new Vector();
    private Vector colCampos = new Vector();
    private Vector colTablas = new Vector();
    private Vector colValues = new Vector();
    private Vector colJoin = new Vector();
    private Vector colGroup =  new Vector();
    private Vector colOrderBy = new Vector();
    private String funcion = "";


    public void addCondicion(String condicion)
    {
        if(!this.colCondiciones.contains(condicion)){
            this.colCondiciones.add(condicion);
        }
    }
    
    public void addCampo(String campo)
    {
        if(!this.colCampos.contains(campo)){
            this.colCampos.add(campo);
        }
    }

    public Vector getCampos() {
        return this.colCampos;
    }
    
    public void addTabla(String tabla)
    {
        if(!this.colTablas.contains(tabla)){
            this.colTablas.add(tabla);
        }
    }

    public void addValue(String valor)
    {
        //Cuando se pasa un String este valor debe compararse en la base de datos entre comillas simples
        valor = "'"+valor +"'";
        //if(!this.colValues.contains(valor)){
            this.colValues.add(valor);
        //}
    }

    public void addValue(int valor)
    {
        //if(!this.colValues.contains(valor)){
            this.colValues.add(valor);
        //}
    }

    public void addValue(double valor)
    {
        //if(!this.colValues.contains(valor)){
            this.colValues.add(valor);
        //}
    }

    public void addJoin(String valor)
    {
        if(!this.colJoin.contains(valor)){
            this.colJoin.add(valor);
        }
    }

    public void addGroup(int numero)
    {
        this.colGroup.add(String.valueOf(numero));
    }

    public void addOrderBy(int numero)
    {
        this.colOrderBy.add(String.valueOf(numero));
    }

    public void setFuncion(String funcion)
    {
        this.funcion = funcion;
    }

    /**
     * Se recorre cada Vector y se van agregando sus campos a la cadena respectiva separados por ",". Se revisa que
     * el elemento no sea el ultimo, es decir el elemento en la posicion que esta en el tamaño del vector - 1 (en los
     * vectores los elementos van de 0 hasta el tamaño -1) ya que a este no se le puede agregar la ",".
     * */
    public String generar()
    {
        String consulta = "", campos = "", tablas = "", condiciones = "", values = "", 
                joins = "", group = "", order = "";
        int i;

        if(this.colCampos.size() > 0){
            for(i = 0; i < this.colCampos.size(); i++){
                campos = campos + this.colCampos.get(i);
                if(i != (this.colCampos.size() - 1)){
                    campos = campos + ",";
                }
            }
        }
        
        if(this.colTablas.size() > 0){
            for(i = 0; i < this.colTablas.size(); i++){
                tablas = tablas + this.colTablas.get(i);
                if(i != (this.colTablas.size() - 1)){
                    tablas = tablas + ",";
                }
            }
        }

        if(this.colCondiciones.size() > 0){
            for(i = 0; i < this.colCondiciones.size(); i++){
                condiciones = condiciones + this.colCondiciones.get(i);
                if(i != (this.colCondiciones.size() - 1)){
                    condiciones = condiciones + " and ";
                }
            }
            condiciones = " where " + condiciones;
        }

        if(this.colValues.size() > 0){
            for( i = 0; i < this.colValues.size(); i++){
                values = values + this.colValues.get(i);
                if(i != (this.colValues.size() - 1)){
                    values = values + ",";
                }
            }
        }

        if(this.colJoin.size() > 0){
            for( i = 0; i < this.colJoin.size(); i++){
                joins = joins + this.colJoin.get(i) + " ";
            }
            condiciones = " " + joins + " " + condiciones;
        }

        if(this.colGroup.size() > 0) {
            group = "group by ";
            for(i=0; i<this.colGroup.size(); i++){
                group = group + this.colGroup.get(i);
                if( i != (this.colGroup.size() - 1)){
                    group = group + ",";
                }
            }
            condiciones = condiciones + " " +group;
        }

        if(this.colOrderBy.size() > 0){
            order = "order by ";
            for(i=0; i<this.colOrderBy.size(); i++){
                order = order + this.colOrderBy.get(i);
                if( i != (this.colOrderBy.size() - 1)){
                    order = order + ",";
                }
            }
            condiciones = condiciones + " " + order;
        }


        if(this.funcion.equals("insert")){
                consulta = this.funcion + " into " + tablas + "( " + campos + " ) " + " values( " + values + " ) ";
        }else if(this.funcion.equals("update")) {
            consulta = this.funcion + " " + tablas + " set " + campos + condiciones;
        }else if(this.funcion.equals("delete")){
            consulta = this.funcion + " from " + tablas + condiciones;
        }else if(this.funcion.equals("select")){
            if(this.colTablas.size() > 0){
                consulta = "select " + campos + " from " + tablas + condiciones;
            }else{
                consulta = "select " + campos;
            }
        }else if(this.funcion.equals("insert_select")){
            if(this.colGroup.size() > 0){
                consulta = "insert into "+this.colTablas.get(0)+" select "+campos+ " from "+this.colTablas.get(1)+condiciones;
            }else{
                consulta = "insert into "+this.colTablas.get(0)+" select "+campos+ " from "+this.colTablas.get(1);
            }


        }else {
            consulta = this.funcion;
        }
        
        return consulta;
        
    }

    /**
     * Se usa para eliminar lo que tenga el objeto almacenado a fin de realizar una nueva consulta
     */
    public void resetConsulta()
    {
        this.colCampos.clear();
        this.colCondiciones.clear();
        this.colJoin.clear();
        this.colTablas.clear();
        this.colValues.clear();
        this.colGroup.clear();
        this.colOrderBy.clear();
        this.funcion = "";
    }
como se puede ejecutar todo esto ? puede ser algo como esto:

Código:
public static string actualizarEmpleado(double cedula,String centro,String cargo, double basico, String fecha){
        sql.resetConsulta();

        sql.setFuncion("update");
        sql.addTabla("empleados");

        sql.addCampo("seccionEmpleado = '"+centro+"'");
        sql.addCampo("cargoEmpleado = '"+cargo+"'");
        sql.addCampo("basicoMensualEmpleado ="+basico);
        sql.addCampo("fechaTerminoContratoEmpleado ='"+fecha+"'");
        sql.addCondicion("cedulaEmpleado = "+cedula);

        return sql.generar;
    }
Supongamos que el metodo actualizar empleado te retorna la consulta necesaria para realizar esa accion en la base de datos, asi seria la forma de armar la consulta de esa manera.


Saludos.