Bienvenido(a), Visitante. Favor de ingresar o registrarse.
Diciembre 02, 2008, 01:43:34
Inicio Ayuda Buscar Ingresar Registrarse
Noticias: Foro de Java, C++ y más.

Empieza una nueva comunidad de programación: Oneble ... es lo que tu quieras que sea

+  Foros Java y C/Linux
|-+  Programación
| |-+  Java J2SE
| | |-+  Conexion a una base de datos y crear diferentes Statement
« anterior próximo »
Páginas: [1] Enviar tema Imprimir
Autor Tema: Conexion a una base de datos y crear diferentes Statement  (Leído 63 veces)
hipoter
Jr. Member
**
Mensajes: 56


hipoter@hotmail.com
Ver Perfil Email


« en: Agosto 27, 2008, 08:29:19 »

Hola a todos/as, como ya es la segunda aplicación que voy a desarrollar utilizando bases de datos, he pensado en como hacerlo mejor.

Sistema que funciona:
La clase conexión la estoy utilizando sólamente para conectar a la base de datos.
Código:
package Clases;

import javax.swing.*;
import java.sql.*;

public class Conexion {
   
    public static Connection conn;
    public static Statement st;
    public static ResultSet rs;
    Metodos m;
    Conexion c;
   
    public Conexion() {
        st = null;
        rs = null;
    }
   
     
    public void conecta() {
        m = new Metodos();
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            System.out.println("** Driver registrado correctamente. **");
            conn = DriverManager.getConnection("jdbc:mysql://" +m.Nodo("ip")+ ":"+m.Nodo("pr")+"/"+m.Nodo("bd")+"", m.Nodo("u"), m.Nodo("c"));
            System.out.println("** Conexión establecida con la Base de datos. **");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            JOptionPane.showMessageDialog(null, "Error al conectar en la base de datos.","TPV",JOptionPane.ERROR_MESSAGE);
        }
    }
    public void Desconecta() throws SQLException {
        conn.close();
        System.out.println("** Conexión cerrada en la Base de datos. **");
    }
/*
    public void Sentencia() throws SQLException {
        st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        System.out.println("Sentencia creada con exito.");
    }
    public void Consulta(String sql) throws SQLException {
        System.out.println(sql);
        rs = st.executeQuery(sql);
    }
   */
}


La clase métodos la utilizo para crear un stmt nuevo y para hacer un ResultSet

Código:
public class Metodos {
   
    public static Conexion c;
    public Statement st;
    public ResultSet rs;
   
    public Metodos(){
       
    }
   
    public Metodos(Conexion c){
        this.c = c;
    }

public void Sentencia() throws SQLException {
        st = c.conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        System.out.println("Sentencia creada con exito.");
    }
    public void Consulta(String sql) throws SQLException {
        System.out.println(sql);
        rs = st.executeQuery(sql);
    }

Lanzo el método conectar en la pantalla de logeo del programa y luego paso como parametro la instancia de Conexion a los jInternalFrames que voy a necesitar de la conexión, de este modo sólo utilizo una conexión para todo, o al menos eso es lo que creo.

De tal forma que cuando voy a hacer un formulario para ingresar registros, consultas y demas  en la base de datos, en el constructor de cada formulario hago lo siguiente:

Código:
public class Empresas extends javax.swing.JInternalFrame {
   
    static Metodos m;
    Conexion c;
    java.awt.GridBagConstraints gridBagConstraints;
   
    /** Creates new form Empresas */
    public Empresas(Conexion c) throws SQLException{
        initComponents();
        m = new Metodos(c);
        m.Sentencia();
        m.Consulta("select * from empresas");
        if (m.rs.first()){
            mostrar();
        }
        estado();
    }


De esta forma me hago un System.out.println(m.st) y en cada formulario que yo carge me tiene uno diferente. Sistema que funciona, pero en esta nueva aplicación estaba pensando en centralizar todo lo relacionado con la conexion en la misma clase Conexion, el problema que tengo es que los formularios me utilizan el último ResultSet que genera y tienen el mismo stmt, de manera que va a funcionar bién el último que lance en la aplicación. Esto, sucede cuando hago lo siguiente.

Código:
public class Empresas extends javax.swing.JInternalFrame {
   
