Clase para conectar a una base de datos e interactuar con ella [JDBC] Mysql

Iniciado por Pablo Videla, 29 Julio 2009, 13:46 PM

0 Miembros y 1 Visitante están viendo este tema.

Pablo Videla

Clase creada para interactuar con una base de datos mysql , se requiere agregar la libreria de mysql... espero que a alguien le sirva , saludos.


Código (java) [Seleccionar]

/**
*
* @author BadDevil
* Para elhacker.net
*/
package BD;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class BD {
    private String user;
    private String password;
    private String url;
    private String driverClassName;
    private Connection conn = null;
    private Statement stmt;

    public BD(String user, String password, String url, String driverClassName) {
        this.user = user;
        this.password = password;
        this.url = url;
        this.driverClassName = driverClassName;
    }
    public BD()
    {
        this.user = "root";
        this.password="tupass";
        this.url = "jdbc:mysql://localhost/tu_basedatos";
        this.driverClassName = "com.mysql.jdbc.Driver"; // driver
    }
        public String getPassword() {
        return password;
    }

    public String getUrl() {
        return url;
    }

    public String getUser() {
        return user;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public Connection getConn() {
        return conn;
    }

    public void setConn(Connection conn) {
        this.conn = conn;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setUser(String user) throws SQLException {
        this.user = user;
    }

    public void conectar() throws SQLException {
        try {
            Class.forName(this.driverClassName).newInstance();
            this.conn = DriverManager.getConnection(this.url, this.user, this.password);

        } catch (Exception err) {
            System.out.println("Error " + err.getMessage());
        }
    }

    public ResultSet obtenerDatos(String sql) throws SQLException {

        this.stmt = conn.createStatement();
        return this.stmt.executeQuery(sql);
    }

    public void actualizar(String sql) throws SQLException {
        this.stmt = conn.createStatement();
        stmt.executeUpdate(sql);
    }
        public ResultSet ExeGet(String Q) throws SQLException{
        Statement st = this.conn.createStatement();
        return (ResultSet) st.executeQuery(Q);
    }
    public int Exe(String Q) throws SQLException{
        Statement st = this.conn.createStatement();
        return st.executeUpdate(Q);
    }
   
    public void Off() throws SQLException{
         this.conn.close();
    }

   
   
}

rigoxls

A mi me sirve, gracias, voy a ver si implementandola agilizo un poco las consultas, actualmente el metodo que uso me toma al rededor de 25 segundos para generar reportes, consultas etc...

gracias...
No hay verdades absolutas sin ciegas posiciones !!!

Pablo Videla

No hay problema, trata de usar una clase controladora que llame a los metodos desde una clase aparte ... asi tendras mas control de las consultas sql y se vera mas ordenado.

Anibal784

Hay un par de cosas que no me convencen.

¿para qué querría hacer un getPass()?,
en tu clase, tienes un setConn, el cual es medio ilógico, no terminás encapsulando nada, supongamos que seteo todo, el pass, el user, la url, etc. y luego en lugar de conectar hago un setConn con una conexión anterior que no se condicen con todos esos datos seteados antes.

¿qué pasa si hago un actualizar() sin antes haber hecho un conectar()?, explota porque conn va a estar en null y no se le puede enviar un mensaje a null.

Lo que puedes hacer para que quede mejor, desde mi punto de vista, es, cada vez que seteas un parámetro intentes de nuevo la conexión, por ejemplo, cambias el user, en ese mismo intentar conectarte de nuevo o por lo menos cerrar la conexión actual pues ya no es válida, ésta me parece la mejor opción, luego, cada vez que intentes una consulta, ver si se está conectado, si no se está probar conectarse y luego si se tiene éxito hacer la consulta, o bien lanzar la excepción de que no se está conectado o algo así.
El que llega sin que lo llamen, se va sin que lo echen.

Citar
Vos no la votaste por eso la tenes adentro.
Lo fino no es lo tuyo, y a mi me chupa un huevo, soy argentino y no peronista, y eso es lo que realmente te molesta.

Pablo Videla

Cita de: Anibal784 en 29 Julio 2009, 15:43 PM
Hay un par de cosas que no me convencen.

¿para qué querría hacer un getPass()?,
en tu clase, tienes un setConn, el cual es medio ilógico, no terminás encapsulando nada, supongamos que seteo todo, el pass, el user, la url, etc. y luego en lugar de conectar hago un setConn con una conexión anterior que no se condicen con todos esos datos seteados antes.

¿qué pasa si hago un actualizar() sin antes haber hecho un conectar()?, explota porque conn va a estar en null y no se le puede enviar un mensaje a null.

Lo que puedes hacer para que quede mejor, desde mi punto de vista, es, cada vez que seteas un parámetro intentes de nuevo la conexión, por ejemplo, cambias el user, en ese mismo intentar conectarte de nuevo o por lo menos cerrar la conexión actual pues ya no es válida, ésta me parece la mejor opción, luego, cada vez que intentes una consulta, ver si se está conectado, si no se está probar conectarse y luego si se tiene éxito hacer la consulta, o bien lanzar la excepción de que no se está conectado o algo así.

Asi es , tienes toda la razon cada vez que hay que usar un metodo hay que llamar al conectar , yo solo les dejo la clase , ustedes pueden hacer lo que quieran con ellla , esa es la idea  :P

Anibal784

es que entonces tu clase no me sirve de nada, carece de sentido, supongamos que hago un código algo así:
Código (java) [Seleccionar]

BD db = new BD("usuario", "pass", "url://noseque", "driver...");
db.obtenerDatos("consulta sql");

if(condicion){
    db.setUser("anibal");
    db.actualizar("otra consulta sql");
}


ahí cambié el usuario, o sea me conecto con otro usuario y por torpeza me olvidé de hacer conectar, ejecuto otra consulta, pero la segunda consulta se hará sobre la conexión anterior. Pongamos el ejemplo de que "usuario" únicamente puede leer, o sea no puede hacer actualizar, tonces me conecto con "anibal" para hacer esa actualización, ¿sabés lo difícil que va a ser encontrar el error?.
Está bien, dudo el por qué querría hacer algo así, pero tu clase lo permite, a eso voy, a que puedes mejorar la clase, abstrayendo más, si quieres obligar a que cada vez que se cambie el usuario se deba hacer un conectar, cierra la conexión anterior, carece de sentido mantenerla pues haz cambiado el usuario.
El que llega sin que lo llamen, se va sin que lo echen.

Citar
Vos no la votaste por eso la tenes adentro.
Lo fino no es lo tuyo, y a mi me chupa un huevo, soy argentino y no peronista, y eso es lo que realmente te molesta.

Pablo Videla

Es por eso que debes hacer un controlador , ahi lo dije , esta es una clase solo para conectar a la base datos y hacer consultas , debes hacer un controlador de la clase para manejarlo bien.... la clase si sirve , yo la uso .... hace tu propio controlador , yo tengo uno , solo publique la clase que conectara a la base de datos con metodos simple , alla tu que haces con ella.

Amerikano|Cls

Esta ya la habia hecho, pero muchas gracias por el aporte!!  :xD :xD




Mi blog:
http://amerikanocls.blogspot.com


Pablo Videla

Cita de: sapito169 en  1 Agosto 2009, 22:42 PM
esa clase ya existe y se llam rowset

La clase la cree yo , si fuera de otra persona colocaria los creditos , es una clase que hice en mi carrera