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.
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
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:
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.
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.