    static Metodos m;
    Conexion c;
    java.awt.GridBagConstraints gridBagConstraints;
   
    /** Creates new form Empresas */
    public Empresas() throws SQLException{
        initComponents();
        c = new Conexion();
        c.Sentencia();
        c.Consulta("select * from empresas");
        if (c.rs.first()){
            mostrar();
        }
        estado();
    }

La idea que tenía era que, para no tener separado los métodos Sentencia(); y Consulta(sql); hacerlos en la misma clase, pero no se porque, cuando lo hago me usa el mismo stmt (el último creado), igual pasa con el ResultSet.

Mi problema es que no comprendo porque sucede esto.

Gracias. Salu2.
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #1 en: Agosto 27, 2008, 09:24:02 »

Hola:

Posiblmente el problema es que todos los atributos de todas las clases que muestras son "static", por lo que son compartidos por todas las instancias que hagas de las clases, es decir, hagas lo que hagas, sólo hay un Statement común para todas las instancias de esa clase.

Se bueno.
En línea

hipoter
Jr. Member
**
Mensajes: 56


hipoter@hotmail.com
Ver Perfil Email
« Respuesta #2 en: Agosto 27, 2008, 10:44:45 »

Pues tienes toda la razón, es porque era static, pero tengo dudas acerca del funcionamiento, de este tipo de cosas. Por ejmplo:

Cuando yo creo una instancia de una clase al no ser static no puedo usar nada sin que lo inicialice. Por eso he puesto en la clase conexión un constructor con el parámetro de la instancia de la misma clase para que capturar conn.

Código:
  public Conexion() {
        st = null;
        rs = null;
    }
   
    public Conexion(Conexion c){
        this.c = c;
    }



Luego desde los formularios llamo a:

Código:
  static Metodos m;
    Conexion c;
    java.awt.GridBagConstraints gridBagConstraints;
   
    /** Creates new form Usuarios */
    public Usuarios(Conexion c)  {
        try {
            initComponents();
            c = new Conexion(c);
            this.c = c;
            c.Sentencia();
            c.Consulta("select * from usuarios");
            if (c.rs.first()){
                mostrar();
            }
            estado();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

¿Es esto correcto?
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #3 en: Agosto 28, 2008, 09:01:28 »

Hola:

Efectivamente, es así. Un static no necesita instanciar la clase y es compartido por todas las instancias de la clase si las hay. Debe dejarse static para cosas que en toda la aplicación sólo haya una (por ejemplo, la constante PI, una Connection única en toda la aplicación a base de datos, etc). En cualquier caso, las buenas costumbres de programación aconsejan que sólo se usen sólo para constantes o para métodos de utilidad (por ejemplo, los de la clase Math que calculan sin(x), pow(), etc o los de la clase Integer valueOf() o toString()). Para los demás casos, puede usarse static, pero si no queda más remedio y pensándolo mucho, nunca debe ser la opción por defecto o usarlo por comodidad. Un atributo static es lo más parecido a una variable global en otros lenguajes y están desaconsejadas por claridad en el programa.

Teniendo eso en cuenta, deberías evitar el uso de static siempre que sea posible y ello te obliga, por supuesto, a instanciar la clase para poder usar sus métodos y atributos.

Se bueno.
En línea

hipoter
Jr. Member
**
Mensajes: 56


hipoter@hotmail.com
Ver Perfil Email
« Respuesta #4 en: Agosto 28, 2008, 10:35:43 »

Gracias por la clase.  Cheesy


Salu2
En línea
Páginas: [1] Enviar tema Imprimir 
« anterior próximo »
Ir a:  


Ingresar con nombre de usuario, contraseña y duración de la sesión

Powered by MySQL Powered by PHP Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC XHTML 1.0 válido! CSS válido!