Consultas SQL dinámicas en Java

   Una de las pocas cosas que se hacen al momento de programar es optimizar las consultas, crear un método que devuelva el valor de la consulta es lo mas importante al momento de programar. Lo ideal es establecer la conexión con la base de datos, almacenarla en una variable para luego crear la conexión al momento de realizar la consulta, de esta manera podemos hacer miles de consultas utilizando solo un método.

   Por ejemplo, supongamos que queremos consultar (tomando como SGBD MySQL) la cantidad de registros en una tabla cualquiera, entonces tenemos algo como esto en nuestro código:
Class.forName("com.mysql.jdbc.Driver");
Connection conexion = DriverManager.getConnection ("jdbc:mysql://localhost/mi_bd","root", "mi_clave");
Statement stat = conexion.createStatement();
ResultSet resultado = stat.executeQuery ("SELECT * FROM mi_tabla");
while (resultado.next()) {
    System.out.println (resultado.getString("Mi_Campo"));
}
conexion.close();
   Y si queremos hacerlo en otra tabla ¿volvemos a hacer lo mismo?, vamos que no es la idea. Para ello hagamos unos pequeños cambios, creemos una clase llamada por ejemplo "clase_bd", a la cual accedemos solo si necesitamos almacenar, actualizar o consultar registros de nuestra base de datos. Para ello entonces declaramos la clase pública junto con sus métodos:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;

public class clase_bd {

    static Connection conn = null;
    static ResultSet consulta = null;

    public static void abrir_bd(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection("jdbc:mysql://servidor/bd", "usuario", "pass");
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Verifique que los parametros de conexión sean los correctos. n"+ex,"Error",JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        } catch (ClassNotFoundException ex) {
            JOptionPane.showMessageDialog(null, "No es posible inicializar el sistema: "+ex,"Error",JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        }
    }
 
    public static ResultSet consulta (String peticion){
        try {
            Statement stat = conn.createStatement();
            consulta = stat.executeQuery(peticion);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Error al realizar la consulta: "+ex,"Error",JOptionPane.ERROR_MESSAGE);
        } return consulta;
    }
    

    public static void registrar (String peticion){
        try {
            Statement stat = conn.createStatement();
            stat.executeUpdate(peticion);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Error al almacenar el registro: "+ex,"Error",JOptionPane.ERROR_MESSAGE);
        }
    }
}
   Lo que hacemos es simple, creamos un método de consulta, otro de registro y otro de conexión. Al de consulta se le envía por valor una cadena, la cual procesara y retornará el valor deseado; mientras que al de registro se le envía la cadena SQL y no devuelve ningún valor, solo ejecuta la sentencia y listo. Una vez que tenemos la clase construida, la llamamos en nuestro método principal para iniciar las variables de conexión:
public class programa {
    public static void main(String [] args){
            clase_bd.abrir_bd();
    }
}
   Entonces ya solo nos queda llamar al método de la clase para obtener los resultados deseados, por ejemplo, para consultar "X" campo de nuestra base de datos:
ResultSet consulta = clase_bd.consulta("SELECT campos FROM tabla");
while (consulta.next()){
    System.out.println(consulta.getString(1));
}
   Para almacenar un registro:
clase_bd.registrar("INSERT INTO tabla VALUES (valores)");
JOptionPane.showMessageDialog(null, "Registro Almacenado","Prueba...",JOptionPane.INFORMATION_MESSAGE);